跳转到主要内容

Minecraft 原版卡顿的来源与缓解

Minecraft的流畅运行,少不了我们每个人的努力。

Minecraft 原版卡顿的来源与缓解


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

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

  • 地狱门
    每次传输物品和实体(你也是实体)时,地狱门都会再次搜索 1600 万个方块找到对应的地狱门,从而造成卡顿
    地狱门只会缓存 15 秒的搜索结果,超过 15 秒后,地狱门会再次搜索。(? - 1.16.1)
    1.16.2 之后机制已改变,只要不是特别大的传送门,一般不会造成卡顿。

一般情况下无需进行优化。

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个漏斗的卡顿程度。

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

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