【性能优化】页面首屏加载角色和怪物模型过慢(> 5秒)原因调查及优化方案 #30
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?
问题现象
进入游戏页面(如 Act 1 关卡场景)时,需要花费较长时间(> 5 秒甚至更久)才能将玩家角色(女法师)和怪物模型及动画完全加载渲染出来。
根本原因排查分析
d2char.mpq(~270 MB)拉取 DCC/COF,怪物模型需要分别从d2data.mpq(~267 MB)、d2exp.mpq(~160 MB)、Patch_D2.mpq等多个 MPQ 卷拉取。loadMonsterArtMap与loadCharacterArt各自独立构建了new MountedArchives(),没有在全局复用已经打开和解析过的 MPQ 句柄与元数据,导致网络链路并发往返开销倍增。建议解决方案
pack-act-assets.ts)将该关卡出没怪物的 8 向动画直接预先渲染成monsters.png+monsters.json精灵图集打入关卡包中,运行时直接作为单张图片拉取,将加载时间从 5 秒以上降低至 200ms 以内。优化决策落地方案确认
根据 Master 确认的优化方案,性能问题(加载 > 5s)按以下两步落地:
1. 前端全局单例化复用 MountedArchives 句柄(运行时优化)
loadMonsterArtMap与loadCharacterArt各自独立执行new MountedArchives()并通过httpRangeSource重复打开d2data.mpq、d2exp.mpq、Patch_D2.mpq和d2char.mpq,各自拉取 block/hash table,产生成倍的 HTTP Range 往返与内存浪费。getSharedArchives(bases)或在场景初始化时统一装配好统一的MountedArchives(一次性挂载 DATA + CHAR MPQ)。2. 离线预打包怪物图集到关卡包中(根治方案:>5s 降至 <200ms)
scripts/pack-act-assets.ts烘焙关卡包时,检测关卡所需的monsters.types。compositeMonsterAnimation与buildAtlas离线解码该关卡怪物 8 向 Walk / Stand 动画,导出为monsters-0.png(带 Act Palette 的 Indexed PNG)。scene.json中记录怪物的图集布局(monsterAtlases)。monsters-0.png(单次 HTTP 请求,直接 GPU 上传),仅在缺失时降级回 MPQ 实时解码。修复完成说明
已在提交
d6e6248中完成优化:archivePromiseCache,复用已打开的 MPQ 卷句柄与 HashTable / BlockTable / (listfile) 解析,消除切换关卡与并发展开时的重复开档请求。compositeMonsterAnimation和loadCharacterSheet将所有层级的 DCC 数据通过Promise.all进行并发 HTTP Range 读取与解码。loadMonsterAtlas与loadCharacterArt将 walk 与 stand 动画并发合成。loadMonsterArtMap针对不同 token 实行并发加载。根治方案完成:离线预打包人物与怪物图集至 Act 资源包 (
270c743)scripts/pack-entity-assets.ts+ 集成至scripts/pack-act-assets.ts):char-so行走wl+ 站立nu) 与全部 11 种怪物模型规格 (FA,FS,ZM,SI,YE,SK,CR-1hs,CR-bow,CR-2ht,GM,CW) 的 8/16 朝向 DCC+COF 图层。act1..5) 生成带透明索引 (tRNSchunk index 0) 的 Indexed PNG 图集 + JSON 帧坐标表,保存在samples/d2-packs/act<N>/entities/。src/scene/act-scene.ts):loadCharacterArt与loadMonsterArtMap在pack模式下直接fetch预烘焙 PNG + JSON,交由浏览器硬件加速createImageBitmap上传 WebGL 纹理,彻底绕过运行时 MPQ HTTP Range 拉取与 JS DCC/COF 逐像素解压(加载耗时 < 200ms),仅当预烘焙文件缺失时回退至 MPQ 缓存加载。tests/packed-entity-art.test.ts):