Unity3D经验(2)——初级性能优化

问题概述

当一款游戏真正进入测试阶段时,性能优化将是一个避不开的问题。有时候你可能会发现明明一个很简单的小游戏却出现了极其严重地掉帧,醒醒吧,不要去怀疑你的电脑配置,大部分情况下还是自己对程序的优化不到位。
作为一个初级者,经过几天的翻阅博客+unity自带的profiler性能分析器的使用,总结了以下的几点。

优化建议

1、将UI改用Sprite
unity对UI的渲染会占较大的内存,使用Sprite虽然需要额外加一个视角跟随的脚本,但确实可以节省渲染时间。

2、垂直同步降至低配置
垂直同步的意义在于申请一段时间以同步相邻帧的图像防止撕裂。但是通过profiler可以看到,垂直同步将会占据大量的时间,关闭垂直同步虽然可能会使画面偶尔出现裂痕,但是可以大大提高运行的帧率。

3、减少无用的Component,尤其是Animator和rigidbody
无用的组件也是极其伤人的东西,因为unity引擎在计算的时候是不会忽视任何一个组件的。

4、对于需要用到Trigger的物体 减少能与之碰撞的物体类数
这个是一个令我很意外的事情。通过profiler可以看到,如果不对碰撞体的类别加以限制,有时候ontrigger()会一下检测成千上万的物体,这也给函数OntriggerStay的读取增加了很大的压力。

5、将GetComponent和Find放到Start函数中,一定不能在update中出现
因为GetComponent和Find都是一种遍历类型的方法,地图中的物体越多,他们所损耗的时间就越长,此时如果再update中每帧调用,那么掉帧当然不可避免。

6、对于内部计算复杂的函数,每几帧调用一次
相当于给引擎减负,给予它喘息的机会。

7、将视野外无影响的物体的Active置为false
这是一个骚操作,对于较大的地图而言,如果真能做到这一项,那么引擎的压力一下就会减小特别多,但是这不是一个通用的方法,因为许多游戏看不见的地方也会有许多事件发生。

8、减少频繁调用函数,尤其是避免update中调用函数
调用函数需要额外申请空间,而且update中不断调用外界函数也会增大引擎的压力。

9、一定不要用Playerprefs来做全局变量,应当用global继承
划重点!Playerprefs虽然简单粗暴,但是它的存储速度和读取速度非常非常非常非常慢,有点像打开一个文件再检索的速度,如果你敢在update中使用Playerprefs,那它就敢给你上演什么叫爆帧。在unity中建议新建一个类Global继承MonoBehavior,然后剩下所有的类都去继承Global。

10、尽可能控制粒子系统的粒子数量和范围
粒子越多占用越大计算越复杂压力越大,这个很显然。当然及时删除无用的粒子也是需要注意的。

11、尽量用objectpool取代instantiate object和destroy object
对象池是个好东西,它可以将所有预制的物体暂存在池中,等需要生成时直接将它们拿出来就好了,避免一次又一次新预制导致的性能下降。

12、将场景导入新工程中,以丢弃所有已导入却未使用的Resource
这个完全是为了节约工程的空间,减少空间浪费。

13、减少foreach遍历类 甚至避免大篇幅出现循环体
不解释。update本来就很频繁,再动不动就遍历一些东西,unity当然会卡爆。

14、对比tag的时候尽量使用CompareTag(“Tag”)而不是=="Tag"
这里就是一些特殊用法了。关于tag本身的性能并不太好,因为官方特地给了一个CompareTag方法来比较Tag,每帧可以节省几毫秒,但在update中能节约的时间数就相当可观了。

发布了8 篇原创文章 · 获赞 1 · 访问量 329

猜你喜欢

转载自blog.csdn.net/weixin_42921101/article/details/102374636
今日推荐