天天看点

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 瓶颈函数定位