美文网首页
UGUI batch drawcall

UGUI batch drawcall

作者: WENGH | 来源:发表于2023-11-06 12:02 被阅读0次

    元素之间的合批是有条件的:层级、纹理、渲染方式,当这三者都相同的时候,就会合批(Batch)。
    先来说说纹理和渲染方式,因为它们是最好理解,也最好处理的。

    • 纹理:其实就是贴图,如果使用的是同一张贴图,或者是同一张图集中的不同贴图,就可以认为它们的纹理是相同的;
    • 渲染方式:渲染方式是由Shader计算的,在unity中,Shader是附着在材质球Material上,通过给元素添加Material来指定渲染方式。所以,可以简单的理解为,材质球Material相同,即可认为它们的渲染方式相同;这里需要注意的是,UI元素(Image、Raw Image、Text)的Material为None时,UGUI会给它指定默认的材质球UI-Default。
    • 层级。层级很好理解,但确是最难处理的,同时它也是合批的首要判定条件。
      层级相同,则会判断纹理,纹理一致,再看渲染方式,都一致,则开始合批处理数据,处理完数据后将其添加进命令缓存区,GPU接收到命令就会开始渲染。
      同一个Canvas内,UGUI的层级计算方式:
      1、一个UI元素,在它所占的屏幕范围内(通常是矩形),如果没有任何UI在它的底下,那么它的层级号就是0(最底下);
      2、如果一个UI在其底下且该UI可以和它合批,那它的层级号与底下的UI层级一样;
      3、如果一个UI在其底下但是无法与它Batch,那它的层级号为底下的UI的层级+1;
      4、如果有多个UI都在其下面,那么按前两种方式遍历计算所有的层级号,其中最大的那个作为自己的层级号。
      ————————————————
      版权声明:本文为CSDN博主「星火冰雷」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
      原文链接:https://blog.csdn.net/Aison_/article/details/114064460

    一、RectMask2D
    RectMask2D不需要依赖一个Image组件,其裁剪区域就是它的RectTransform的rect大小。

    性质1:RectMask2D节点下的所有孩子都不能与外界UI节点合批且多个RectMask2D之间不能合批。
    性质2:计算depth的时候,所有的RectMask2D都按一般UI节点看待,只是它没有CanvasRenderer组件,不能看做任何UI控件的bottomUI。
    二、Mask
    Mask组件需要依赖一个Image组件,裁剪区域就是Image的大小。

    性质1:Mask会在首尾(首=Mask节点,尾=Mask节点下的孩子遍历完后)多出两个drawcall,多个Mask间如果符合合批条件这两个drawcall可以对应合批(mask1 的首 和 mask2 的首合;mask1 的尾 和 mask2 的尾合。首尾不能合)
    性质2:计算depth的时候,当遍历到一个Mask的首,把它当做一个不可合批的UI节点看待,但注意可以作为其孩子UI节点的bottomUI。
    性质3:Mask内的UI节点和非Mask外的UI节点不能合批,但多个Mask内的UI节点间如果符合合批条件,可以合批。
    从Mask的性质3可以看出,并不是Mask越多越不好,因为Mask间是可以合批的。得出以下结论:
    当一个界面只有一个mask,那么,RectMask2D 优于 Mask
    当有两个mask,那么,两者差不多。
    当 大于两个mask,那么,Mask 优于 RectMask2D。

    三、drawcall数和渲染顺序
    利用本文的性质,再利用上一篇的知识,就可以精算出一个带有mask的UI的drawcall数和渲染顺序。多利用 Frame Debugger 窗口多多练习,熟能生巧!!

    相关文章

      网友评论

          本文标题:UGUI batch drawcall

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