原版卡顿的来源与缓解

原版卡顿的来源与缓解


Minecraft 卡顿有 2 种来源,客户端卡顿(FPS)与服务端卡顿(TPS)[这里忽略网络]。
*文章中并未列举出所有卡顿来源

A.仅影响客户端的卡顿来源
  • 实体与实体渲染的方块
    任何大量的实体和实体渲染的方块都会导致 FPS 下降。
    如:怪物,大量的箱子,栅栏,潜影盒。
    缓解方法:不要堆叠过量的这些方块。
  • 粒子效果
    任何大量的粒子效果都会导致 FPS下降。
    如:下雨,TNT爆炸,火焰。
    缓解方法:关闭粒子效果。

B.仅影响服务端的卡顿来源
  • 漏斗
    漏斗具有吸入和传递功能,它每 GameTick 都会更新一次,每 4 GameTick传送一次物品。

根据 ExperimentalIdea 的测试,我们得到了以下数据,测试基于 1.14.4

漏斗上面的方块/状态 使用的MSPT(越低越好)
大箱子 66
普通方块 62.8
空气(什么都不放) 62.6
小箱子 36.5
潜影盒 35.9
32.5
锁住的漏斗(红石充能) 24.3

酿造台

23.5
高炉 23.2
烟熏炉 23
熔炉

22.6

投掷器 22.3
堆肥桶 15.5
红石块(会锁住漏斗) 4.8

可以看到,漏斗上方什么都没有是非常卡顿的,如果你不需要漏斗的吸入物品功能,请在上方放上堆肥桶
如果你想输入物品,可以放上投掷器,把物品放在投掷器中。并尽量少使用大箱子配合漏斗。
还有一个情况就是,如果漏斗指向了一个放满的容器,那么甚至可能会比20个漏斗更卡顿。
向下传输物品可以使用 漏斗→投掷器→漏斗 的方式。
请尽量少使用漏斗矿车,一个漏斗矿车≈60个漏斗的卡顿程度。

横向传递物品:

根据 ExperimentalIdea 的测试,我们得到了以下数据,测试基于 1.15.2

传递物品方式 传输物品时的MSPT(越低越好) 未传输物品时的MSPT(越低越好)
每 8 Tick 触发一次的纯投掷器链
(使用观察者触发)
43.5 35.2

每 12 Tick 触发一次的纯投掷器链
(使用观察者触发)

30.5 24.3
每 16 Tick 触发一次的纯投掷器链
(使用观察者触发)
22.8 18.2
每 24 Tick 触发一次的纯投掷器链
(使用观察者触发)
14.9 11.5
每 32 Tick 触发一次的纯投掷器链
(使用观察者触发)
10.6 8.5
纯漏斗链(上方放置堆肥桶) 9 11.4
每 64 Tick 触发一次的纯投掷器链
(使用观察者触发)
5.2 4.3

传递物品最好使用水流,和气泡柱。
如果要使用漏斗那么最好在上面放置堆肥桶。
如果要使用投掷器链,那么请不要使用太高频率的触发。

 

  • 红石粉
    红石粉强度变化时,会引起周围大量的方块更新,从而造成卡顿。
    在较早版本中, 3 格红石线在信号 0→15 时会引起 144 次更新, 在信号 15→0 时甚至能引起 1782 次更新。
    在最近版本中,1 格红石粉在信号 0→15 时会引起 42 次更新, 在信号 15→0 时甚至能引起 630 次更新。
    在最近版本中,1 格充能铁轨信号改变时会引起 12 次方块更新,1 个中继器在信号改变时会引起 24 次更新。

根据  黑の秋风 的测试,我们得到了一下数据,测试基于 1.14.4
注意:由于 MC-182868 这个 BUG 在1.14.4 - 1.16.1 版本中有可能铁轨比红石线卡顿

测试项目 MSPT(越低越好)
每 8 Tick 更新一次两格相邻的红石线,红石线信号强度为 1 - 2 75
每 8 Tick 更新一次两格相邻的红石线,红石线信号强度为 14-15 239
每 8 Tick 更新一次单格红石线,红石线信号强度为 1 94
每 8 Tick 更新一次单格红石线,红石线信号强度为 15 97
平面信号传递距离 红石线和观察者MSPT
(越低越好)
充能铁轨和观察者MSPT
(越低越好)
9 51 46
8 46 40
7 42 35
6 37 29
5 33 23
4 27 18
3 21 13
2 14 9
1 4 4
斜向45度上升信号传递距离

红石线和实体方块和观察者MSPT
(越低越好)

红石线和上半砖和观察者MSPT
(越低越好)

充能铁轨和实体方块和观察者MSPT
(越低越好)
充能铁轨和上半砖和观察者MSPT
(越低越好)
9 113 30 190 175
8 100 28 156 152
7 93 24 131 138
6 83 22 113 117
5 74 19 93 93
4 63 16 74 70
3 45 14 50 49
2 32 8 30 31
1 7 6 15 15

传递红石信号时,红石信号强度越低卡顿越低(不变化时不卡顿)。
平面传递红石信号时,可以全都替换为充能铁轨+观察者的组合。
斜向传递红石信号时,如果不需要双向信号,可以使用上半砖。如果需要双向信号传递,则不需要替换

 

  • 地狱门
    每次传输物品和实体(你也是实体)时,地狱门都会再次搜索对应的地狱门,从而造成卡顿
    地狱门会缓存 15 秒的搜索结果,超过 15 秒后,地狱门会再次搜索。

一般情况下无需进行优化

 

C.同时影响服务端和客户端的卡顿来源
  • 光照
    在白天的时候,会从 255 → 有方块那一层 逐层检测,然后在第一个方块打上 15 级的光照。
    但仅仅会更新一次。

    根据  10935336 的测试,我们得到了一下数据,测试基于 1.16.3
测试项目 MSPT(越低越好)
在 255 层填充 160000 个不透明方块 170
删除在 255 层填充的 160000 个不透明方块 1300
在 0 层 填充 160000 个不透明方块 165
删除在 0 层填充的 160000 个不透明方块 168

通常情况下无需优化,建造飞行器时和地表活塞设施时,可以在机械上方铺一层不透明方块。
因为被活塞推动时,运动中的方块会变成 36 号方块,而 36 号方块是透明方块,这样会造成光照更新。

  • 其他红石元件
    活塞等运动红石元件同时也会在客户端进行运算。

通常情况下无需优化,建造飞行器时和地表活塞设施时,可以在机械上方铺一层不透明方块。
因为被活塞推动时,运动中的方块会变成 36 号方块,而 36 号方块是透明方块,这样会造成光照更新。

  • TNT
    TNT激活后会变为实体并产生大量粒子,导致客户端卡顿。
    TNT爆炸时会计算 1352 条射线,经过一些计算后,射线穿过的地方都会被破坏,需要大量计算,导致服务端卡顿。

通常情况下无需优化

  • 漏斗矿车
    漏斗矿车会吸收比自身稍微大一点范围的方块,且传输速度比漏斗快,导致服务端卡顿。
    漏斗矿车是实体。

请尽量少使用漏斗矿车,一个漏斗矿车≈60个漏斗的卡顿程度。

  • 实体
    实体碰撞需要大量的计算,同时卡客户端与服务端。

不要堆叠实体(相互碰撞),例如矿车,家畜,怪物,掉落物。
不要使用矿车积压方式做刷怪塔。
做牧场请保证有足够的空间,不要牛挤牛,羊挤羊。