BetterAutoSave v0.16.0 — Forge 1.20.1 异步存档优化
v0.16.0 — 异步区块加载(正式版)
0.16.0 把 v0.15 引入的异步区块加载打磨到正式版:加载侧 POI 读盘后台化、capability 子系统的线程安全对称补齐、关服路径彻底加固。异步加载仍默认关闭、需手动开启(load.enabled),面向追求加载性能、愿意 opt-in 的服主。仅 Forge 1.20.1 构建
这一版带来什么
异步加载(PARTIAL 模式)把区块反序列化从主线程搬到后台 load worker。0.16 周期围绕这条路径做了三件事:
- Tier A 异步 POI 预读:load worker 在反序列化那一刻顺手把该列 POI region 字节读到后台,主线程回放前填好缓存,消除原本主线程在
tryRead().join()上的同步读盘等待。生产服真机(137 mod,8 load worker,高速飞行)主线程 POIgetOrLoad从 15.0% 降到 0.1%,加载侧主线程开销净降约 13.7% - capability 子系统线程安全对称补齐:区块加载时
LevelChunk构造会派发全局AttachCapabilitiesEvent、readCapsFromNBT会触发第三方 capability 的反序列化——这两者与已经回主线程的ChunkDataEvent.Load同性质(第三方代码普遍假设主线程)。本版把它们一并挪回主线程回放,修复了为区块挂持久 capability 的 mod 在异步加载下的潜在线程安全隐患。回放忠实执行、capability 数据照常读回,无数据丢失 - 关服路径加固:load / save worker 改为 daemon 线程并加 JVM 关闭兜底 hook,防止别的 mod 在关服事件链上抛异常打断 BAS 收尾时拖死整个服务器;load 在途任务也纳入关服 drain 屏障,与存盘侧对称
验证
- 发版前对 capability off-thread 路径做了多角度对抗审查 + 155 项单元测试(含 capability defer 的逐字节回放断言)
- 测试服 reobf jar 真机端到端:异步 load worker 加载 spawn 区块经 capability defer + 主线程回放,零异常、零数据偏差
安全与兼容
- 无损:capability 的 gather 与反序列化按原顺序回主线程忠实回放,与 vanilla 同步加载逐字等价
- 失败兜底:worker 解析失败自动退回主线程 vanilla 读,只读磁盘字节、零数据丢失
- 未开异步加载(默认)的用户:本版加载路径无任何行为变化
配置([load] 段)
load.enabled(默认 false):异步区块加载总开关,opt-inload.asyncPoiPrefetch(默认 true):异步加载开启且 PARTIAL 模式时,在 load worker 上预读 POI region;POI 存储相关 mod 异常时设 false 退回主线程同步读
升级
- 替换 jar 即可。未开启异步加载(
load.enabled=false,默认):行为无变化 - 为区块挂持久 capability 的整合包:本版修复了这类 capability 在异步加载下的线程安全隐患,建议升级