【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】

14.1 性能审查

【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】

这个是性能分析窗口
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
点击游戏运行后即可分析运行效果

【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
分析完之后还可以通过save按钮来保存这些结果,还可以将以前保存的结果载入进来进行分析。
之后进行性能优化之后,我们可以通过打开这个窗口来对比是否达到了预期的效果。

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

19版本的界面:
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】

14.2 代码优化

【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
早期硬件效果差,需要使用很多的代码来进行优化。

【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】

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

优化建议:
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
子弹的碰撞检测比较快,可能需要使用连续的碰撞检测,所以可以通过为子弹定制特数的碰撞检测方法

【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
脚本详情如图所示
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
这个自带了update函数
接下来我们来看看带了update和不带update的区别

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

【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
接下来进入窗口分析,对比下有无update函数的区别,【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】

有update函数playerloop是8.毫秒
没update函数 playerloop是6.多
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
像以后没有用的函数可以干脆删除掉

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

来看这个脚本
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
QE和是实时生成和销毁
AD是将物体设置为true或者false

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

【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
如果是Q和E的话则开销没有那么大

【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】

14.3 内存管理

【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
看以下这段代码,每次在update的时候都会重新产生一个字符串变量,这种编码方式会导致频繁进行垃圾回收,降低游戏性。
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
我们可以将 string不设置为局部变量
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
堆和栈在内存管理时,所表达的意义是不一样的。

【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
还有一种是协程函数:
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
可以直接创建一个waitForSeconds对象
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】

14.4 性能优化

【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
受制于GPU(图像显示卡)和CPU(图像处理器)

【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
影响提交的batch数量:
什么意思呢,如果一千个三角形属于同一个物体,cpu会一次性提交给CPU。如果是一千个三角形属于一千个物体,则需要提交一千次。

渲染的优化和图形学关系密切:
1.对于模型,要控制模型的顶点数,如果在大场景中,需要使用IOD,模型在远处可以切换成粗糙的模型
2.同屏的材质,如果可以合并成一个材质则合并成一个材质
3.不运动的GameObject要设置成static类型,unity会进行材质的合并,并且减少calldraw(好像听错了)的压力
4.渲染管现场最好设置成deferred延迟渲染,在手机端则设置成forward 前向渲染
5.应用一些其他的技术,比如遮挡技术
比如,建筑一个这样的一堵墙
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
可以在相机里面选中这个遮挡选项:
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
但是这样还不够,还需要将其遮挡和被遮挡的物体的类型设置为
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】

接下来调出来遮挡技术窗口:
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
可以看到这样的窗口:
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
在object中可以选择遮挡方式,一般选择默认的遮挡方式:
【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
Bake这里可以看到三个参数,

  1. 第一个参数Smallest Occluder是能够遮挡物体的最小尺寸。当物体的某个长宽高大于这个尺寸的时候,便可以对后面的物体进行遮挡
  2. 第二个参数Smallest
    Hole可以设置相机通过最小间隙或者孔洞可以看到之后的物体,当孔洞小于这个值的时候,这个孔洞后方的物体可能不会进行渲染
  3. 第三个参数Backface Threshold设置的是物体的背面是否可见,设置成100时,所有物体都是可见的,当小于100的时候,物体背面将从occlusion的数据集中删除,一般可以使用默认设置的100
    【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
    当bake烘焙完毕后可以看到当物体被遮挡时则可能不会被渲染
    【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
    实践:当相机移动到上方时,下面的cube可能就不会被渲染
    【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
    当相机移动到下方的时候,上面的cube就不会被渲染
    【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】