Unity中的渲染优化

造成Unity渲染瓶颈的原因可能是

CPU(物理模拟、过多的drawcall)

GPU(过多的顶点计算(顶点多、逐顶点光源多)、过多的片元计算(分辨率大、多次overdraw(半透明、屏幕后处理、渲染顺序))、实时渲染)

内存(尺寸大且未压缩的纹理、静态批处理、分辨率过高的帧缓存(实时渲染))

等因素。

优化的主要手段有

静态批处理、动态批处理

减少顶点计算(建模时就要考虑尽量减少顶点数、模型LOD(需要建模人建不同精度的模型)、遮挡剔除

减少片元计算(控制绘制顺序、减少实时光照(最多使用两个逐像素光源、烘焙技术)、少用半透明物体)

减少计算复杂度(使用ShaderLOD(超过阈值的shader物体不会被渲染,如《第五人格》的手)、在shader中的计算代码尽量放在顶点着色器中、少使用分支、循环等语句、使用精度较低的变量)

使用纹理地图、使用mipmap(多级渐远纹理,就像纹理的LOD)

利用分辨率缩放(选择不同分辨率、开启或关闭屏幕后效果、粒子效果)

 

具体操作:

静态批处理:使用同一个材质的静态物体可以一起打包,只调用一次drawcall,在属性界面勾选batching static就行,但是这样会比原来占用更多的内存。

如果除了平行光还有其他光源,或者含有阴影计算,那么其他的pass不会进行批处理,但是平行光的pass还是会进行批处理。

运行时,使用静态批处理的模型,网格会被命名成combines Mesh。即使使用了不同材质的物体,也可以都勾选batching static,unity会自动识别其中使用同一个材质的物体。

静态批处理的物体,即使在代码中也无法移动。

动态批处理:动态批处理不需要我们做任何额外的工作,只要模型共享一个材质且满足一些条件,unity会自动进行动态批处理。动态批处理与静态相似,但是可以动,但是打包后的网格顶点数不能多于300。如果使用了光照纹理,那么动态批处理的材质需要指向光照纹理的同一位置,因为它们使用的是同一个材质。多个pass的shader会破坏动态批处理,这点与静态不同,静态的平行光的pass还是会进行批处理,但是动态不会。

模型LOD:需要建模人员建三个不同精度的模型,具体操作参考https://blog.csdn.net/yuxikuo_1/article/details/48795325,

遮挡剔除:遮挡剔除与摄像机的是椎体剔除不同之处是,是椎体剔除只会剔除掉哪些不再摄像机视野范围内的对象,但不会判断视野中是否有物体被其他物体挡住。而遮挡剔除会使用一个虚拟摄像机来遍历场景,从而构建一个潜在可见的对象集合。具体操作参考:https://www.bilibili.com/video/BV1qt411i7sC?from=search&seid=17561001289166353407

烘焙技术:将场景纹理烘焙成一张光照纹理,运行时只需要对纹理进行采样即可。烘焙只会对static物体进行烘焙,阴影也会烘焙成静态的,如果是运动的物体,就不要勾选static选项,在运行时产生实时阴影。

纹理地图:如果多个材质只有使用的纹理不同,我们可以将这些纹理合并成一张更大的纹理中,这就是纹理地图,一旦使用了同一张纹理,就可以将多个材质合并成一个,再使用坐标采样即可。其实不只是纹理图集,GUI等二维图片都可以合并成大的图集,具体操作参考:https://blog.csdn.net/jk823394954/article/details/53896924

https://www.xuanyusong.com/archives/3304

Mipmap:根据距离调整纹理精度,具体介绍参考:https://blog.csdn.net/u010019717/article/details/91352180

 

渲染分析工具:

渲染统计窗口:game窗口的右上角stats按钮可打开

性能分析器的渲染区域:window-profiler

帧调试器:window-frame debugger,我们可以通过帧调试器,看到每个draw call时间的工作与结果

 

本文参考《unity shader入门精要》

 

 

 

你可能感兴趣的:(Unity)