Unity 优化之 逻辑代码的性能瓶颈与优化方法

本文针对Unity游戏开发过程中常见的性能问题,提供了详细的优化方法。重点介绍了容易导致堆内存增长的函数及排查工具UWAGOT的使用,并分析了堆内存泄漏的原因。此外,还探讨了如何通过减少CPU瓶颈函数的调用来提升游戏性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先感谢侑虎科技 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 间接引用
img_650484f73553362c5881d6bd0993f1bd.png
img_dc8965b103ec928fb59e0524bca45bbe.png

CPU 瓶颈函数定位

  • Instantiate

  • Resources.Load/AssetBundle.LoadAsset

  • GameObject.SetActive(true)

  • GameObject.AddComponent

  • CharacterController.Move

  • AudioSource.Play/Volume/...(Stream Audio)

  • SystemInfo.batteryLevel

  • Application.internetReachability

img_b2cf6f0dc45a55e5b0bf1086c518b070.png
img_4205653c8a746a73df3d99580c04f875.png
img_c2c08fc0975235746052a2333bb39ae5.png
注意:使用uwa API进行打点测试的时候尽量不要在循环内进行打点测试
img_d84af75c7cb75d7011114b776e03b70b.png
高频 Update
测试1000GameObject的Update

Unity 2018 的 ECS是一个不错的选择

方式平均值增量
ThreadSleep32.25ms0
Update35.18ms2.93ms
Coroutine39.81ms7.56ms
Manager32.45ms0.17ms
img_18510b245573f2dd3828509d46e83b26.png
img_98eb3684210b9f4c114676f0bc653185.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值