70.GPU影响因素之其他因素

70.性能优化-GPU-影响因素-其他因素


70.1 知识点

影响 GPU 性能的其他因素

目前已经了解了填充率、OverDraw、内存带宽、顶点/片元、缓存与显存、并行度与调度,这些因素都可能会对 GPU 造成性能影响。

除此之外,还应该注意以下一些因素。这些因素可能已经在以上内容中提及过,这里再次进行强调。

DrawCall

每个 DrawCall 都有 CPU 到 GPU 的指令调度开销。频繁切换材质、着色器、渲染目标会造成流水线停滞。
因此减少 DrawCall 不仅可以优化 CPU 性能,同样也可以优化 GPU 性能。

纹理采样

  1. 优化采样次数可以提高 GPU 性能
    纹理查询是片元着色器的主要瓶颈之一,Mipmap、LOD 能减少带宽和缓存压力。

  2. 有规律地进行采样,可以提高缓存命中率
    如果片元访问的纹理坐标分布离散,纹理缓存命中率下降,会大量访问显存。应该有规律地连续采样。

  3. 采样模式的复杂度越高,越消耗性能
    Inspector > Texture Import Settings 里有一个 Filter Mode:

    • Point(最近点)
    • Bilinear(双线性)
    • Trilinear(三线性)

    性能开销排序:三线性 > 双线性 > 最近点。

  4. 尽量减少多纹理绑定
    过多材质切换也会增加开销。

着色器

着色器复杂度越高、分支越多,越耗性能。
应该避免或减少分支或循环的使用,减少高开销的内部函数调用。

精度和数据格式

  1. Shader 中尽量用低精度减少性能消耗
    移动端使用 half 精度可大幅减少寄存器与能耗。
  2. RT 格式在满足需求的情况下,尽量选择精度低的格式
    RGBA32F 带宽和存储开销远高于 RGBA8
  3. 尽量在对应平台上使用合适的压缩格式
  4. 在顶点着色器中输出的结构体 v2f,应尽量避免在其中包含无意义数据
    因为会进行插值计算,消耗性能。

后处理和特效

  1. 尽量减少全屏屏幕后处理效果
    它们对带宽和片元算力消耗很大。
  2. 半透明效果会大幅提升 OverDraw
    需要谨慎使用。
  3. 逐像素光照、多阴影贴图采样会显著增加片元着色开销
    需要谨慎使用。

70.2 知识点代码

Lesson70_性能优化_GPU_影响因素_其他因素.cs

public class Lesson70_性能优化_GPU_影响因素_其他因素
{
    #region 知识点 影响GPU性能的其它因素

    //目前我们已经了解了
    //填充率、OverDraw、内存带宽、顶点/片元、缓存与显存、并行度与调度
    //这些因素都可能会对GPU造成性能影响

    //除此之外,我们还应该注意以下一些因素
    //这些因素可能已经被我们在以上因素中提及过
    //我们在这里再次进行强调

    #region 1.DrawCall

    //每个 Draw Call 都有 CPU到GPU 的指令调度开销
    //频繁切换材质、着色器、渲染目标会造成流水线停滞
    //因此减少DrawCall不仅可以优化CPU性能
    //同样也可以优化GPU性能

    #endregion

    #region 2.纹理采样

    //1.优化采样次数可以提高GPU性能
    //  纹理查询是片元着色器的主要瓶颈之一,Mipmap、LOD 能减少带宽和缓存压力
    //2.有规律地进行采样,可以提高缓存命中率
    //  如果片元访问的纹理坐标分布离散,纹理缓存命中率下降,会大量访问显存,我们应该有规律地连续采样
    //3.采样模式的复杂度越高,越消耗性能
    //  在 Inspector > Texture Import Settings 里有一个 Filter Mode:
    //  Point(最近点)
    //  Bilinear(双线性)
    //  Trilinear(三线性)
    //  三线性 > 双线性 > 最近点
    //4.尽量减少多纹理绑定
    //  过多材质切换也会增加开销

    #endregion

    #region 3.着色器

    //着色器复杂度越高,分支越多,越耗性能
    //我们应该避免或减少分支或循环的使用
    //减少高开销的内部函数调用

    #endregion

    #region 4.精度和数据格式

    //1.Shader中尽量用低精度减少性能消耗
    //  移动端使用 half 精度可大幅减少寄存器与能耗
    //2.RT格式在满足需求的情况下,尽量选择精度低的格式
    //  RGBA32F 带宽和存储开销远高于 RGBA8
    //3.尽量在对应平台上使用合适的压缩格式
    //4.在顶点着色器中输出的结构体v2f,应该尽量避免在其中包含无意义数据
    //  因为会进行插值计算,消耗性能

    #endregion

    #region 5.后处理和特效

    //1.尽量减少全屏屏幕后处理效果
    //  它们对带宽和片元算力消耗很大
    //2.半透明效果会大幅提升OverDraw
    //  需要谨慎使用
    //3.逐像素光照、多阴影贴图采样会显著增加片元着色开销
    //  需要谨慎使用

    #endregion

    //等等

    #endregion
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏