文章目录

  • 14.1 性能审查
  • 14.2 代码优化
  • 14.3 内存管理
  • 14.4 性能优化


14.1 性能审查

unity 发热优化 unity性能优化教程_unity


unity 发热优化 unity性能优化教程_游戏_02

这个是性能分析窗口

unity 发热优化 unity性能优化教程_unity 发热优化_03


点击游戏运行后即可分析运行效果

unity 发热优化 unity性能优化教程_游戏_04


unity 发热优化 unity性能优化教程_游戏引擎_05


unity 发热优化 unity性能优化教程_unity_06


unity 发热优化 unity性能优化教程_游戏引擎_07


unity 发热优化 unity性能优化教程_unity_08


unity 发热优化 unity性能优化教程_游戏引擎_09


分析完之后还可以通过save按钮来保存这些结果,还可以将以前保存的结果载入进来进行分析。

之后进行性能优化之后,我们可以通过打开这个窗口来对比是否达到了预期的效果。

性能优化很重要,即便使用游戏引擎开发的游戏,即便游戏提供了很多性能开发的瓶颈,仍然需要你来定位所开发游戏的一些性能瓶颈,进一步来提升游戏性能。

19版本的界面:

unity 发热优化 unity性能优化教程_游戏_10

14.2 代码优化

unity 发热优化 unity性能优化教程_游戏_11


早期硬件效果差,需要使用很多的代码来进行优化。

unity 发热优化 unity性能优化教程_unity 发热优化_12

这些高消耗函数要限制它的使用量。

优化建议:

unity 发热优化 unity性能优化教程_游戏引擎_13


子弹的碰撞检测比较快,可能需要使用连续的碰撞检测,所以可以通过为子弹定制特数的碰撞检测方法

unity 发热优化 unity性能优化教程_游戏_14


unity 发热优化 unity性能优化教程_unity 发热优化_15


unity 发热优化 unity性能优化教程_unity_16


unity 发热优化 unity性能优化教程_unity_17


unity 发热优化 unity性能优化教程_游戏_18


unity 发热优化 unity性能优化教程_游戏开发_19


脚本详情如图所示

unity 发热优化 unity性能优化教程_游戏_20


这个自带了update函数

接下来我们来看看带了update和不带update的区别

为父物体cube添加上这个脚本

unity 发热优化 unity性能优化教程_游戏_21


接下来进入窗口分析,对比下有无update函数的区别,

unity 发热优化 unity性能优化教程_游戏开发_22

有update函数playerloop是8.毫秒

没update函数 playerloop是6.多

unity 发热优化 unity性能优化教程_游戏_23


像以后没有用的函数可以干脆删除掉

接下来展示第二个优化的例子

来看这个脚本

unity 发热优化 unity性能优化教程_游戏引擎_24


QE和是实时生成和销毁

AD是将物体设置为true或者false

接下来创建一个空物体并为其挂上这个脚本,为其添加上预制件,当我们按下Q和E的时候可以看到峰值很高

unity 发热优化 unity性能优化教程_unity_25


如果是Q和E的话则开销没有那么大

unity 发热优化 unity性能优化教程_游戏开发_26

14.3 内存管理

unity 发热优化 unity性能优化教程_游戏引擎_27


unity 发热优化 unity性能优化教程_unity 发热优化_28


unity 发热优化 unity性能优化教程_unity_29


看以下这段代码,每次在update的时候都会重新产生一个字符串变量,这种编码方式会导致频繁进行垃圾回收,降低游戏性。

unity 发热优化 unity性能优化教程_游戏_30


我们可以将 string不设置为局部变量

unity 发热优化 unity性能优化教程_unity 发热优化_31


堆和栈在内存管理时,所表达的意义是不一样的。

unity 发热优化 unity性能优化教程_游戏开发_32


unity 发热优化 unity性能优化教程_游戏_33


还有一种是协程函数:

unity 发热优化 unity性能优化教程_unity_34


可以直接创建一个waitForSeconds对象

unity 发热优化 unity性能优化教程_unity 发热优化_35

14.4 性能优化

unity 发热优化 unity性能优化教程_游戏引擎_36


受制于GPU(图像显示卡)和CPU(图像处理器)

unity 发热优化 unity性能优化教程_unity 发热优化_37


unity 发热优化 unity性能优化教程_unity 发热优化_38


影响提交的batch数量:

什么意思呢,如果一千个三角形属于同一个物体,cpu会一次性提交给CPU。如果是一千个三角形属于一千个物体,则需要提交一千次。渲染的优化和图形学关系密切:

1.对于模型,要控制模型的顶点数,如果在大场景中,需要使用IOD,模型在远处可以切换成粗糙的模型

2.同屏的材质,如果可以合并成一个材质则合并成一个材质

3.不运动的GameObject要设置成static类型,unity会进行材质的合并,并且减少calldraw(好像听错了)的压力

4.渲染管现场最好设置成deferred延迟渲染,在手机端则设置成forward 前向渲染

5.应用一些其他的技术,比如遮挡技术

比如,建筑一个这样的一堵墙

unity 发热优化 unity性能优化教程_游戏_39


可以在相机里面选中这个遮挡选项:

unity 发热优化 unity性能优化教程_unity_40


但是这样还不够,还需要将其遮挡和被遮挡的物体的类型设置为

unity 发热优化 unity性能优化教程_游戏_41

接下来调出来遮挡技术窗口:

unity 发热优化 unity性能优化教程_游戏_42


可以看到这样的窗口:

unity 发热优化 unity性能优化教程_游戏开发_43


在object中可以选择遮挡方式,一般选择默认的遮挡方式:

unity 发热优化 unity性能优化教程_游戏引擎_44


Bake这里可以看到三个参数,

  1. 第一个参数Smallest Occluder是能够遮挡物体的最小尺寸。当物体的某个长宽高大于这个尺寸的时候,便可以对后面的物体进行遮挡
  2. 第二个参数Smallest
    Hole可以设置相机通过最小间隙或者孔洞可以看到之后的物体,当孔洞小于这个值的时候,这个孔洞后方的物体可能不会进行渲染
  3. 第三个参数Backface Threshold设置的是物体的背面是否可见,设置成100时,所有物体都是可见的,当小于100的时候,物体背面将从occlusion的数据集中删除,一般可以使用默认设置的100

    当bake烘焙完毕后可以看到当物体被遮挡时则可能不会被渲染

    实践:当相机移动到上方时,下面的cube可能就不会被渲染

    当相机移动到下方的时候,上面的cube就不会被渲染