包体分析
自动关联目录:包体分析
1. 定位
包体是"发布前必须过的硬指标":商店有大小限制,下载转化率随体积下降。
一句话定位:包体分析和内存分析是同一套思路——先分类别找最大项,不要只看总量。
2. 工具
| 工具 | 用途 |
|---|---|
| SizeMap(编辑器) | 单个资产的依赖总大小,找"谁最大"最快 |
UnrealPak.exe -List | 精确列出每个 pak 里的资产 |
| Asset Audit(编辑器) | 按类型统计、对比平台 |
| Unreal PakViewer | 可视化查看 pak 内容 |
| CI 上的包体监控 | 防止悄悄变大(见下) |
| 项目实测 | UE性能优化工具 的包体章节 |
3. 包体的构成与优化优先级
| 类别 | 典型占比 | 优化手段 |
|---|---|---|
| 纹理 | 通常最大 | 分辨率、压缩格式(ASTC/ETC2)、mip |
| 音频 | 常有惊喜 | 采样率、压缩、流式 |
| 网格 / Nanite | 大 | LOD 套数、Nanite 压缩 |
| 动画 | 大 | 见 动画压缩与内存 |
| 光照贴图 | 视方案而定 | 见 光照与烘焙 |
| 着色器 | 变体多时很大 | 减少 permutation(见 材质与着色器编译) |
| 引擎与空包底噪 | 固定 | 裁剪不需要的插件与模块 |
优化顺序:先纹理,再音频,再网格/动画,最后才是裁剪引擎。
4. 分平台与分发
| 机制 | 说明 |
|---|---|
| Chunk 划分 | 见 AssetManager 与 Cook 与打包流程 |
| Android App Bundle / OBB | 见 Mobile 与 Release |
| iOS On-Demand Resources | 同上 |
| 按需下载 | ChunkDownloader 或自建(见 热更新与补丁) |
主包应尽量只放启动必需内容,其余走按需下载。
5. CI 监控(防悄悄变大)
| 做法 | 说明 |
|---|---|
| 每次构建记录包体大小 | 形成趋势曲线 |
| 按类别记录 | 能直接看出是哪类资产涨了 |
| 设置阈值报警 | 超过阈值就通知 |
| 与大文件清单一起记录 | 定位具体资产 |
包体几乎总是"一点一点涨上去的",没有监控的话发现时已经很难拆。
6. 代价与权衡
| 手段 | 收益 | 代价 | 什么时候不该用 |
|---|---|---|---|
| 降纹理分辨率 | 收益最大 | 画质下降 | 关键 UI 与特写资产不要降 |
| 换压缩格式 | 省体积 | 可能有画质损失 | 法线/特殊贴图要单独设 |
| 减少 LOD 套数 | 省 | 远处精度下降 | Nanite 路线不需要 LOD |
| 音频降采样/流式 | 省 | 音质与首次播放延迟 | 短音效不必流式 |
| 减少 shader permutation | 省包体 + 省编译时间 | 材质灵活性下降 | 见材质篇 |
| 裁剪引擎模块/插件 | 省底噪 | 可能丢功能 | 要回归验证 |
| 按需下载 | 主包小 | 运行时下载依赖网络 | 启动必需内容不能拆 |
7. 踩坑与排查
| 坑 | 现象 | 怎么验证 |
|---|---|---|
| 只看总包体 | 不知道改哪 | 分类别统计 |
| 忘了未使用资产 | 被打进包 | 检查引用链与 PrimaryAsset 规则(见 Cook) |
| 资产被多 Chunk 引用 | 重复打包 | SizeMap 核对 |
| 编辑器资产打进包 | 无谓膨胀 | 检查 bIsEditorOnly |
| shader 变体爆炸 | 包体 + 编译时间 | 减少 Static Switch(见材质篇) |
| 没有 CI 监控 | 悄悄变大 | 建立趋势记录 |
| 只在开发配置测 | 与发布配置不同 | 用发布配置出包测 |
| 忘了平台差异 | 某平台超标 | 按平台分别统计 |
8. 排查顺序
1. SizeMap / PakViewer → 找最大的资产与依赖
2. 分类别统计 → 按优先级处理(纹理 → 音频 → 网格/动画 → 着色器)
3. 检查未使用资产与重复打包
4. 主包瘦身:按需下载拆分
5. 建立 CI 包体监控防回归参考
- UE性能优化工具(包体章节含 PakViewer 与 CI 方案案例)
- Cook 与打包流程 · AssetManager 与 PrimaryAsset · 热更新与补丁
- 动画压缩与内存 · 材质与着色器编译
许可协议:CC BY
作者:Davids
本文链接:https://hustjjd.github.io/d8e3e09c.html
更新于:2026年10月10日