zoukankan      html  css  js  c++  java
  • 【DrawCall】 unity 动态合批被打断的规律总结

    一。动态合批经常被打断,原因有很多种,最常见的情况有两种:

    1. 由于使用了 不同的材质 而导致不能合批,这种很容易理解;

    2. 由于 层级关系被打断 ( 中间掺杂了 文字或其它图集的图片 ),导致即使是同一个图集里的UI,也会分成两批去渲染。

    第二种是比较难控制的,因为UI层级关系往往比较复杂;

    其它容易出现的原因:

    1.  scale 不同 的物体一般不能合批(所以能通过 Rotation 和 Height / Width 解决的问题,尽量不要用 scale 来解决);

    2.  顶点数过多,导致不能合批;(什么是顶点数? 可不是像素数哦~)

    3. 材质虽然相同,但相关渲染参数设置却不同,也会打断合批;

    4. 多 Pass 的 Shader 会中断 合批;

    5. 不同的 Canvas 下的物体是不会被合批处理的;

    6.

    二。研究一下 层级关系打断合批的规律(先研究2D平面,所有的 PosZ 都是 0):

     这个规律跟逻辑层级(父子关系)没有任何关系,只跟 遮挡顺序 位置 有关系!

    假如有 A、B 两个 Image ,处在 同一个Canvas 下,而且图片来自同一个图集。那么,在没有其它干扰的情况下,它们应该是动态合批的,不论AB是否有重叠的部分。此时只有一个DrawCall。后来,如果又新建了一个文本 T,不论 A、B、T 的父子层级关系是怎样的

    1. 如果 T 覆盖或部分覆盖 在 A 的上面(即遮挡或部分遮挡了 A),图片 B 又 遮挡或部分遮挡了 T,那么现在的渲染顺序是:先渲染 A,再渲染 T,最后渲染 B。这样就变成 3 个DrawCall了。

    2. 如果 后来你把 T 拉到一个 很遥远 的位置,即虽然 T 有能力盖住 A,但是它够不着,最终还是没有遮挡 A 的任何一个像素,此时的渲染顺序是:AB一起渲染,最后渲染 T。即有 2个DrawCall。不论 B 是否覆盖了 A都无所谓,因为相同图集的UI互相遮挡是不会打断合批的。

    3. 如果 T 遮挡了 A,但是 B 没有遮挡 T,那么就不会打断合批,即 AB 一起渲染,再渲染T, 2个DrawCall。

    4.  如果把 文本 T 改为 一个 Image ,这个 Image 的sprite 来自另外一个不同的图集,那么它同样遵从 上述两条规律,完全没有任何区别。

    5. 以上所说的 覆盖或遮挡,是指的 眼睛能看到的遮挡,而不是逻辑上的遮挡,举个例子:

    如果 文本 T 是 overFlow 的,它的 逻辑边界 很小,没有 和 B 接壤,但是 其文本却很长,溢出了逻辑边界,那么实际眼睛看到的是 和情景1 完全相同的模样。此时还是打断了动态合批,有3个DrawCall,等同于 情形1。

    反之同理: 如果文本 T 的逻辑边界很长,但是里面的文字很短,逻辑边界 与 B 接壤了,但是眼睛看不出来,此时等同于情景3,合批没有被打断,有两个DrawCall。

    00

  • 相关阅读:
    [WPF系列] 需要区分的内容
    [WPF系列]基础 Listening to Dependency Property change notifications of a given Element
    [WPF系列]-基础系列 Property Trigger, DataTrigger & EventTrigger
    [WPF系列]-高级部分 Shadowed TextBox
    [WPF系列]-Adorner
    [WPF系列]-使用Binding来同步不同控件的Dependency property
    各类型液晶电视面板解析
    数据库 --> 8种NoSQL数据库对比
    数据库 --> 5种关系型数据库比较
    云计算 --> 三种服务模式IaaS,PaaS,SaaS
  • 原文地址:https://www.cnblogs.com/rollingyouandme/p/14085751.html
Copyright © 2011-2022 走看看