节省带宽
1 减少纹理大小
- 所有纹理的长宽比最好是正方形,且长宽值最好是2的整数幂。
- 使用多级渐远纹理技术。
通过把纹理类型设置为Advanced, 就可以自定义许多选项,例如,是否生成多级渐远纹理(mipmaps), 当勾选了Generate Mip Maps选项后,Unity就会为同一张纹理创建出很多不同大小的小纹理,构成一个纹理金字塔。而在游戏运行中就可以根据距离物体的远近,来动态选择使用哪一个纹理。
- 纹理压缩。
纹理压缩http://t.csdn.cn/zK5632 利用分辨率缩放
过高的屏幕分辨率也是造成性能下降的原因之一,尤其是对于很多低端手机,除了分辨率高其他硬件条件并不尽如人意,而这恰恰是游戏性能的两个瓶颈:过大的屏幕分辨率和糟糕的GPU。因此,我们可能需要对于特定机器进行分辨率的放缩。当然,这样可能会造成游戏效果的下降,但性能和画面之间永远是个需要权衡的话题。
在Unity中设置屏幕分辨率可以直接调用Screen. SetResolution。
减少计算复杂度
1 shader的LOD技术
和模型的LOD技术类似,Shader 的LOD技术可以控制使用的Shader等级。它的原理是,只有Shader的LOD值小于某个设定的值,这个Shader才会被使用,而使用了那些超过设定值的Shader的物体将不会被渲染。
SubShader {
Tags { 个"RenderType "="Opaque" }
LOD 200
}
我们也可以在Unity Shader 的导入面板上看到该Shader使用的LOD值。在默认情况下,允许的LOD等级是无限大的。这意味着,任何被当前显卡支持的Shader都可以被使用。但是,在某些情况下我们可能需要去掉一些使用了复杂计算的Shader 渲染。这时,我们可以使用Shader.maximumLOD或Shader.globalMaximumLOD来设置允许的最大LOD值。Unity内置的Shader使用了不同的LOD值,例如,Diffuse的LOD为200,而Bumped Specular的LOD为400。
2 代码优化
在实现游戏效果时,我们可以选择在哪里进行某些特定的运算。通常来讲,游戏需要计算的对象、顶点和像素的数目排序是对象数<顶点数<像素数。因此,我们应该尽可能地把计算放在每个对象或逐顶点上。
- 尽量使用低精度浮点值运算
最高精度的floathighp 适用于存储诸如顶点坐标等变量,但它的计算速度是最慢的,我们应该尽量避免在片元着色器中使用这种精度进行计算。
half/mediump适用于一些标量、纹理坐标等变量,它的计算速度大约是float的两倍。
fixed/lowp 适用于绝大多数颜色变量和归一化后的方向矢量,在进行一些对精度要求不高的计算时,我们应该尽量使用这种精度的变量。它的计算速度大约是float 的4倍,但要避免对这些低精度变量进行频繁的swizzle操作( 如color.xwxw)。
还需要注意的是,我们应当尽量避免在不同精度之间的转换,这有可能会造成一定的性能下降。
- 对于绝大多数GPU来说,在使用插值寄存器把数据从顶点着色器传递给下一个阶段时,我们
应该使用尽可能少的插值变量。
如果需要对两个纹理坐标进行插值,我们通常会把它们打包在同一个float4类型的变量中,两个纹理坐标分别对应了xy分量和zw分量。
然而,对于PowerVR平台来说,这种插值变量是非常廉价的,直接把不同的纹理坐标存储在不同的插值变量中,有时反而性能更好。尤其是,如果在PowerVR上使用类似 tex2D( MainTex, uv.zw)这样的语句来进行纹理采样,GPU就无法进行一些纹理的预读取,因为它会认为这些纹理采样是需要依赖其他数据的。因此,如果我们特别关心游戏在PowerVR上的性能,就不应该把两个纹理坐标打包在同一个四维变量中。
- 尽可能不使用全屏的屏幕后处理效果。
如果美术风格实在是需要使用类似Bloom、热扰动这样的屏幕特效,我们应该尽量使用fixed/lowp. 进行低精度运算(纹理坐标除外,可以使用half/mediump)。那些高精度的运算可以使用查找表(LUT)或者转移到顶点着色器中进行处理。
- 尽量把多个特效合并到一个Shader中。
- 尽可能不要使用分支语句和循环语句。
- 尽可能避免使用类似sin、tan、pow、log 等较为复杂的数学运算。我们可以使用查找表来
作为替代。 - 尽可能不要使用discard 操作,因为这会影响硬件的某些优化。
3 根据硬件条件进行缩放
我们首先保证游戏最基本的配置可以在所有的平台上运行良好,而对于一些具有更高表现能力的设备,我们可以开启一些更“养眼”的效果,比如使用更高的分辨率,开启屏幕后处理特效,开启粒子效果等。
优化图像性能https://docs.unity3d.com/Manual/OptimizingGraphicsPerformance.html