简要清单,让你的游戏速度更快:
(1)保持顶点数如下:针对iPhone 3GS和更加新的设备(带SGX
GPU),每帧40K;针对旧设备(带MBX
GPU)每帧10K。
(2)物体之间尽可能共享相同的材质,这样有利于进行渲染合批,对于不同贴图同一材质的,可以将多张贴图合成一张,只合并两个物体而没有共享材质,这样不会给你带来任何性能提高。
每场景中不同的材质的数量尽可能少。
相同相机,如果被渲染的物体使用相同的材质, Unity
IOS能够运用多种内部优化。额外的工作放在合并纹理成单一的图集的和让物体使用相同的材质,总会有回报的。做到这一点!
(3)非移动的物体上设置静态Static
属性,这样可以进行内部优化。
(4)在可能的情况下使用ETC1格式的纹理,否则,选择16bit纹理优于32bit未压缩的纹理数据。
(5)当没有必要时,不要使用像素灯-
选择只有一个(最好是方向光)像素灯的光线影响您的几何图形
当没有必要时,不要使用动态光源- 选择烘焙照明
逐像素的动态照明将显着增加每个受影响的像素的渲染开销,并可能导致对象多次渲染。避免多于一个像素灯 Pixel
Light照亮任何单一的物件,并尽量使用方向灯。请注意,一个像素灯,渲染模式选项设置为重要Important。
逐顶点的动态照明显着增加顶点转变的开销。尽量避免多个灯照亮任何给定的物体的情况,对于静态对象,烘焙照明更加高效。
(6)避免使用alpha测试,而是选择alpha混合。
(7)当没有必要时,不要使用雾效。
(8)了解遮挡剔除的好处,在复杂的静态场景的情况下,有很多遮挡,用它来减少可见几何体的数量和绘制调用。计划你的关卡,受益于遮挡剔除。
(9)使用天空盒制造出"假"遥远的几何体
(10)Per-Layer
Cull Distances 每层消隐距离
使用Camera.layerCullDistances函数,设置每一层消隐距离。这样可以把远距离的需需要渲染的物体隐掉,以减少渲染批次。
着色器相关:
(1)使用合并器或像素着色器,混合每帧的多个纹理,而不是用多通道方法
(2)如果您使用的是内置的着色器,对于移动平台。记住,Mobile
/ VertexLit 是目前最快的着色器。
(3)如果编写自定义的着色器,用尽可能小的浮点格式
fixed / lowp --
perfect for color, lighting information and normals,
用于颜色,灯光信息和法线
half / mediump -- for texture UV coordinates,
用于纹理UV坐标,
float / highp -- avoid in pixel shaders, fine to use in
vertex shader for vertex position calculations.
尽可能地使用最低的精度,这点对于iOS和Android平台特别重要。推荐的经验法则:对于颜色和单位长度的向量,使用fixed;对于其他的,如果范围和精度允许的话,使用half,否则使用float。
在移动平台上,关键是在片段着色器中使用尽可能多低精度数据计算。在大多数移动设备的GPU中,在低精度 (fixed/lowp)
类型上应用swizzles是比较耗时的;同时,在fixed/lowp
和高精度类型之间进行转换也是需要付出很大代价的。
(4)尽量减少在像素着色器使用复杂的数学运算,如pow, sin, cos
等。
(5)每个fragment使用较少的纹理。
(6)通常地说,所需要渲染的像素(像素着色器执行)个数要比所需要渲染的顶点(顶点着色器执行)个数要多,同时,所需要渲染的顶点个数也要比模型的个数要多。所以,一般来说,尽可能地将计算量从像素着色器移到顶点着色器中,或者完全从着色器中移除并从
脚本中来赋值。避免在像素着色器,而是使用顶点着色器,计算顶点的位置。
批处理相关:
DrawCall:
引擎准备好数据并通知GPU绘制的过程称为一次DrawCall。一般一个物体一个Draw
Call
每帧的DrawCall数是一项非常重要的指标,不只是GPU渲染,引擎重设材质/Shader也是非常耗时的操作。
Draw Call
Batching技术:
Unity内置的合并处理技术,优点:将相同变换、材质的物体组合成一个物体进行一次Draw
Call;缺点:组合成的物体会成为一个新的物体,耗费内存和CPU。
Dynamic
Batching:自动进行不需要手动干预,对于顶点数在300以内的可移动物体,只要使用相同的材质,就会组成Batch。
Static
Batching:收费的,static对象无论大小都会batch。
要有效利用Draw Call
Batching,首先是尽量减少场景中使用的材质数量,即尽量共享材质,对于仅纹理不同的材质可以把纹理组合到一张更大的纹理中(称为Texture
Atlasing)。然后是把不会移动的物体标记为Static。