自己开的服,1.20.1 Forge,装了大概 80 个模组。人少的时候(5 人以下)TPS 稳稳 20,一旦到 18 人以上就开始掉,20 人的时候只剩 12 左右,走路都在卡。
机器配置是 E5-2680v4 + 32G,给了服务端 12G 堆内存。已经试过这些:
- 把视距从 10 降到 6,没有明显改善
- 关掉所有实体密集的农场(刷怪塔、村民交易所),TPS 回到 15 左右,但还是不到 20
- 换过 spark 采样,
/spark profiler --timeout 60
spark 报告里最上面几行长这样,我看不太懂哪些是模组自己的开销:
tickEntity占 41.2% ·EntityTickList.forEach占 33.8%
ServerLevel.tickChunk占 18.4% ·POIUpdate占 6.2%
我想确认的两件事
第一,tickEntity 占这么高,是原版实体本身多,还是某个模组加的实体没做优化?我装了 Alex's Mobs 和 Ice and Fire,这两个都有大量自定义 AI。
第二,POIUpdate 这 6.2% 是不是村民相关的?如果是,把村民全部关进一个区块里集中处理会不会好一点?
报告原始链接放在下面了,需要的话我可以再跑一次更长时间的采样。
先回答你第二个问题:不是村民。
POIUpdate的原版开销跟村民数量关系不大,它扫的是所有带兴趣点的方块(工作台、床、蜂巢),模组加的工作台也算。你装了 80 个模组,里面大概率有一批加了自定义 POI 的,这个数反而正常。真正的问题在
tickEntity。 41% 这个数在原版 20 人服大概只有 12–15%。Alex's Mobs 和 Ice and Fire 的 AI 是逐 tick 跑的,而且它们的 entity ticking 不走原版的限流逻辑。你可以用/spark profiler --only-ticks-over 100再采一次,把 tickEntity 展开到方法级,看EntityAIBase.tick下面挂的是哪个包的类名。如果确认是这两个模组,有个成本最低的做法:在
forge-common.toml里把它们的 spawn 权重调低,或者直接用EntitySpawnPlacementRegistry限制生成高度。不需要卸载模组,已经生成的实体不会消失,但新生成的会少很多。另外 12G 堆对 80 模组来说偏紧,GC 停顿本身就会吃掉几个 TPS。降到 8G 反而可能更好,因为堆越大 Full GC 单次停顿越长。