Unity中的渲染优化技术

影响性能的因素

对于一个游戏来说,它主要需要使用两种计算资源:CPU和GPU。它们会相互合作,来让我们的游戏可以在预期的帧率和分辨率下工作。其中,CPU主要负责保证帧率,GPU主要负责分辨率相关的一些处理。
1.CPU
1)过多的draw call
2)复杂的脚本或者物理模拟
2.GPU
1)顶点处理。过多的顶点;过多的逐顶点计算。
2)片元处理。过多的片元(既可能是由于分辨率造成的,也可能是由于overdraw造成的);过多的逐片元计算。
3)宽带。使用了尺寸很大且未压缩的纹理;分辨率过高的帧缓存。

优化技术
1.CPU
1)使用批处理技术减少draw call数目。
2.GPU
1)减少需要处理的顶点数目。优化几何体;使用模型的LOD技术;使用遮挡剔除技术。
2)减少需要处理的片元数目。控制绘制顺序;警惕透明物体;减少实时光照。
3)减少计算复杂度。使用Shader的LOD技术;代码方面的优化。
3.节省内存宽带
1)减少纹理大小。
2)利用分辨率缩放。

减少draw call数目

Unity中支持两种批处理方式:一种是动态批处理,另一种是静态批处理。对于动态批处理来说,优点是一切处理都是Unity自动完成的,不需要我们自己做任何操作,而且物体是可以移动的,但缺点是,限制很多,可能一不小心就会破坏了这种机制,导致Unity无法动态批处理一些使用了相同材质的物体。而对于静态批处理来说,它的优点是自由度很高,限制很少;但缺点是可能会占用更多的内存,而且经过静态批处理后的所有物体都不可能再移动了。

动态批处理
如果场景中有一些模型共享了同一个材质并满足一些条件,Unity就可以自动把它进行批处理,从而只需要花费一个draw call就可以渲染所有的模型。动态批处理的基本原理是,每一帧把可以批处理的模型网格进行合并,再把合并后模型数据传递给GPU,然后使用同一个材质对其渲染。除了实现方便,动态批处理的另一个好处是,经过批处理的物体仍然可以移动,这是由于在处理每帧是Unity都会重新合并一次网格。
Unity动态批处理的一些主要限制:
1)能够进行批处理的网格的顶点属性规模要小于900.
2)使用光照纹理的物体需要小心处理。这些物体需要额外的渲染参数。
3)多Pass的shader会中断批处理。
静态批处理
静态批处理的实现只需要把物体面板的Static复选框勾选上即可。
批处理的注意事项
1)尽可能选择静态批处理,但得时刻小心对内存的消耗,并且记住经过静态批处理的物体不可以再被移动。
2)如果无法进行静态批处理,而要使用动态批处理的话,那么要小心各种条件的限制。
3)对于游戏中的小道具可以使用动态批处理。
4)对于包含动画的这类物体,我们无法全部使用静态批处理,但其中如果有不动的部分,可以把这部分标识成“Static”。

减少需要处理的顶点数目

1.优化几何体
在建模是尽可能减少模型中三角形片面数,一些对于模型没有影响、或是肉眼非常难观察到区别的顶点都要尽可能去掉。
2.模型的LOD技术
这种技术的原理是当一个物体离摄像机很远时,模型上的很多细节是无法被察觉到的。因此,LOD允许当对象逐渐远离摄像机时,减少模型上的面片数量,从而提高性能。
在Unity中,我们可以使用LOD Group组件来为一个构建一个LOD。我们需要为同一个对象准备多个包含不同细节程序的模型,然后把它们赋予给LOD Group组件中的不同等级,Unity就会自动判断当前位置上需要使用哪个等级的模型。
3.遮挡剔除技术
我们需要把遮挡剔除和摄像机的视锥体剔除区分开来。视锥体剔除只会剔除掉那些不在摄像机的视野范围内的对象,但不会判断视野中是否有物体被其他物体遮挡。而遮挡剔除会使用一个虚拟的摄像机来遍历场景,从而构建一个潜在可见的对象集合的层级结构。
在运行时刻,每个摄像机将会使用这个数据来识别哪些物体是可见,而哪些被其他物体挡住不可见。使用遮挡剔除技术,不仅可以减少处理的顶点数目,还可以减少overdraw,提高游戏性能。

减少需要处理的片元数目

1,控制绘制顺序
在Unity中,那些渲染队列数目小于2500的对象都被认为是不透明的物体,这些物体总体上是从前往后绘制的,而使用其他的队列的物体,则是从后往前绘制的。这意味着我们可以尽可能地把物体的队列设置为不透明物体的渲染队列,而尽量避免使用半透明队列。
2.时刻警惕透明物体
3.减少实时光照和阴影

减少宽带

1.减少纹理大小
所有纹理的长宽比最好是正方形,而且长宽值最好是2的整数幂。除此之外我们还应该尽可能使用多级渐远纹理技术和纹理压缩。
2.利用分辨率缩放

减少计算复杂度

1.Shader的LOD技术

SubShader {
	Tags { "RenderType"="Opaque"}
	LOD 200

在默认情况下允许的LOD等级是无限大的,这意味着任何被当前显卡支持的Shader都可以被使用。Unity内置的Shader使用了不同的LOD值,例如,Diffuse的LOD为200,而Bumped Specular的LOD为400.
2.代码方面的优化
游戏需要计算的对象、顶点和像素的数目排序是对象数<顶点数<像素数。因此,我们应该尽可能地把计算放在每个对象或逐顶点上。
1)尽可能不要使用分支语句和循环语句。
2)尽可能避免使用类似sin、tan、pow、log等比较复杂的数学运算。我们可以使用查找表来作为替代。
3)尽可能不用使用discard操作,因为这会影响硬件的某些优化。
3根据硬件条件进行缩放
首先保证游戏最基本的配置可以在所有的平台上运行良好,而对于一些具有更高表现能力的设备,我们可以开启一些更“养眼”的效果。

你可能感兴趣的:(Shader)