世界加载与地图优化
这页讲的是 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热门本很多的服
重点调这几项:
预生成数量空闲池上限最大实例总数复制并发数
调整顺序也建议按这个来,不要一上来先把并发拉满。
现在还要知道的一点
回收模式 这项虽然源码里识别 删除重建 和 方块还原,但当前真正稳定可用的仍然按 删除重建 理解最合适。
正式服配世界回收时,先按这条思路去理解,不要把 方块还原 当成已经完整落地的正式方案。