【unity入门教程】 第十四章 性能优化 【中国大学MOOC游戏引擎原理及应用】
14.1 性能审查
这个是性能分析窗口
点击游戏运行后即可分析运行效果
分析完之后还可以通过save按钮来保存这些结果,还可以将以前保存的结果载入进来进行分析。
之后进行性能优化之后,我们可以通过打开这个窗口来对比是否达到了预期的效果。
性能优化很重要,即便使用游戏引擎开发的游戏,即便游戏提供了很多性能开发的瓶颈,仍然需要你来定位所开发游戏的一些性能瓶颈,进一步来提升游戏性能。
19版本的界面:
14.2 代码优化
早期硬件效果差,需要使用很多的代码来进行优化。
这些高消耗函数要限制它的使用量。
优化建议:
子弹的碰撞检测比较快,可能需要使用连续的碰撞检测,所以可以通过为子弹定制特数的碰撞检测方法
脚本详情如图所示
这个自带了update函数
接下来我们来看看带了update和不带update的区别
为父物体cube添加上这个脚本
接下来进入窗口分析,对比下有无update函数的区别,
有update函数playerloop是8.毫秒
没update函数 playerloop是6.多
像以后没有用的函数可以干脆删除掉
接下来展示第二个优化的例子
来看这个脚本
QE和是实时生成和销毁
AD是将物体设置为true或者false
接下来创建一个空物体并为其挂上这个脚本,为其添加上预制件,当我们按下Q和E的时候可以看到峰值很高
如果是Q和E的话则开销没有那么大
14.3 内存管理
看以下这段代码,每次在update的时候都会重新产生一个字符串变量,这种编码方式会导致频繁进行垃圾回收,降低游戏性。
我们可以将 string不设置为局部变量
堆和栈在内存管理时,所表达的意义是不一样的。
还有一种是协程函数:
可以直接创建一个waitForSeconds对象
14.4 性能优化
受制于GPU(图像显示卡)和CPU(图像处理器)
影响提交的batch数量:
什么意思呢,如果一千个三角形属于同一个物体,cpu会一次性提交给CPU。如果是一千个三角形属于一千个物体,则需要提交一千次。
渲染的优化和图形学关系密切:
1.对于模型,要控制模型的顶点数,如果在大场景中,需要使用IOD,模型在远处可以切换成粗糙的模型
2.同屏的材质,如果可以合并成一个材质则合并成一个材质
3.不运动的GameObject要设置成static类型,unity会进行材质的合并,并且减少calldraw(好像听错了)的压力
4.渲染管现场最好设置成deferred延迟渲染,在手机端则设置成forward 前向渲染
5.应用一些其他的技术,比如遮挡技术
比如,建筑一个这样的一堵墙
可以在相机里面选中这个遮挡选项:
但是这样还不够,还需要将其遮挡和被遮挡的物体的类型设置为
接下来调出来遮挡技术窗口:
可以看到这样的窗口:
在object中可以选择遮挡方式,一般选择默认的遮挡方式:
Bake这里可以看到三个参数,
- 第一个参数Smallest Occluder是能够遮挡物体的最小尺寸。当物体的某个长宽高大于这个尺寸的时候,便可以对后面的物体进行遮挡
- 第二个参数Smallest
Hole可以设置相机通过最小间隙或者孔洞可以看到之后的物体,当孔洞小于这个值的时候,这个孔洞后方的物体可能不会进行渲染 - 第三个参数Backface Threshold设置的是物体的背面是否可见,设置成100时,所有物体都是可见的,当小于100的时候,物体背面将从occlusion的数据集中删除,一般可以使用默认设置的100
当bake烘焙完毕后可以看到当物体被遮挡时则可能不会被渲染
实践:当相机移动到上方时,下面的cube可能就不会被渲染
当相机移动到下方的时候,上面的cube就不会被渲染