Unity3d性能优化

Unity3d性能优化

所有游戏的性能优化,大体上分为三个部分:CPU优化、内存优化、GPU优化。u3d里面有现成的分析性能工具Profiler(Window->Profiler),不过它的内存分析功能较弱,可使用其他的内存分析工具(如MemoryProfiler)。
在这里插入图片描述界面左侧显示我们游戏的一个方面的信息,包含cpu使用情况,gpu使用情况,渲染,内存使用情况,声音,物理和网络等等,可通过Add Profiler下拉列表选择添加想看到的信息。
界面中间是我们每帧的信息,以图形的方式呈现,鼠标选中其中一帧会暂停unity便于我们查看这一帧的信息(在查看移动设备时不会暂停),右边的左右箭头用来精确选中上一帧和下一帧的。
界面下方是选中的当前帧的详细信息。
Deep Profiler能查看到更详细的信息,但可能会造成卡顿,另外Unity为Profiler提供了专门的类UnityEngine.Profiling.Profiler,其中的BeginSample方法和EndSample方法成对出现,可以标识一段代码的耗时,可用来跟踪性能瓶颈到具体的哪一行代码。

注意:
1.分析前先关掉Profiler左上角CPU Usage下的VSync标记。
2.跟踪性能要针对真机进行,不能在Editor下看结果。

了解了Profiler的界面流程后,现在看几个真实的案例:
案例1:一个2d休闲游戏中的UI都通过XML配置文件来动态创建出来的,在性能一般的android手机打开大部分界面时会出现卡顿的情况。
解决过程:出包设置中勾选Development Build和Autoconnect Profiler,使用Profiler连接手机跟踪分析,选中CPU Usage图形中峰值最高的一帧,BeginSample-EndSample方法逐渐缩小范围毕竟目标,发现在使用System.Xml解析xml文件时和加载包含ui图片的Assetbundle包时消耗了最多时间,前者通过库剥离的方式移除掉系统的xml解析库,使用第三方的xml解析库作为替代方案,后者需要考察实际情况优化,比如在Inspector面板调整图片的相关属性,Generate Mip Maps去除,压缩格式、Max Size,加载AB包图片时使用LoadAllAssets()等等。
案例2:在一款3d射击游戏中,敌方单位会一波一波的批量生成展现在屏幕里,每次敌方单位生成时,都能感觉到手机有明显的卡顿。
解决过程:使用Profiler查看手机上CPU Usage的消耗,发现图形呈现驼峰状,定位到峰值最高的帧,一步步跟踪定位,最后发现在敌方单位预制体创建时和给预制体添加脚本这两项占了绝大多数的CPU时间。前者通过对象池的方式把销毁的单位保存下来下次激活使用,后者与Unity3D的运行机制GameObject-Component有关,最新版的Unity可使用ECS模式代替GameObject增加组件的方式,在旧版本上可模拟ECS的方式来达到,具体思路是:提供一个接口类IUpdate,提供OnUpdate方法,需要附加到GameObject上的类TargetClass都继承接口IUpdate,在一个MonoBehavior
单例类ECSMono里维持两个集合registerSet、unregisterSet,用来存储TargetClass对象,相对应的提供注册和销毁TargetClass对象的方法Register、UnRegister,在ECSMono的Update函数们中得到Register和UnRegister的差集,遍历执行差集中每个TargetClass的OnUpdate方法。
案例3:需要把一款2d捕鱼游戏移植到TCL智能彩电上,在屏幕中有上千条鱼游动,经常一进游戏就发生程序崩溃的问题,勉强能进游戏的情况下,在手机上能跑到30帧的游戏在电视上也只能跑几帧到十几帧。
解决过程:这里其实是两个问题,帧数过低和程序崩溃,优先解决崩溃问题,这里在PC Editor上开游戏,使用MemoryProfiler给内存拍个快照,查看其中的内存占用情况,分析Texture2D中的贴图,发现有几个用来做帧动画的贴图都占了几十M的内存空间,找美术那边重做贴图,减少贴图中的帧数并使贴图大小尽量变成2的n次方,减少了一百多M内存占用后,进游戏崩溃的问题解决了,接下来通过Profiler跟踪连接TCL Android TV,发现在每帧中鱼的帧动画Animator和Canvas.SendWillRenderCanvases占了相当大的cpu时间,其实Canvas.SendWillRenderCanvases是由于UI的mesh重绘导致的,也和帧动画Animator替换Image的图片有关,所以这里是一个问题,就是在TV上怎样解决上千条鱼的Animator动画自身以及附带的引起UI重绘的消耗。可采用GPU分担CPU负担的方法,通过编写shader来实现鱼的帧动画,最终解决问题。

忠告:性能优化需要一定的经验和十分的耐心,永远不要想着能一次性能解决问题,而是要不断尝试向着答案逼近。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值