跳到主要内容

性能优化

TPS 掉了?先用 spark 找出主线程时间花在哪里,再用下面对应的开关处理。云世界的每个优化都只影响你指定的世界。

1. 关掉没用的自然生怪(效果最明显)​

RPG / 副本服的怪大多由 MythicMobs 刷怪点生成,原版的自然生怪其实用不到,却一直在跑。 我们在一个只有 1 位玩家的 RPG 副本服实测:主线程实际工作的时间里,超过一半花在原版自然生怪,而且几乎每次尝试都失败(地形特殊、找不到合法位置)。 这部分负担会随在线人数增加——每位玩家周围的区块都要检查一遍。

/cw spawning fu monster spawn false # 关闭怪物自然生成
/cw spawning fu animal spawn false # 关闭动物
/cw spawning fu monster default # 恢复

整类关闭且没有例外时,云世界会把这一类的生成上限设成 0,服务器连尝试都不做(只取消生成事件的插件,服务器仍会每 tick 尝试再被取消)。 MythicMobs 刷怪点、刷怪笼、刷怪蛋、繁殖不受影响。

其他用法:

/cw spawning world monster add creeper # 怪物照常生成,但不要苦力怕
/cw spawning world monster limit 30 # 怪物上限 30(服务器默认 70)
/cw spawning world animal tick-rate 800 # 动物每 800 tick 才尝试生成一次
/cw spawning world # 查看全部类别

类别:monster animal water_animal water_ambient water_underground_creature ambient axolotl。

夜魅、巡逻队、袭击、流浪商人​

这几种不是一般的自然生成,而是由各世界自己的游戏规则控制,可以只在某个世界关掉:

/cw gamerule fu doInsomnia false # 不再生成夜魅(幻翼)
/cw gamerule fu doPatrolSpawning false # 不再生成灾厄巡逻队
/cw gamerule fu disableRaids true # 不会触发袭击
/cw gamerule fu doTraderSpawning false # 不再出现流浪商人(与羊驼)

用 /cw gamerule 设定的值会存进 worlds.yml,重启后保持;其他世界不受影响。/cw gamerule fu 可以看到这个世界的全部规则(金色 = 由云世界固定的)。

2. 分世界视距​

大厅、副本不需要看很远:

/cw set lobby view-distance 6
/cw set fu simulation-distance 4 # 远处的区块不运作(红石、作物、生物)

视距影响发给玩家的区块数量(流量与客户端负担),模拟距离影响服务器要运算的区块数量(TPS)。

3. 没人自动卸载​

活动世界、建筑世界平常没人去,却一直占着内存与区块:

/cw set event auto-unload-minutes 10

没人超过 10 分钟就卸载;之后有人用指令、传送门、告示牌去这个世界时会自动加载。

4. 每区块实体上限​

刷怪塔、掉落物堆积造成卡顿时,定时清掉超出的部分(从存在最久的开始):

/cw entitycap world item 100 # 每区块最多 100 个掉落物
/cw entitycap world experience_orb 50
/cw entitycap world interval 60 # 每 60 秒检查
/cw entitycap world on

有名字、被驯服、骑乘中的实体不会被清。只会处理你列出的类型。

5. 预生成​

新世界开放前先把地图生成好,玩家跑图时就不会卡:

/cw pregen survival 5000 # 以出生点(或世界边界中心)为中心,半径 5000 格
/cw pregen status

区块全部异步生成;服务器每 tick 平均超过 config.yml 的 optimize.pregen-max-mspt(默认 40 ms)时自动暂停,人多时不会卡。 进度会存档,重启服务器后自动接着做。

6. 找出卡的地方​

/cw stats # 每 tick 耗时、TPS、各世界的区块 / 实体 / 方块实体
/cw stats fu # 这个世界最多的实体类型、最挤的 5 个区块(点击直接传送过去)
/cw purge fu items # 清掉掉落物(monsters / animals / items / all / 实体类型)
搭配 spark

在人最多的时候执行 spark profiler start --thread * --only-ticks-over 50 --timeout 600,只记录超过 50 ms 的卡顿 tick,最能看出真正的元凶。