Unity 内存优化

一、纹理

常用纹理格式

PC平台 DXT

Andriod平台 ETC1(OpenGL ES2.0)、 ETC2(OpenGL ES3.0)

iOS平台 PVRTCASTC(iPhone 6以后的版本支持)

  1. ETC PVRTC等格式为有损压缩,当颜色范围跨度大时,会造成阶梯状的色阶问题,应尽量减少纹理的色差范围。
  2. ETC1 不支持透明通道,可将RGBA32的图片拆分成一张RGB24和一张Alpha8的纹理,在程序中通过Shader来还原。
  3. Mipmap 仅用于场景和角色贴图,属于空间换时间,开启该选项内存增大1.33倍。
  4. Read&Write 一般不需要,应为关闭状态。
  5. 在动态合并时如果一部分顶点数据有Color、Normal、Tangent数据,即使其它顶点没有这些数据,在合并生成VBO时也会增加空的数据。内存会增大很多。
  6. Unity5.x某个版本之前,如果用WWW加载一个AssetBundle,在AssetBundle调用Unload之前会一直存在一个WebStream。在Unity5.6之后的版本该WebStream在加载完成后过一会便会消失。
  7. 加载AssetBundle后,WebStream内部会有一个解压Buffer(0.5M) + 原始数据+解压后的数据(按20%压缩率算),原始数据为1M时可能占用内存超过5M。
  8. 不要在Upadte中New List, New Class,字体串拼接,输出Log,可能造成Mono内存瞬间撑大。
  9. 如果资源有静态引用或者被存放在容器中,则Resource.UnloadUnusedAsset无法清除这些资源。
  10. OS会缓存部分数据,以便下次加载资源时更流畅,所以PSS内存不一下会下降。
  11. 直接修改Renderer.material的某个属性时,会造成一份内存拷贝。