# 优化内存
## 一、内存与OOM
Unity WebGL游戏通常比普通H5(JS)游戏占用更大的内存，在操作系统的控制策略下超出阈值时非常容易被OOM。

为了提高游戏在中低端机型的稳定性，内存优化极为重要。那么，多大的内存是合理的呢？
我们建议内存峰值控制在以下范围([性能评估标准](PerfMeasure))：
1. Android: 低档机 =1024MB时，大部分设备将启动失败；UnityHeap>=500MB时，32位微信(约5%用户)与iOS普通模式大概率启动失败，建议中轻度游戏不超过该值。

### 4.4 首资源包与AssetBundle内存
- 问题原因：首资源包永远占用内存且无法释放；首资源包和AssetBundle自带的cache机制都会使用Emscripten使用[文件系统](https://emscripten.org/docs/api_reference/Filesystem-API.html)，应避免使用。
- 解决办法：
  - 1. 减少首资源包大小，此部分始终占用内存无法释放, 使用AssetBundle；
  - 2. AssetBundle按需加载，及时释放以节省内存；
  - 3. AssetBundle使用时被解压占用Unity Native内存，应减少AssetBundle大小；
  - 4. 避免使用Unity自带的文件缓存机制， ***首资源包和AssetBundle都不应使用文件Cache***；

### 4.5 音频内存
- 问题原因：音频将占用小游戏环境的内存
- 解决办法：
   - 1. 不要使用fmod播放长音频，如游戏BGM
   - 2. 控制音效数量，同时存在的音频数不应该超过20个
   - 3. 尽量强制使用单声道音频，双声道会产生2倍内存消耗

### 4.6 其他常见优化手段
- [性能优化，进无止境-内存篇（上）](https://blog.uwa4d.com/archives/optimzation_memory_1.html)
- [性能优化，进无止境-内存篇（下）](https://blog.uwa4d.com/archives/optimzation_memory_2.html)

## 五、QA
1. Q: 如何解决iOS高性能模式出现内存过大导致游戏关闭，常见优化步骤如何？
   - iOS测试内存务必不要开启development、profilingmem等模式
   - iOS测试内存务必使用代码分包、压缩纹理（2021以上可使用引擎ASTC，低版本使用微信压缩纹理）
   - 请使用Perfdog或mac Instrument查看WebContent进程内存是否在安全范围(安全内存峰值是1.2-1.3G左右)
   - 进程内存离1.5G上限还有较大差距就突然崩溃，请检查“UnityHeap预留内存“是否足够
   - 打开性能面板查看DynamicMemory，峰值不要超过500M（结合profilingmem、memoryprofiler分析）
   - 使用Perfdog查看Android版本的GL、GFX显存，对于GPU显存压力大的游戏，使用[高性能+模式](/minigame/dev/guide/performance/perf-high-performance-plus)
   - 如果以上步骤完成还有问题，请提供详细数据联系平台侧进一步分析

3. Q: 在Unity Profiler看到内存才200MB+，是否代表游戏内存无问题

   - 不是。游戏占用内存必须以真机环境为准，使用Perfdog（Android or iOS）或 Instruments in Xcode(iOS)测试对应进程的内存占用。
   - Unity Profiler仅能看到“引擎可监控内存”，并不包含小游戏公共库、Cavas、WebAssembly编译以及容器其他内存。
   - 建议使用2022或团结版的memoryprofiler、profiling-mem更精确分析内存，对于分析CPU/GPU内存有较大帮助

4. Q: 转换面板设置内存值多少合适？

   - 请看前文关于UnityHeap预留内存的说明
