• UnityShader入门精要——Unity中的渲染优化技术(四)


    节省带宽

    1 减少纹理大小

    • 所有纹理的长宽比最好是正方形,且长宽值最好是2的整数幂。
    • 使用多级渐远纹理技术。

    通过把纹理类型设置为Advanced, 就可以自定义许多选项,例如,是否生成多级渐远纹理(mipmaps), 当勾选了Generate Mip Maps选项后,Unity就会为同一张纹理创建出很多不同大小的小纹理,构成一个纹理金字塔。而在游戏运行中就可以根据距离物体的远近,来动态选择使用哪一个纹理。

    • 纹理压缩。

    纹理压缩icon-default.png?t=M5H6http://t.csdn.cn/zK5632        利用分辨率缩放

    过高的屏幕分辨率也是造成性能下降的原因之一,尤其是对于很多低端手机,除了分辨率高其他硬件条件并不尽如人意,而这恰恰是游戏性能的两个瓶颈:过大的屏幕分辨率和糟糕的GPU。因此,我们可能需要对于特定机器进行分辨率的放缩。当然,这样可能会造成游戏效果的下降,但性能和画面之间永远是个需要权衡的话题。

    在Unity中设置屏幕分辨率可以直接调用Screen. SetResolution。

    减少计算复杂度

    1        shader的LOD技术

    和模型的LOD技术类似,Shader 的LOD技术可以控制使用的Shader等级。它的原理是,只有Shader的LOD值小于某个设定的值,这个Shader才会被使用,而使用了那些超过设定值的Shader的物体将不会被渲染。

    1. SubShader {
    2. Tags { 个"RenderType "="Opaque" }
    3. LOD 200
    4. }

    我们也可以在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        根据硬件条件进行缩放

    我们首先保证游戏最基本的配置可以在所有的平台上运行良好,而对于一些具有更高表现能力的设备,我们可以开启一些更“养眼”的效果,比如使用更高的分辨率,开启屏幕后处理特效,开启粒子效果等。

    优化图像性能icon-default.png?t=M5H6https://docs.unity3d.com/Manual/OptimizingGraphicsPerformance.html

  • 相关阅读:
    如何使用 Java 将 PDF 转换为文本 (TXT)
    二维数组与指针(杰哥强化版)
    java——事务
    vue 公众号h5分享功能 监听微信右上角...
    晶振在单片机中扮演着什么角色?晶振坏了单片机还能运行程序吗?
    SpringBoot基础知识
    【mongodb】--自定义排序规则
    关于编译器对连续的构造+拷贝构造/连续的拷贝构造的优化
    数学建模:运筹学中的主要问题(技术)
    计算机防勒索病毒之主机加固核心要点
  • 原文地址:https://blog.csdn.net/weixin_51327051/article/details/125407853