天天看點

Unity 優化之 邏輯代碼的性能瓶頸與優化方法有不正确或者不準确的地方歡迎留言指正下面列舉一些容易産生堆記憶體的函數特殊問題堆記憶體 -洩漏分析CPU 瓶頸函數定位

首先感謝 侑虎科技 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 間接引用
Unity 優化之 邏輯代碼的性能瓶頸與優化方法有不正确或者不準确的地方歡迎留言指正下面列舉一些容易産生堆記憶體的函數特殊問題堆記憶體 -洩漏分析CPU 瓶頸函數定位
Unity 優化之 邏輯代碼的性能瓶頸與優化方法有不正确或者不準确的地方歡迎留言指正下面列舉一些容易産生堆記憶體的函數特殊問題堆記憶體 -洩漏分析CPU 瓶頸函數定位

CPU 瓶頸函數定位

  • Instantiate
  • Resources.Load/AssetBundle.LoadAsset
  • GameObject.SetActive(true)
  • CharacterController.Move
  • AudioSource.Play/Volume/...(Stream Audio)
  • SystemInfo.batteryLevel
  • Application.internetReachability
Unity 優化之 邏輯代碼的性能瓶頸與優化方法有不正确或者不準确的地方歡迎留言指正下面列舉一些容易産生堆記憶體的函數特殊問題堆記憶體 -洩漏分析CPU 瓶頸函數定位
Unity 優化之 邏輯代碼的性能瓶頸與優化方法有不正确或者不準确的地方歡迎留言指正下面列舉一些容易産生堆記憶體的函數特殊問題堆記憶體 -洩漏分析CPU 瓶頸函數定位
Unity 優化之 邏輯代碼的性能瓶頸與優化方法有不正确或者不準确的地方歡迎留言指正下面列舉一些容易産生堆記憶體的函數特殊問題堆記憶體 -洩漏分析CPU 瓶頸函數定位
注意:使用uwa API進行打點測試的時候盡量不要在循環内進行打點測試
Unity 優化之 邏輯代碼的性能瓶頸與優化方法有不正确或者不準确的地方歡迎留言指正下面列舉一些容易産生堆記憶體的函數特殊問題堆記憶體 -洩漏分析CPU 瓶頸函數定位

高頻 Update

測試1000GameObject的Update

Unity 2018 的 ECS是一個不錯的選擇
方式 平均值 增量
ThreadSleep 32.25ms
Update 35.18ms 2.93ms
Coroutine 39.81ms 7.56ms
Manager 32.45ms 0.17ms
Unity 優化之 邏輯代碼的性能瓶頸與優化方法有不正确或者不準确的地方歡迎留言指正下面列舉一些容易産生堆記憶體的函數特殊問題堆記憶體 -洩漏分析CPU 瓶頸函數定位
Unity 優化之 邏輯代碼的性能瓶頸與優化方法有不正确或者不準确的地方歡迎留言指正下面列舉一些容易産生堆記憶體的函數特殊問題堆記憶體 -洩漏分析CPU 瓶頸函數定位