Skip to content

MC服务器性能优化

在开始优化你的服务器之前,你应该了解一些 MC 的性能指标。

MC 服务器中存在一些性能指标,保证这些指标在正常的范围内,可以让你的玩家在服务器中得到流畅的体验。

推荐在服务器上安装 TabTps 插件来方便观察服务器的一些性能指标。

tps 为每秒进行的游戏刻数量,正常游戏中,每秒游戏会进行20刻,如果服务器卡顿,tps会显著下降,只要你的服务器没有过载,tps 应保持 20。

tps 与下文的 mspt 有着很大的关系,mspt 的数值直接决定了 tps 的高低。

mspt 为计算一个游戏刻度所需要的时间,单位为毫秒/ms(一秒为 1000ms),该指标的数值将直接影响 tps,mspt 在大于 50 时,即处理一个游戏刻需要的时间大于 50ms,换算下来,服务器将无法在 1s 内计算 20 个游戏刻,tps 会明显下降,正常服务器的 mspt 应保持在 50 以下。

mspt 的数值与游戏内一切占用 CPU 的行为有关,占用越高,mspt 数值越高。

ping 为向服务器发送数据包,直到收到回应所需的时间,单位为毫秒,ping值越大,延迟也就越高,当服务器负载过高时,服务器可能无法处理请求,也会导致 ping值过高。

在保证服务器主线程所在的核心负载不会过高的情况下,该数值可以可以通过优化网络来调整,在这里不会着重对此项进行优化。

安装 TabTps 插件,服务器游戏内按下 tab 键可以观察到服务器的这些性能指标。(来自群友的截图)

了解上述的指标后,我们可以开始优化服务端,最应该注意的是 mspt 的数值,也就是减少 CPU 的占用,以下几个因素最容易占用 CPU。

  • 实体数量

  • 生物AI

  • 复杂的红石电路

  • 区块的生成

生成新的区块文件会消耗大量的性能,可以选择提前生成区块文件,仅需生成一次文件,这样当玩家在地图中游玩的时候,服务器仅需将区块数据发送给玩家即可。

使用 Chunky 插件来提前生成区块文件

Chunky 同时也是一个模组,在客户端也可以使用,且方法相同,用法如下。

快速开始使用:

  • chunky radius <radius> 设置半径
  • chunky center [<x> <z>] 设置中心块
  • chunky start 在当前选区中开始新生成
  • chunky pause 暂停并保存当前区块生成任务
  • chunky continue 继续运行当前或保存的区块生成任务
  • chunky cancel 停止并取消当前运行中的区块生成任务
  • chunky progress 在游戏中显示所有任务的预生成进度

Chunky 默认选择(0,0)作为中心,500 作为半径,直接使用以下命令会以默认值开始生成:

/chunky start

假设我们以世界(256,256)为中心,生成半径 1280 格的区块文件,可以这样输入命令:

/chunky radius 1280
/chunky center 256 256
/chunky start

在控制台会产生如下输出:

[05:54:49 INFO]: [Chunky] Task started in world for the square region centered at 1280, 1280 with radius 1280.
[05:54:49 INFO]: [Chunky] Task running for world. Processed: 51 chunks (1.21%), ETA: 0:00:13, Rate: 320.8 cps, Current: 13, 2
[05:54:50 INFO]: [Chunky] Task running for world. Processed: 451 chunks (10.67%), ETA: 0:00:09, Rate: 380.9 cps, Current: 13, 16

更多命令不做过多赘述,参考如下:

  • chunky selection 展示当前选区
  • chunky world [world] 设置选中的世界
  • chunky shape <shape> 设置目标形状
  • chunky center [<x> <z>] 设置中心块
  • chunky worldborder 设置中心和半径以匹配所选世界的世界边界
  • chunky spawn 设置中心至出生点
  • chunky corners <x1> <z1> <x2> <z2> 根据角坐标设置选区
  • chunky pattern <pattern> 设置首选生成模式
  • chunky silent 开关显示更新信息
  • chunky quiet <interval> 设置更新消息的静默间隔(以秒为单位)
  • chunky reload 重新加载配置
  • chunky trim 删除选区之外的块

村民的 AI 是所有生物中最复杂的,对 CPU 的占用也非常高,当服务器中存在过多的村民时,过多的村民AI会吃掉服务器的大部分性能,禁用不必要的村民的 AI 是非常必要的。

修改 nbt 来禁用生物的AI

使用 /data 命令可以修改 nbt 数据,在村民的 nbt 标签中插入 {NoAI:“1b”} 即可禁用村民的生物 AI,使用以下命令修改村民的 nbt 标签来禁用 AI

/data merge entity @e[limit=1,type=villager,sort=nearest,distance=..5,nbt=!{NoAI:"1b"}] {{NoAI:"1b"}}

此命令将选择5格内距离你最近的1名没有禁用 AI 的村民,并禁用其生物 AI。

如果批量禁用也很简单,仅需将以下命令放入循环型命令方块中,然后围绕着所有的村民跑一圈即可。

execute at <你的游戏ID> run data merge entity @e[limit=1,type=villager,sort=nearest,distance=..5,nbt=!{NoAI:"1b"}] {{NoAI:"1b"}}

…我不会