BetterAutoSave v0.15.0-beta.1 — Forge 1.20.1 异步存档优化
Pre-release
Pre-release
·
71 commits
to main
since this release
v0.15.0-beta.1 — 异步区块加载(可用版,默认关闭)
0.15.0-beta.1 是异步区块加载首个能在真实生产服上运行的预发布。上一个公开预发布 v0.13.0-beta.1 的 jar 漏打了 MixinExtras 依赖,真实服务器一旦开启异步加载会因缺类直接崩溃;本版修复打包、发布自包含 jar,并把异步加载实现重写为非阻塞。功能仍默认关闭、需手动开启,仅 Forge 1.20.1 构建。开启前请先备份整个世界文件夹
关键修复:MixinExtras 打包
- 异步加载的指令注入基于 MixinExtras 的
@WrapOperation。v0.13.0-beta.1 发布的 jar 未把该依赖打入,真实服务器加载异步加载 mixin 时抛ClassNotFoundException崩溃(开发环境自带该依赖,故此前只在 dev 验证、未暴露问题) - 本版发布自包含 jar(内嵌 MixinExtras),安装即用、无需手动补依赖。这是异步加载首个可在生产环境验证的版本
这是什么
- 原版加载区块时,把硬盘字节解析成游戏对象(
ChunkSerializer.read)压在主线程上;视距大、玩家快速移动 / 传送时这步成为主线程负担 - 开启后纯反序列化走后台 load worker,主线程只保留必须当场做的部分:POI 一致性、光照分段、
ChunkDataEvent.Load回放 - 收益落点是「视距 10-12 + 多人」的生产服:腾出的主线程时间转成 TPS 余量、加载更顺、容纳更多玩家
- 不是飞行测速的银弹:纯单人视距拉满的极限飞行撞的是原版单线程区块流水线天花板,异步解析帮不上那一段——这部分无法在不破坏 mod 兼容的前提下并行
不优化什么
- 优化的是已存在区块的存读盘序列化边界(写盘、从盘读回),不碰 worldgen。凭空生成新地形不受影响:全新区块根本不经过
ChunkSerializer.read,异步加载只对"以前生成并存过盘"的区块生效
v0.13.0-beta.1 以来的改动
- 非阻塞 future 链:异步加载内部从「
@WrapOperation+join阻塞等待」重写为非阻塞 future 链,主线程不再为等待后台解析而停顿 - 在飞限流(
LoadInFlightLimiter):限制同时在途的解析任务,避免一批区块同时解析完、回放全砸进同一游戏刻造成瞬时卡;maxInFlight默认 32 → 128,且支持配置热调 - 细粒度 Codec 锁:解析路径的并发保护收窄到 Codec 派发缓存一点,降低 worker 间争用
- 已并入 v0.12.1 的 SavedData 深拷贝尖峰修复(issue #12):超大
.dat存盘不再在主线程整份深拷贝 - 新增在线区块回退的底层协调(
SaveCoordination):供配套 BetterBackup 在不停服情况下原地回退单个或一片区块;BAS 单独安装时此为休眠的底层能力,需配合 BetterBackup 才有对应指令
配置([load] 段,默认关闭)
load.enabled(默认 false):异步加载总开关,独立于存档侧的general.enabledload.loadEventCompatMode(默认 PARTIAL):PARTIAL = 解析走后台、POI/光照/事件回主线程;FULL = 整段解析留主线程(等于本功能关闭、零行为偏差,作 mod 不兼容时的兜底)load.maxInFlight(默认 128,可热调):同时提交给后台的解析任务上限,防止一批区块同时解析完、回放全砸进同一游戏刻造成瞬时卡,按服逐步上调到突发重现为止load.loadMaxRetries(默认 1):后台解析抛错时的重试次数,用尽退回原版主线程读取workers.loadWorkerThreads(默认 2):异步加载后台线程数,解析基本单线程瓶颈,2 个够用;高核数机器配合高视距 / 高速移动可适当上调
安全与兼容
- 数据安全:后台解析失败用同一份字节在主线程重读兜底,任何情况不丢数据
- 一键兜底:
loadEventCompatMode=FULL或load.enabled=false即刻回到原版加载行为,配置热重载无需重启 - mixin 兼容:所有区块读取注入点用
@WrapOperation实现,与 architectury 等改同一指令的 mod 共存,不抢占 - 与其它「自己也异步加载区块」的 mod(C2ME-Forge)二选一;其余 mod 正交不冲突
为什么仍标 beta
- 已在 137 个 mod 的重整合包(Create / 沉浸载具等密集方块实体)真机验证:自包含 jar、异步加载开启,450 m/s 高速飞行下 TPS 锁 19.99,重区块反序列化确认离开主线程,零 worker 异常、零降级、零丢数据信号
- 但密集区反复存读、多人长时间并发尚未穷尽验证,故默认关闭、标记预发布——请先备份、小范围灰度,遇问题提 issue
升级
- 替换 jar 即可,本版发布的 jar 已内嵌 MixinExtras,安装即用;请勿继续使用旧 v0.13.0-beta.1 的 jar(缺依赖会崩)
- 异步加载默认关闭、不动既有存档行为;要试新功能再把
load.enabled设为 true,并务必先备份存档