// TileTankBasic.java:27,31,35,39 四条 if 各自把同三个查询重算一遍(无局部承接、无节流门)if(!(this.worldObj.getBlock(this.xCoord,this.yCoord+1,this.zCoord)instanceofBlockTankBasic)&&!(this.worldObj.getBlock(this.xCoord,this.yCoord-1,this.zCoord)instanceofBlockTankBasic)&&this.worldObj.getBlockMetadata(this.xCoord,this.yCoord,this.zCoord)!=0){if(!(this.worldObj.getBlock(this.xCoord,this.yCoord+1,this.zCoord)instanceofBlockTankBasic)&&this.worldObj.getBlock(this.xCoord,this.yCoord-1,this.zCoord)instanceofBlockTankBasic&&this.worldObj.getBlockMetadata(this.xCoord,this.yCoord,this.zCoord)!=1){if(this.worldObj.getBlock(this.xCoord,this.yCoord+1,this.zCoord)instanceofBlockTankBasic&&!(this.worldObj.getBlock(this.xCoord,this.yCoord-1,this.zCoord)instanceofBlockTankBasic)&&this.worldObj.getBlockMetadata(this.xCoord,this.yCoord,this.zCoord)!=2){if(this.worldObj.getBlock(this.xCoord,this.yCoord+1,this.zCoord)instanceofBlockTankBasic&&this.worldObj.getBlock(this.xCoord,this.yCoord-1,this.zCoord)instanceofBlockTankBasic&&this.worldObj.getBlockMetadata(this.xCoord,this.yCoord,this.zCoord)!=3){// TileTankBasic.java:53,56 同坐标 TE 查两次booleanvar4=this.worldObj.getTileEntity(this.xCoord,this.yCoord+1,this.zCoord)instanceofTileTankBasic&&this.vis+this.taint<this.capacity;...this.ejectVis(var5,((ITubable)this.worldObj.getTileEntity(this.xCoord,this.yCoord+1,this.zCoord)).acceptVis(...),ForgeDirection.UP);// TileTankBasic.java:59-60 同坐标 TE 查两次if(this.worldObj.getTileEntity(this.xCoord,this.yCoord-1,this.zCoord)instanceofTileTankBasic){TileTankBasicvar6=(TileTankBasic)this.worldObj.getTileEntity(this.xCoord,this.yCoord-1,this.zCoord);
Reopened by the closure re-check: part of this was fixed since (crops/singularity/tank meta), but TileTankBasic.updateEntity still read the neighbour tiles up to 3x/2x per tick. Lossless fix with an old-vs-new equivalence test: TDLM/thaumicadditions PR #32 (not merged yet).
Reopened by the closure re-check: part of this was fixed since (crops/singularity/tank meta), but TileTankBasic.updateEntity still read the neighbour tiles up to 3x/2x per tick. Lossless fix with an old-vs-new equivalence test: TDLM/thaumicadditions PR #32 (not merged yet).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
调研编号:
现象
储罐方块的
updateEntity每 tick 为了决定自身方块元数据(0/1/2/3 = 无邻/仅下/仅上/上下都有),把同三个坐标的查询重算了四遍;下/下下两处 TE 也各查两次。全过程没有局部变量承接,也没有任何节流门(无% N、无 worldTime 判断)——每个储罐方块每 tick 固定产生 16 次方块/方块实体查询,其中 12 次是重复的。同族的老版强化储罐TileOldReinforcedTank是同一份代码的复制,同样 12 次重复。危害类与优先级
PERF(每 tick 同参数重复求值、无局部承接)→ 标签type/perfp3单次getBlock/getTileEntity开销小,但乘数是「每 tick × 每个储罐方块」;储罐塔常见(一列 5–20 格),且这是纯机械改动、行为完全不变证据(生效源码)
TDLM/thaumicadditions+ 分支origin/main+ pincded7cd3ee59(source 类仓,无 patch 层,代码可点开)src/main/java/com/pengu/thaumcraft/additions/tileentity/TileTankBasic.java:27-60、src/main/java/com/pengu/thaumcraft/additions/piping/old/tile/TileOldReinforcedTank.java:17-40getBlock(y+1)×4、getBlock(y-1)×4、getBlockMetadata(x,y,z)×4、getTileEntity(y+1)×2、getTileEntity(y-1)×2 ⇒ 16 次查询里 12 次重复触发与复现
above = world.getBlock(x, y+1, z)、below = world.getBlock(x, y-1, z)、meta = getBlockMetadata(x,y,z)、aboveTe、belowTe各取一次后复用,查询数降到 4 次/方块/tick,且元数据判定结果逐条相同。thaumicadditions/sidesclient,server/默认配置可达 是落点
TDLM/thaumicadditions→src/main/java/com/pengu/thaumcraft/additions/tileentity/TileTankBasic.java:27-40(四条 if 的重复取块)、:53-60(重复取 TE)src/main/java/com/pengu/thaumcraft/additions/piping/old/tile/TileOldReinforcedTank.java:17-40是同一份代码的复制,需同步改(只改一处等于没改)范式
F4 帧内不变量重复求值(同一调用内同参数查询重复 ≥2 次且无局部承接;此处是每 tick,非每帧)引证
来源
src/main/java/com/pengu/thaumcraft/additions/tileentity/TileTankBasic.java:27-60、src/main/java/com/pengu/thaumcraft/additions/piping/old/tile/TileOldReinforcedTank.java:17-40关闭,不改:
TileTankBasic每台每 tick 16 次区块查询,但开销很低且不在任何热点 profile 里;改写反编译的储罐代码没有实测收益。Reopened by the closure re-check: part of this was fixed since (crops/singularity/tank meta), but TileTankBasic.updateEntity still read the neighbour tiles up to 3x/2x per tick. Lossless fix with an old-vs-new equivalence test: TDLM/thaumicadditions PR #32 (not merged yet).