首先感谢侑虎科技 UWA DAY 2018的精彩分享,笔者本篇中的优化方法主要是对UWA DAY其中一部分精彩分享的整理,使用的主要排查工具是UWA GOT
有不正确或者不准确的地方欢迎留言指正
下面列举一些容易产生堆内存的函数
Unity API:
- Debug.Log
- AssetBundle.LoadAsset
- Object.Instantiate/GameObejct.SetActive
- Object.name
- GameObject.AddComponent
- ParticleSystem.Play/Stop/...(不指定某个粒子系统调用,就是相当于GetComponentInChildrens差不多)
- Physics.Raycast
Plugins:
- UIPanel.LateUpdate
- LuaInterface.LuaDLL.lua_tostring
- Protobuff.Serializer.Deserialize
System:
- System.Delegate.Combine
- Foreach
- string.Concat/Split/ToLower
特殊问题
- 子线程堆内存分配——>"随机卡顿"(UWA评测线上MONO可测)
查看评测中如果MONO累计分配持续的高开销,就会特别容易造成GC,如果是偶尔低频率的造成MONO高开销,这种影响很小,但是也会产生另外一个问题,如果一次产生的mono开销特别高,就会造成堆内存不足额外分配堆内存的情况
堆内存 -泄漏分析
在UWA GOT :Mono/persistent 显示的堆内存都是GC不掉的 ,显示数值为每1000帧强制GC后的残留MONO 数值
原因:
- C# 直接引用(容器、static变量)
- Lua 间接引用
CPU 瓶颈函数定位
Instantiate
Resources.Load/AssetBundle.LoadAsset
GameObject.SetActive(true)
GameObject.AddComponent
CharacterController.Move
AudioSource.Play/Volume/...(Stream Audio)
SystemInfo.batteryLevel
Application.internetReachability
注意:使用uwa API进行打点测试的时候尽量不要在循环内进行打点测试
高频 Update
测试1000GameObject的Update
Unity 2018 的 ECS是一个不错的选择
方式 | 平均值 | 增量 |
---|---|---|
ThreadSleep | 32.25ms | 0 |
Update | 35.18ms | 2.93ms |
Coroutine | 39.81ms | 7.56ms |
Manager | 32.45ms | 0.17ms |