跳到主要内容

Minecraft:服务器性能优化

本指南是针对以下产品创建的:

(不同供应商的产品可能会有所不同,但主要概念保持不变)

优化过程中到底发生了什么?

优化是 Minecraft 服务器运行流畅的关键,尤其是公共服务器,绝对要花足够的时间来调试。只有经过大量时间和测试,才能达到最佳效果。因此,这份文档并非必须严格遵循,而是作为一个指引,帮你朝着正确方向前进。

大多数情况下,优化会修改服务器上的大量设置,有时会显著改变服务器本身的行为。其中一些设置会被调低,从而减轻服务器负担,提升性能。但为了不影响整体游戏体验,建议始终找到一个平衡点。

原版(Vanilla)

原版服务器的优化选项非常有限,因为可调节的设置不多。我们尝试通过以下措施给原版服务器“加点马力”:

可视范围

最常见的优化措施是缩小视距。默认视距是 10 区块,但很多玩家会设置更低,比如 6-8 区块。有些玩家设置过高,比如 32 区块,这意味着服务器必须加载并处理所有这些区块,性能消耗非常大。

在原版服务器中,可视范围可以在 "server.properties" 配置文件中调整,修改 "view-distance" 的值。为了不影响游戏体验,建议设置为 5-6,这样可以减轻服务器负担高达 50%。我们已有相关文档,详见这里

数据压缩

服务器和连接的玩家之间会持续交换数据。玩家的移动会传给服务器,服务器再广播给其他玩家。玩家动作或世界事件(比如爆炸)也会反复传输。

为了让数据交换更高效,可以加大数据压缩阈值,这样服务器处理相同数据的工作量只需之前的 50%。在 "server.properties" 中调整 "network-compression-threshold" 值为 512 即可。相关文档也在这里

Forge

和原版类似,服务器本身可调节的选项有限,配置文件很小。但可以安装额外的 Mod,借此减轻服务器负担。

预加载区块

减轻服务器负担的一个方法是预加载区块。服务器后续运行时只需加载已保存的区块数据,而不必重新生成。这个过程最好在晚上启动,留整晚运行。

需要安装一个额外的 Mod,推荐这个:Chunk Pregenerator。安装方式请参考我们的教程。

重启服务器前,确保 "server.properties" 中的 "max-tick-time" 设置为 "-1",否则服务器可能崩溃。建议至少有 8-10 GB RAM,因为这个过程非常吃内存。可以临时升级内存,完成后再降回去。

信息

注意,上述 Mod 可能不兼容你使用的 Forge 版本,且如果使用其他 Mod,流程可能有所不同。

启动带有该 Mod 的服务器后,打开控制台。建议为世界设置一个半径 16000 区块的边界,命令如下:

  • worldborder center 0 0
  • worldborder set 16000
信息

如果需要,请用你世界的中心坐标替换上面的 0 0,避免“切断”已建造的区域。

设置边界后,开始预加载:

  • pregen gen startWorldBorder

服务器会依次预加载边界内的所有区块。根据安装的 Mod 数量,这个过程可能长达 8 小时。进度会定期在控制台显示,完成时也会提示!

信息

预加载完成后,Mod 仍可保留在服务器上,运行时会继续优化区块,即使没有玩家在线也会生效。

可视范围

同原版,建议将 "server.properties" 中的 "view-distance" 设置为 5-6,减轻服务器负担约 50%。相关文档见这里

数据压缩

同原版,调整 "network-compression-threshold" 为 512,详见这里

Bukkit

可视范围

同上,调整 "server.properties" 中的 "view-distance" 为 5-6,减轻服务器负担约 50%。详见这里

数据压缩

同上,调整 "network-compression-threshold" 为 512,详见这里

生成限制(Spawn-Limits)

这一步会稍微降低服务器上怪物的生成率,几乎不会影响游戏体验。但在某些地方,比如怪物农场,可能会影响其正常运作。

编辑 "bukkit.yml" 配置文件,调整 "spawn-limits" 下的值:

  • monsters: 50 #默认: 70
  • animals: 10 #默认: 15
  • water-animals: 3 #默认: 5
  • ambient: 4 #默认: 15
信息

你当然可以根据需要自行调整这些数值,上述是一个很好的平均值。

为了进一步优化生成,建议调整 "bukkit.yml" 中 "ticks-per" 下的 "monster-spawns":

  • monster-spawns: 2 #默认: 1

如果怪物生成存在普遍问题(可通过 timing 报告判断),该值可调至 5。建议每调一个值都观察服务器表现,找到最适合自己服务器的设置。

区块处理(Chunk-Processing)

Minecraft 使用区块(chunk)机制,一个区块由 16x16 个方块组成,客户端通过区块来渲染世界。服务器只处理区块,并加载所需区块到内存。加载和持续处理的区块越多,服务器负担越重,可能导致性能瓶颈。

默认设置下,服务器不会卸载已加载的区块,导致内存占用过高,性能下降。

为确保服务器只加载当前需要的区块,调整 "bukkit.yml" 中 "chunk-gc" 的设置:

  • period-in-ticks: 300 #默认: 600
  • load-threshold: 300 #默认: 0

"period-in-ticks" 决定区块卸载的时间间隔(单位为刻)。可适当缩短,但要注意避免出现“循环加载”问题:

区块被卸载后不久又被需要,服务器不得不重新加载,反复循环会比区块多留一分钟更耗性能。

Spigot

可视范围

同上,调整 "spigot.yml" 中的 "view-distance" 为 5-6,减轻服务器负担约 50%。

信息

根据需求,也可以设置为 4,特别是运行 1.13+ 版本的农场世界服务器时,能有效减少卡顿。

数据压缩

同上,调整 "server.properties" 中的 "network-compression-threshold" 为 512,详见这里

生成限制(Spawn-Limits)

同 Bukkit,调整 "bukkit.yml" 中的生成限制,建议值:

  • monsters: 50
  • animals: 10
  • water-animals: 3
  • ambient: 4

调整 "monster-spawns" 为 2,必要时可调至 5,观察服务器表现。

区块处理(Chunk-Processing)

同 Bukkit,调整 "bukkit.yml" 中 "chunk-gc":

  • period-in-ticks: 300
  • load-threshold: 300

避免循环加载。

生成范围(Spawn-Range)

怪物生成距离玩家的范围,适当调低避免生成过多怪物,减少服务器压力。

在 "spigot.yml" 的 "world-settings" 中调整:

  • mob-spawn-range: 3 #默认: 4

实体激活范围(Entity-Ranges)

设置实体(动物和怪物)激活的距离,激活后实体可以移动或识别玩家。激活范围越大,服务器负担越重。

在 "spigot.yml" 中 "entity-activation-range" 调整为:

  • animals: 6 #默认: 32
  • monsters: 16 #默认: 32
  • misc: 2 #默认: 16
  • water: 6 #默认: 6
  • tick-inactive-villagers: true #默认: true

漏斗优化(Funnel-Optimizations)

漏斗(Hopper)是 Minecraft 中重要的物品传输装置,但对服务器压力很大。服务器每秒要检查 20 次漏斗是否有物品可拾取,物品在漏斗或箱子间移动也消耗性能。

通过延长检查间隔至 3 秒,可以显著减轻服务器负担,但可能导致红石时钟失效。

在 "spigot.yml" 中调整:

  • hopper-transfer: 24 #默认: 8
  • hopper-check: 24 #默认: 8
  • hopper-amount: 3 #默认: 1

碰撞(Collisions)

1.9 版本后引入实体碰撞,防止玩家重叠。这里调整实体碰撞次数,尤其是怪物农场中大量实体聚集时,能减轻服务器压力。

在 "spigot.yml" 中设置:

  • max-entity-collisions: 1 #默认: 8

碰撞设置不影响玩家,仅针对怪物。

合并半径(Merge-Radius)

合并半径决定物品和经验球的合并范围,合并后服务器处理的实体数量减少,提升性能。

在 "spigot.yml" 中 "merge-radius" 调整为:

  • item: 4.0 #默认: 2.5
  • exp: 6.0 #默认: 3.0
信息

数值不建议超过 8,避免出现新的卡顿。

Paper Spigot

可视范围

同 Spigot,调整 "spigot.yml" 中 "view-distance" 为 5-6,减轻服务器负担约 50%。

信息

根据需求,也可设置为 4,特别适合 1.13+ 版本的农场世界服务器,能有效减少卡顿。

数据压缩

同上,调整 "server.properties" 中 "network-compression-threshold" 为 512,详见这里

生成限制(Spawn-Limits)

同 Bukkit,调整 "bukkit.yml" 中生成限制:

  • monsters: 50
  • animals: 10
  • water-animals: 3
  • ambient: 4

调整 "monster-spawns" 为 2,必要时可调至 5。

区块处理(Chunk-Processing)

同 Bukkit,调整 "bukkit.yml" 中 "chunk-gc":

  • period-in-ticks: 300
  • load-threshold: 300

避免循环加载。

生成范围(Spawn-Range)

调整 "spigot.yml" 中 "world-settings":

  • mob-spawn-range: 3

怪物刷怪笼(Mob-Spawner)

城市建造服务器常用大量刷怪笼,可能导致服务器压力大。

调整 "paper.yml" 中刷怪笼激活频率:

  • mob-spawner-tick-rate: 3 #默认: 1
信息

此设置不会显著改变游戏体验。

实体激活范围(Entity-Ranges)

同 Spigot,调整 "spigot.yml" 中:

  • animals: 6
  • monsters: 16
  • misc: 2
  • water: 6
  • tick-inactive-villagers: true

漏斗优化(Funnel-Optimization)

同 Spigot,调整 "spigot.yml" 中:

  • hopper-transfer: 24
  • hopper-check: 24
  • hopper-amount: 3
信息

确保 "paper.yml" 中 "use-hopper-check" 设置为 "true"!

碰撞(Collisions)

同 Spigot,调整 "spigot.yml":

  • max-entity-collisions: 1

合并半径(Merge-Radius)

同 Spigot,调整 "spigot.yml" 中:

  • item: 4.0
  • exp: 6.0
信息

数值不建议超过 8,避免卡顿。

爆炸优化(Explosions)

Paper Spigot 重写了爆炸处理,减少服务器卡顿。

调整 "paper.yml":

  • optimize-explosions: true #默认: false

箱子优化(Chests)

猫坐在箱子上会阻止打开,服务器每次打开箱子都要检测附近是否有猫,消耗性能。

关闭此检测:

  • disable-chest-cat-detection: true #默认: false

背包更新(Inventories)

背包(包括箱子、工作台等)更新频率影响性能。

调整 "paper.yml":

  • container-update-tick-rate: 3 #默认: 1
信息

不建议超过 5,避免背包出现问题。比如生存游戏模式中,建议保持为 1。

光照更新(Light-Updates)

Paper Spigot 支持异步光照更新,避免卡顿。

调整 "paper.yml":

  • queue-light-updates: true #默认: false

区块数据保存(Saving Chunk Data)

区块数据改动先存入内存,定期写入硬盘。写入过多会导致卡顿。

限制每次保存的区块数,减少卡顿,但会增加内存占用。

调整 "paper.yml":

  • max-auto-save-chunks-per-tick: 10 #默认: 24

红石优化(Redstone)

红石电路复杂时会导致严重卡顿。Paper Spigot 提供更高效的红石处理,功能与原版一致。

调整 "paper.yml":

  • use-faster-eigencraft-redstone: true #默认: false
信息

注意!某些情况下可能会显著改变红石行为!