Skip to content

BetterAutoSave v0.16.0 — Forge 1.20.1 异步存档优化

Choose a tag to compare

@github-actions github-actions released this 29 Jun 21:57
· 61 commits to main since this release
6bba72a

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,高速飞行)主线程 POI getOrLoad 从 15.0% 降到 0.1%,加载侧主线程开销净降约 13.7%
  • capability 子系统线程安全对称补齐:区块加载时 LevelChunk 构造会派发全局 AttachCapabilitiesEventreadCapsFromNBT 会触发第三方 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-in
  • load.asyncPoiPrefetch(默认 true):异步加载开启且 PARTIAL 模式时,在 load worker 上预读 POI region;POI 存储相关 mod 异常时设 false 退回主线程同步读

升级

  • 替换 jar 即可。未开启异步加载(load.enabled=false,默认):行为无变化
  • 为区块挂持久 capability 的整合包:本版修复了这类 capability 在异步加载下的线程安全隐患,建议升级