调研编号:
奇点实体落地后(inGround)的 onUpdate 每 tick 起一个 128 轮的循环,但循环体里没有任何东西随轮次变化:AxisAlignedBB 每轮都用 posX/posY/posZ ± this.radius 重新构造(radius 是字段、在循环外的 :183/:191 才被改),随后的两次 getEntitiesWithinAABB(Entity.class / EntityLivingBase.class, ent) 因此每轮返回完全相同的结果;循环内也没有 break/return。除此之外每轮还做:对同一批 l2 的 16 次幂等赋值(motion=(target-pos)/10,不改坐标)、以及 3 次 getBlock +(命中时)整段 breakBlock 破坏逻辑。
inGround
onUpdate
AxisAlignedBB
posX/posY/posZ ± this.radius
radius
:183/:191
getEntitiesWithinAABB(Entity.class / EntityLivingBase.class, ent)
break
return
l2
motion=(target-pos)/10
getBlock
breakBlock
PERF
type/perf
p2
:95-107
spawnEntityInWorld(new EntitySingularity)
TDLM/thaumicadditions
origin/main
cded7cd3ee59
src/main/java/com/pengu/thaumcraft/additions/entity/EntitySingularity.java:70-149
:22
// EntitySingularity.java:70-96 每 tick 起 128 轮循环,每轮重建同一个 AABB 并跑同一对实体查询 for(p = 0; p < 128; ++p) { AxisAlignedBB ent = AxisAlignedBB.getBoundingBox(this.posX - (double)this.radius, this.posY - (double)this.radius, this.posZ - (double)this.radius, this.posX + (double)this.radius, this.posY + (double)this.radius, this.posZ + (double)this.radius); l = this.worldObj.getEntitiesWithinAABB(Entity.class, ent); l2 = this.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, ent); // EntitySingularity.java:112-128 每轮再对同一批 l2 做 16 次幂等赋值(motion = (target - pos)/10,位置不改) for(i = 0; i < 16; ++i) { for(var22 = 0; var22 < l2.size(); ++var22) { ... motionX1 = this.posX - rz; ((EntityLivingBase)l2.get(var22)).motionX = motionX1 / 10.0D; ... // EntitySingularity.java:144-149 每轮再取 6 次随机数与方块 i = (int)this.posX + this.worldObj.rand.nextInt(this.radius) - this.worldObj.rand.nextInt(this.radius); var22 = (int)this.posY + this.worldObj.rand.nextInt(this.radius) - this.worldObj.rand.nextInt(this.radius); var23 = (int)this.posZ + this.worldObj.rand.nextInt(this.radius) - this.worldObj.rand.nextInt(this.radius); if(this.worldObj.getBlock(i, var22, var23) != Blocks.air && this.worldObj.getBlock(i, var22, var23).getBlockHardness(...) > -1.0F && ... ) { this.worldObj.getBlock(i, var22, var23).breakBlock(...);
getEntitiesWithinAABB
motion
inGround=true
:144-149
thaumicadditions
client,server
src/main/java/com/pengu/thaumcraft/additions/entity/EntitySingularity.java:70-96
:112-141
U1 每拍全扫
F4 帧内不变量重复求值
T3 同拍雷群
红队复核(2026-11-04,补充乘数路径):自我增殖会真的把 256 次/tick 复制出去。
// EntitySingularity.java:99-105 吃掉 Alumentum 时生成的「新奇点」直接进 inGround ((EntityAlumentum)l.get(i)).setDead(); EntitySingularity var24 = new EntitySingularity(this.worldObj); var24.posX = ry; var24.posY = ey; var24.posZ = ez; var24.inGround = true; // ← :104 this.worldObj.spawnEntityInWorld(var24); // EntitySingularity.java:40 而 inGround 正是那 128 轮循环的入口 if(this.inGround) {
⇒ 新奇点在下一 tick 就进入同一个 128 轮循环,所以「场上 N 只奇点 ⇒ N×256 次 AABB 查询/tick」的乘数成立;且这个增殖是自持的(每吃一个 Alumentum 多一只)。
关闭,不改:EntitySingularity(:70-149)提升查询会改变玩法:明矾转化也在 128 轮循环内,提升会改变爆炸与生成奇点的次数;该实体稀少且属终局内容。
EntitySingularity
No dependencies set.
The note is not visible to the blocked user.
调研编号:
现象
奇点实体落地后(
inGround)的onUpdate每 tick 起一个 128 轮的循环,但循环体里没有任何东西随轮次变化:AxisAlignedBB每轮都用posX/posY/posZ ± this.radius重新构造(radius是字段、在循环外的:183/:191才被改),随后的两次getEntitiesWithinAABB(Entity.class / EntityLivingBase.class, ent)因此每轮返回完全相同的结果;循环内也没有break/return。除此之外每轮还做:对同一批l2的 16 次幂等赋值(motion=(target-pos)/10,不改坐标)、以及 3 次getBlock+(命中时)整段breakBlock破坏逻辑。危害类与优先级
PERF(每拍全扫 + 同参数重复求值 + 无局部承接)→ 标签type/perfp2每 tick 每只奇点固定 256 次 AABB 实体查询、128×16 次幂等向量赋值、~128×3 次取块;而奇点会自我增殖(:95-107吃 Alumentum 会spawnEntityInWorld(new EntitySingularity)),乘数还会继续变大证据(生效源码)
TDLM/thaumicadditions+ 分支origin/main+ pincded7cd3ee59(source 类仓,无 patch 层,代码可点开)src/main/java/com/pengu/thaumcraft/additions/entity/EntitySingularity.java:70-149;radius定义:22、仅在循环外:183/:191修改getEntitiesWithinAABB256 次(=128 轮 ×2,全部同参)、motion赋值 128×16=2048 次(幂等)、getBlock至少 384 次;其中 256 次实体查询与 2048 次赋值在语义上可压缩到 1 次(查询)与 1 次(赋值)触发与复现
inGround=true)即每 tick 执行;默认配置可达、无需权限。:144-149的随机点破坏(每轮确实取新随机坐标),它与实体查询无关,可独立保留。thaumicadditions/sidesclient,server/默认配置可达 是落点
TDLM/thaumicadditions→src/main/java/com/pengu/thaumcraft/additions/entity/EntitySingularity.java:70-96(AABB 与两次实体查询)、:112-141(16 次幂等赋值)范式
U1 每拍全扫(每 tick 对固定半径做重复实体扫描)F4 帧内不变量重复求值(同参查询无局部承接)、T3 同拍雷群(增殖后多只奇点同拍同范围扫描)引证
来源
src/main/java/com/pengu/thaumcraft/additions/entity/EntitySingularity.java:70-149红队复核(2026-11-04,补充乘数路径):自我增殖会真的把 256 次/tick 复制出去。
⇒ 新奇点在下一 tick 就进入同一个 128 轮循环,所以「场上 N 只奇点 ⇒ N×256 次 AABB 查询/tick」的乘数成立;且这个增殖是自持的(每吃一个 Alumentum 多一只)。
关闭,不改:
EntitySingularity(:70-149)提升查询会改变玩法:明矾转化也在 128 轮循环内,提升会改变爆炸与生成奇点的次数;该实体稀少且属终局内容。