增量玩家存档

增量玩家存档

实现了增量玩家存档功能,以平滑处理PlayerManager.saveAllPlayerData()中因将玩家数据保存到磁盘而导致的MSPT峰值。

游戏机制

增量式玩家存档

一个旨在消除 Minecraft 服务器因玩家数据自动存档引起的 MSPT 峰值的模组。

功能简介

Minecraft 的自动存档会在每次存档间隔调用 net.minecraft.server.PlayerManager.saveAllPlayerData(),即在单个游戏刻中将所有在线玩家的数据写入磁盘。在玩家数量众多或玩家数据庞大的服务器上,这可能会导致严重的 MSPT 峰值。

增量式玩家存档通过将玩家存档分散到多个游戏刻中解决该问题——每刻只保存一小批玩家,而非一次性全部保存。本模组的灵感来源于 Paper 的增量式玩家存档功能。

适用人群

如果您遇到以下情况,请安装此模组:

  • 每个自动存档间隔(默认:每 6000 刻 / 5 分钟)出现周期性的 MSPT 峰值
  • 在 Spark 性能分析器的峰值结果中看到 net.minecraft.server.PlayerManager.saveAllPlayerData

此模组仅针对玩家 .dat 文件写入。它不会减少因区块存档或其他自动存档工作引起的峰值。

配置选项

所有选项均位于模组配置文件 config/incrementalplayersave.json 中。

选项 说明 默认值
ticksBetweenSaveAttempts 模组检查哪些玩家需要存档的间隔(单位:刻) 20
ticksBetweenSavesPerPlayer 任意玩家的最小存档间隔(单位:刻) 6000
maxPlayersSavedPerAttempt 每次尝试存档的最大玩家数量。控制每刻的存档开销 3
enableDebugLog 在控制台记录存档操作 false

其他说明

  • 部分优化模组可能包含类似功能。安装前请使用 Spark 确认 saveAllPlayerData 是否仍出现在您的性能分析结果中。在我的服务器上,尽管安装了 Lithium 等多个优化模组,但没有一个能缓解 PlayerManager.saveAllPlayerData() 引起的刻峰值。

  • net.minecraft.server.PlayerManager.saveAllPlayerData() 在 Mojang 映射中对应 net.minecraft.server.players.PlayerList.saveAll()。