在iOS上使用alpha-testing的开销非常大,尽量将alpha-test shader替换为alpha-blend。
在iPhone 3GS以及新的硬件上尽量控制每帧渲染不超过4万个顶点(一万多个面)。
象素级动态光照计算因为要计算每个受影响的象素而增加大量的计算开销,也会让对象渲染多个pass。尽量避免让多个Pixel Light影响单个对象,尽量使用方向光。Pixel Light指将Render Mode设置为Important的光。
顶点级动态光照计算会影响顶点变换的计算开销,尽量避免多个光同时影响单个对象,如果可能的话尽量使用预烘培的光照图。
模型优化的两条标准:
剔除那些非必要的面,把那些永远也不会显示的面删掉
尽量减少UV映射的接缝和硬边(hard edge)
注意,图形硬件实际渲染的顶点数与在3D建模软件中看到的顶点数不一样,建模软件中显示的顶点数是构成模型的实际顶点数,而在引擎中渲染的时候,一些顶点需要被分为多个,比如那些有多个法线的顶点,或者是有多个UV坐标的顶点以及有多个颜色值的顶点,他们都必须拆分为多个。所以最终在Unity中看到的顶点数一般都与建模软件中看到的不一样。
尽可能使用iOS内置的PVRT压缩格式,它不仅能减少贴图文件的大小,让游戏的加载速度更快,并且点用更少的内在,而且还能显著提高渲染性能。
如果图像带alpha通道,使用PVRT压缩格式后看起来可能会有些问题。如果出现了这种情况可以使用PVRTexTool来生成.pvr文件,这些文件里带有PVRT压缩参数,Unity引擎导入这些压缩图像后能够更好的还原出原始图像。
如果PVRT压缩格式完全不能满足图像质量方面的要求,比如对于UI贴图来说,则可以采用16位图像格式,这也比完全的32位RGBA图像要节省一半的空间。
在iPhone 3GS之后,GPU已经开始完全支持顶点shader和象素Shader,但也不能期望在iOS平台上能够实现与桌面系统一样的复杂Shader,iOS的硬件性能毕竟还是受限的。
类似于pow,exp,log,cos,sin,tan之类的算术计算会造成很大的GPU开销,一般来说在每个fragment中尽量不要超过一次这种调用。更好的做法是通过查找texture来获取数据。
尽量不要使用自己写的normalize, dot, inverse, sqrt函数,使用内建的,驱动会为这些函数生成更加优化的实现。
尽量减少discard操作的使用,这会让fragments变得非常慢。
使用浮点数时必须指明其大小,尽量使用最小的格式。
如果使用GLSL ES编写Shader,其数据格式为:
1. highp 完全的32位浮点格式,适合于顶点变换的计算,速度比较慢
2. mediump 16位的浮点格式,适用于UV坐标,比highp快大约两倍
3. lowp 10位的定点格式,适用于colors, lighting计算,比highp快大约四倍
CG的shader与GLSL ES类似,三个格式为 float, half, fixed
尽量将静态光进行预渲染,Unity提供了内建的Lightmapper工具。
使用光照图仅仅会消耗额外一点点生成时间,但是能够带来更多的好处:
1. 在有2个象素级光照的情况下能够提高2到3倍的渲染速度
2. 更加平滑的光照表现
如果多个物体使用相同的材质被渲染到同一个摄像机下,Unity iOS能够使用一系列的优化手段:
1. 避免大量的渲染状态切换
2. 避免因为不同的参数而导致顶点及象素处理过程的暂停
3. 让多个小的可移动物体使用同批次渲染以减少draw call数量
让多个标了”static”属性的不论大小的可移动物体使用同批次渲染以减少draw call数量
上面的每一步都能够大量的减少CPU开销,所以尽可能的把多个小贴图合并到一张大图上,让尽可能多的物体都使用这同一张大贴图
几个关于优化的检查点:
1. 在iPhone 3GS及新的硬件上控制每帧最多渲染4万个顶点
2. 如果使用内建的Shader,尽量选择Mobile类别下的,其中Mobile/VertexLit是目前最快的
3. 尽量减少每屏可见的材质数量,尽可能的共用材质
4. 把所有不会移动的物体都标注”static”属性
5. 尽可能的使用PVRTC格式的贴图,或者16位贴图
6. 尽可能的使用combiners或者pixel shader来混合多张贴图,尽量避免采用多个pass的方法
7. 如果自己写shader,尽量使用小的浮点数格式
8. 尽量避免使用比较费时的算术计算
9. 除非必要不要使用Pixel Light,保证只会有最多一个Pixel Light影响到物体
10.除非必要不要使用动态光,可以使用预烘培的方法来代替
11.使用尽可能少的贴图数量
12.尽量避免alpha-testing的使用,可以使用alpha-blending来代替
13.除非必要不要使用雾
14.在场景中尽可能的使用遮挡体以减少需要渲染的物体数量
15.使用天空盒来剔除远处的物体