Unity提供了一组Mobile的Shader,在移动平台上尽量使用它们
在移动平台上尽可能少用纹理,纹理采样会导致更高的带宽更大的功耗,影响设备的电池寿命。
可以考虑将多个纹理打包到一张纹理中,而不是将一个纹理用于粗糙度,一个纹理用于金属度。
纹理打包示例
可以选择Lit 和 Unlit,当然Unlit的性能更好,也可以把阴影画在上面,此处略过
尽可能使用不透明材质,在移动平台,除非必要,不要使用透明材质。
透明材质总是比不透明材质更消耗GPU,使用许多透明材质会影响性能,尤其是许多透明对象叠在一起时。当一个像素在屏幕上多次重复绘制,称为Overdraw。
对于移动平台,Overdraw严重影响性能。所以游戏场景内尽可能让Overdraw保持最小,在Unity中可以在Scene中打开Overdraw的观察模式:
有2种实现透明材质的方法:AlphaBlend和AlphaTest
在移动平台上,可以使用ARM的Streamline来收集性能数据; AlphaTest的材质要么100%透明要么100%不透明,可以设定阈值,在Unity中称为Cutout。 注:在Shader中cg对应的指令为clip(v);
AlphaBlend和AlphaTest
如果想在游戏中使用AlphaTest,有以下建议:
1、最好别用AlphaTest,除非必需 2、AlphaTest意味着要么100%透明,要么100%不透明 3、注意:AlphaTest会禁用了GPU的优化特性,所以在移动平台上仔细测试它的性能,并且和AlphaBlend的性能做对比
如果想在游戏中使用AlphaBlend,有以下建议:
1、移动平台,Unity建议AlphaBlend替代AlphaTest(老刘:这个结论可能是错的),实际上,还得分析和对比两者的性能差异,因为它和渲染的内容相关 2、移动平台尽量不要用AlphaBlend 3、如果一定要用Alpha,让它的渲染面积尽可能小
在静态下,上图没啥问题,但是在运动时,使用AlphaBlend看起来是错的,树叶的 渲染次序是错的。而AlphaTest可以正确的处理次序,不过与AlphaBlend相比,它的边缘粗糙,有锯齿。一般来说AlphaTest表现上还是可以接受的,只要锯齿的边缘在运动中不那么明显,但是当叶子和树枝因为AlphaBlend而前后跳动时,这种表现就不行了。
1、使用简单Shader 2、用Unity系统自带的粒子系统 3、减少Overdraw,减少粒子数量
数量多的纹理采样和AlphaBend及其它功能会让Shader更加复杂,影响渲染性能。建议经常剖析Shader。
ARM提供了一些工具,像Mail Offline Shader Compiler 和 Steamline。
使用这些工具可以了解更多GPU的工作内幕,当前也需要更高级的图形学知识。
因为通常像素比顶点要多,或者说PS比VS运行更频繁,将PS内容前置到VS中; 使用Varyings变量(即PS输出并插值后的数据),
但是得注意tiler防止它成为瓶颈(Tiler?),完成后还得进一步分析性能。
像sin, pow, cos, divide, noise 函数性能较差,推荐基本操作像加法,乘法,速度较快;在老的像OpenGL2的设备上,尽量少用复杂的函数
--转载请注明: http://blog.coolcoding.cn/?p=2706