unity-Profiler工具分析

unity 内置的工具, 提供很多运行时的信息, 如 dc, 内存, 函数调用消耗, 基本上这个工具可以满足很大部分的 性能分析 及 定位问题, 然后在针对 瓶颈 进行优化.


前篇


内存篇

调出 细节, 查看具体的内存占用

主要看几个数据就行.


贴图 资源

assets -> texture2d, 这个就是贴图所占用的内存, 有本地load进来的,

  1. 许多贴图采用的Format格式是ARGB 32 bit所以保真度很高但占用的内存也很大。在不失真的前提下,适当压缩贴图,使用ARGB 16 bit就会减少一倍,如果继续Android采用RGBA Compressed ETC2 8 bits(iOS采用RGBA Compressed PVRTC 4 bits),又可以再减少一倍。把不需要透贴但有alpha通道的贴图,全都转换格式Android:RGB Compressed ETC 4 bits,iOS:RGB Compressed PVRTC 4 bits。
  2. 当加载一个新的Prefab或贴图,不及时回收,它就会永驻在内存中,就算切换场景也不会销毁。应该确定物体不再使用或长时间不使用就先把物体制空(null),然后调用Resources.UnloadUnusedAssets(),才能真正释放内存。
  3. 有大量空白的图集贴图,可以用TexturePacker等工具进行优化或考虑合并到其他图集中。
  4. 查看是否有冗余

音频 资源

  1. 播放时长较长的音乐文件需要进行压缩成.mp3或.ogg格式,时长较短的音效文件可以使用.wav 或.aiff格式。
  2. 查看是否有冗余

序列化 资源

通过异步加载(LoadFromCache、WWW等)的时候留下的序列化文件,可监视是否被卸载.

在 5.6版本以前, 安卓平台下 ab每个会占用 0.5m, 不过5.6及以上版本已经解决了这个问题.


mono 托管堆内存

不要让它超过20MB,否则可能会有性能问题!


项目中可能遇到的问题

  1. GPU的presentdevice确实非常耗时,一般出现在使用了非常复杂的shader.

  2. GPU运行的非常快,而由于Vsync的原因,使得它需要等待较长的时间.

  3. 同样是Vsync的原因,但其他线程非常耗时,所以导致该等待时间很长,比如:过量AssetBundle加载时容易出现该问题.

  4. Shader.CreateGPUProgram:Shader在runtime阶段(非预加载)会出现卡顿(华为K3V2芯片).

  5. StackTraceUtility.PostprocessStacktrace()和StackTraceUtility.ExtractStackTrace():
    一般是由Debug.Log或类似API造成,游戏发布后需将Debug API进行屏蔽。