Skip to content

世界加载与地图优化

这页讲的是 DM 在世界创建、加载、回收这条链路里,已经做好的那一批底层优化。

对服主来说,重点在于知道这套机制已经帮你处理了哪些风险,以及哪些参数最值得调。

这套优化主要解决什么

副本服最容易出问题的地方,基本都集中在这里:

  • 开本时复制世界太慢
  • 多队同时进本时,世界加载把服务器顶卡
  • 上一把的残留脏到下一把
  • 世界删不干净,实例目录越堆越多
  • 某些整合端加载世界方式和普通服不一样

DM 现在的世界层处理,已经把这些问题拆成了几层去做。

预热不是乱热全服世界

源码现在做的是“按模板引用关系预热”。

开服后进入预热名单的,是当前副本模板真正会用到的那些世界,不会把服务器里无关模板一起拉进预热。

这样做有两个直接好处:

  • 热门副本能提前备图
  • 冷门图不会白白占资源

如果你把 预生成数量 开到 1 或更高,DM 会给这些被引用的模板提前补空闲实例。

这部分和 地图池机制 是连着的。地图池讲的是整体思路,这页讲的是底层具体做了哪些事。

开图过程做了什么

文件复制走异步

DM 不会把整套世界复制都塞到主线程里硬做。

复制阶段走异步线程,真正的 Bukkit 世界加载再回到主线程处理。你在 config.yml 里看到的这两个参数,就是给这层准备的:

  • 复制并发数
  • 主线程加载间隔Tick

前者控制同时复制几张图,后者控制加载请求在主线程上的分发节奏。

这套拆法的价值很直接:

  • 减少一口气连开多个本时的瞬时压力
  • 让世界加载节奏更平一些
  • 高峰期不容易因为一波建图把主线程打满

标准建图模式会收紧生成行为

正常情况下,副本模板建议一直用:

yaml
设置:
  建图模式: standard

这个模式下,DM 会按自己的标准建图流程去加载实例世界:

  • 关闭结构生成
  • 使用空生成器加载副本实例

这能减少很多不必要的额外生成行为,副本世界更可控,也更适合固定模板反复开本。

CatServer 兼容模式只给老环境用

如果你在老的 CatServer / Mohist 1.12 环境里,普通建图方式有兼容问题,才需要:

yaml
设置:
  建图模式: catserver_112_compat

而且这项不是随便写了就强行生效。

如果当前运行环境不是对应的 CatServer / Mohist 1.12,源码会直接回退到 standard,同时打一条警告日志。

所以正常服不要把这项当优化开关,保持默认值就行。

复制模板时,DM 会主动跳过一批没必要的东西

这部分很关键,因为很多副本世界问题,根源就是模板复制得太“实”了。

当前源码在复制世界时,会主动处理这些内容:

  • 跳过 session.lock
  • 跳过 uid.dat
  • 跳过空的 .mca 区块文件
  • 跳过 playerdata
  • 跳过 stats
  • 跳过 advancements
  • 跳过 poi
  • 跳过 data
  • 跳过 datapacks

这套处理的意义主要有三点:

  • 减少无效文件复制
  • 避免世界锁和 UID 冲突
  • 副本实例更干净,不把模板里没必要继承的玩家数据一起带进来

世界加载完成后,还会再做一轮收束

实例世界真正加载出来以后,DM 还会继续做一层整理,不是“能开出来就完事”。

当前已经能确认的处理包括:

  • 关闭自动保存
  • 关闭出生区常驻
  • 关闭世界 PVP
  • 关闭刷怪、昼夜、天气、火焰等一批会干扰副本的规则
  • 把模板里残留的非玩家实体清掉
  • 清理编辑器留下的全息残留
  • 按模板区块范围给实例世界收一个 WorldBorder

这层做完以后,副本世界会更接近“只服务当前这把副本”的状态。

世界卸载和回收这边,做了哪些保护

卸载前会先疏散玩家和实体

副本结束时,DM 不是直接一刀把世界卸掉。

源码里会先做这些动作:

  • 标记这个世界正在销毁
  • 清理 session.lock
  • 先把玩家和实体疏散出去
  • 给卸载留一点缓冲时间
  • 再尝试真正卸载世界

这样做能少掉一批“人刚传走,世界立刻卸载失败”这类问题。

残留实例世界会主动清理

DM 现在不只是靠手动命令清残留。

当前源码已经有两层清理:

  • 启动或运行期扫描残留实例目录
  • 定时清理孤立世界

只要实例目录名符合 DM 的世界前缀,而且当前又没被 Bukkit 正常加载,它就会进入清理流程。

删除失败不会直接放着

世界文件夹有时候不会一次删干净,尤其是刚卸载完、文件句柄还没完全释放的时候。

现在源码里已经有后台重试队列。

删失败的实例目录会先进入待清理队列,后面继续重试,不是失败一次就永远挂着。

这点对长期运行的副本服很有用,因为它能明显减少“残留实例越堆越多”的情况。

卡建图时,日志也比以前更容易查

现在建图流程里已经有阶段日志和超时日志。

模板里这项就和它对应:

yaml
设置:
  建图超时: 45

如果世界加载卡太久,日志里会把当前卡住的建图阶段打出来。

这比以前只看到一个“建图失败”有用得多,至少你能分清是:

  • 卡在复制
  • 卡在主线程加载
  • 卡在后处理
  • 还是卡在服务端本身的世界创建逻辑

服主最该怎么理解这些优化

这批优化真正带来的价值,主要在这几件事上:

  • 开本速度更稳
  • 高峰期开图更稳
  • 实例世界更干净
  • 卸载和回收更省心
  • 卡建图时更容易定位问题

它不会替你无限抬高服务器上限,但会把“同一台机器上副本世界怎么建、怎么回收、怎么少出问题”这件事做得更规整。

配置怎么配最稳

普通单服

可以先这样起步:

yaml
世界管理:
  预生成数量: 1
  复制并发数: 2
  主线程加载间隔Tick: 1
  最大实例总数: 20
  空闲池上限: 5
  孤立世界清理间隔: 300

副本模板里:

yaml
设置:
  建图模式: standard
  建图超时: 45

热门本很多的服

重点调这几项:

  • 预生成数量
  • 空闲池上限
  • 最大实例总数
  • 复制并发数

调整顺序也建议按这个来,不要一上来先把并发拉满。

现在还要知道的一点

回收模式 这项虽然源码里识别 删除重建方块还原,但当前真正稳定可用的仍然按 删除重建 理解最合适。

正式服配世界回收时,先按这条思路去理解,不要把 方块还原 当成已经完整落地的正式方案。

建议连着看的页面

TQ Minecraft Server Plugin Docs