首先感謝 侑虎科技 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)
- CharacterController.Move
- AudioSource.Play/Volume/...(Stream Audio)
- SystemInfo.batteryLevel
- Application.internetReachability
注意:使用uwa API進行打點測試的時候盡量不要在循環内進行打點測試
高頻 Update
測試1000GameObject的Update
Unity 2018 的 ECS是一個不錯的選擇
方式 | 平均值 | 增量 |
---|---|---|
ThreadSleep | 32.25ms | |
Update | 35.18ms | 2.93ms |
Coroutine | 39.81ms | 7.56ms |
Manager | 32.45ms | 0.17ms |