perf(scene): 解决首屏阻塞式 166 次 MPQ Range 请求导致的地图载入卡顿 #117
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
缺陷背景与症状
用户反馈访问地图页面(如
http://localhost:8080/acts.html?act=1&level=2-act-1-wilderness-1-var1鲜血荒地)时载入十分缓慢,页面出现数秒的挂起卡顿。根因排查与真实指标
act-scene.ts:1739在首屏临界路径写死了阻塞调用:d2data.mpq/d2exp.mpq发起了 166 次 206 Partial Content 分块网络请求,现场解压 16 张 TXT 数据表,在开发态和远程网络代理下耗时高达 5~8 秒。dropTables没有做全局会话缓存。GameEngine在第 0 帧(地图渲染与玩家出生巡游)根本不需要掉落表,dropTables仅在怪物死亡(onMonsterSlain)时按需结算。修复方案
getSharedDropTables(bases)全局 Promise 单例缓存,整个会话期间只挂载并解析一次。runScene首屏阻塞链中移出await loadDropTables,地图与瓦片立即出画面;后台并行拉取并注入engine.opts.dropTables。boot()早期自动预热:在页面刚进入加载index.json时即在后台静默发起预热,使玩家接触怪物前掉落表早已加载就绪。修复完成并已合并至 main
79bf8f4loadDropTables移出runScene首屏同步阻塞链,使得第 0 帧地图瓦片渲染和玩家出生无需等待 166 次 MPQ Range 分块请求,出画面速度直接缩减至 400ms 左右。getSharedDropTables(bases),全会话期间仅在首次挂载并解析一次,切关卡与重新进图时开销降至 0ms。boot()最前端发起后台静默预热,并在GameEngine增加setDropTables支持后台 Promise 敲定后的无感注入。tests/scene-drop-preload.test.ts,验证单例缓存防重载与延迟安全注入。npm run typecheck: 0 errorsnpx vitest run: 102 passed, 1 skipped (1598 passed, 2 skipped, 0 failed)