美文网首页
Draw call的优化方案

Draw call的优化方案

作者: 游戏创作者 | 来源:发表于2020-09-01 22:02 被阅读0次

    我们在面试的过程中经常被问到的一个问题就是Draw call,那么Draw call是什么、到底有多重要、哪些因素会影响它、我们怎么去优化它?

    1. Draw call是什么?

    Draw call是CPU对底层图形绘制接口的调用命令GPU执行渲染操作,渲染流程采用流水线实现,CPU和GPU并行工作,它们之间通过命令缓冲区连接,CPU向其中发送渲染命令,GPU接收并执行对应的渲染命令。

    2. 到底有多重要?

    如果Draw Call的数量太多,CPU就会把大量时间花费在提交Draw Call 上,造成CPU的过载,会影响帧率。建议Draw call次数保持在50以下,总之越少越好。

    3. 哪些因素会影响它?

    要减少Draw call次数,就需要批处理,把小的Draw Call合并到一个大的Draw Call中。但是我们批处理的时候往往会被阻断,这里我们就要搞清楚哪些情况会被阻断:

    • Label
    • Mask
    • 粒子
    • And so on

    4. 我们怎么去优化它?

    这里我们举几个例子来看一下,用cocos creator 2.4.2做参考(不同引擎不同版本可能结果不一样)。

    我们新建一个空场景,发现Draw call是1


    空场景.jpg
    1. Label + Sprite


      一个Item.jpg

      如上图我们添加了一个item(Label + Sprite)发现Draw call变成3了,这很好理解,图片一次,文字一次。但这个不是我们想要的,照这样发展下去,2个item有5次,3个item有7次。。。。那么100个就有201次,这很恐怖了,如下图:


      超多drawcall.jpg
      怎么优化呢?
      我们可以让这文字也变成图片,和这张图片合在一起处理,这时候就可以用Bitmap font或者TextAtlas去代替文字,不管加多少个Item,Draw call次数都不会增加,如下图:
      处理后.jpg
    2. Sprite + Mask + Sprite
      我们在空场景中创建一个空节点,然后给这个节点上面添加一个Mask组建,发现Draw call次数变成3了,也就是说一个Mask有两次Draw call


      一个Mask.jpg

    但只是这样吗?显然不是,请看下面两张图:


    正常顺序.jpg
    调整顺序后.jpg

    这两张图片其他什么都一样,只是Mask在节点树中的位置发生了变化,导致了Draw call次数增加。
    这种情况还比较好处理,我们尽量不要让Mask在Sprite之间。
    如下图,像Mask+Sprite这种每增加一个Item Draw call就会增加3,比Label + Sprite还恐怖,这种情况又该怎么处理呢?

    多个带Mask的Item.jpg

    相关文章

      网友评论

          本文标题:Draw call的优化方案

          本文链接:https://www.haomeiwen.com/subject/awxbsktx.html