36.DrawCall定义作用及优化

  1. 36.DrawCall定义作用及优化
    1. 36.1 题目
    2. 36.2 深入解析
    3. 36.3 答题示例
    4. 36.4 关键词联想

36.DrawCall定义作用及优化


36.1 题目

什么是DrawCall?DrawCall为什么会影响游戏运行效率?如何减少DrawCall?


36.2 深入解析

  1. 什么是DrawCall?

    每次CPU准备渲染相关数据并通知GPU的过程称为一次DrawCall。简而言之,DrawCall是CPU向GPU发出绘制命令的过程,涉及渲染数据的准备和传输。

  2. DrawCall为什么会影响游戏运行效率?

    如果DrawCall次数较高,意味着CPU需要花费更多的时间准备和传输渲染数据,这会增加CPU的负担,进行更多的计算。高频次的DrawCall会导致CPU瓶颈,进而影响游戏的整体运行效率,可能导致帧率下降、游戏卡顿等性能问题。

  3. 如何减少DrawCall?

    • 2D和UI层面

      • 打图集:将多个小纹理合并成一个大纹理,可以减少纹理切换的次数,从而减少DrawCall。
      • 层级优化:在面板中,不同图集的图片的层级不要穿插,保持同一图集内的图片连续渲染,避免不必要的图集切换。
    • 3D模型层面

      • 动态批处理(Dynamic Batching):对于小且相似的网格,Unity可以在运行时将多个物体的网格合并成一个网格,以减少DrawCall。需要注意的是,动态批处理对顶点数量有限制,适用于小型网格。
      • 静态批处理(Static Batching):对于不移动的静态物体,可在构建时合并网格。合并后仍受 65535 顶点索引(16 位索引)等限制,且运行时不宜再移动合并体。
      • 光照和阴影优化:尽量不使用实时光照和实时阴影,因为它们会增加额外的DrawCall。可以使用预计算的光照贴图(Lightmap)和烘焙阴影来代替。
    • 其他优化手段

      • 合并网格:手动将多个小的网格合并成一个大网格,减少DrawCall。
      • 减少材质数量:使用少量的共享材质,避免频繁切换材质。
      • LOD(Level of Detail):对于复杂的3D模型,可以根据距离使用不同的模型细节级别,远处使用低细节模型,近处使用高细节模型,减少渲染负担。

36.3 答题示例

“DrawCall 是 CPU 向 GPU 发出的绘制命令,每次都需要准备和传输渲染数据,次数越多 CPU 负担越重,会造成帧率下降。常见优化有:

  1. 纹理打图集、UI 图集层级连续,减少纹理切换;
  2. 启用动态批处理(Dynamic Batching)和静态批处理(Static Batching);
  3. 合并网格、共享材质、使用 LOD;
  4. 使用光照贴图和烘焙阴影,避免实时光照带来的额外 DrawCall。”

36.4 关键词联想

  • CPU → GPU 渲染命令
  • DrawCall 次数
  • 图集 (Atlas)
  • 动态/静态批处理
  • 网格合并 & 共享材质
  • LOD 细节切换
  • 光照贴图 / 烘焙阴影


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

×

喜欢就点赞,疼爱就打赏