性能优化(23)——Unity中的Batching(下)

  1. 1. Batching的使用限制
    1. 1.0.1. Static Batching限制(较少)
    2. 1.0.2. Dynamic Batching限制
    3. 1.0.3. GPU Instancing限制
    4. 1.0.4. SRP Batching限制
  • 2. 合批失败的原因汇总(Unity2022版本上最全最新)

  •  

    Batching的使用限制

    Static Batching限制(较少)

    • 额外内存开销
    • 64000个顶点限制:Unity下,一旦静态合批后的对象网格顶点数超过64000个,就会自动开启下一个静态合批
    • 可能影响Culling剔除的结果

    Dynamic Batching限制

    • 合批后的对象不能超过900个顶点属性
      • 顶点属性,而不是900个顶点。如:你的基础顶点有位置、颜色、法线、UV坐标四个属性时,那么最大的顶点数就不超过900/4=225个顶点
    • 除了渲染阴影对象外,相同材质,不同材质实例也不能合并
      • 就是说,即使你复制了两个一模一样的材质赋给两个对象,即使材质属性内容一模一样,也不能进行动态合批
    • 具有光照贴图的游戏对象如果有附加渲染器参数时,如果需要动态合批这些对象,它们必须指向相同的光照贴图位置
      • 也就是要有相同的光照贴图UV才能进行动态合批
      • 这个要求非常苛刻,所以大部分具有光照贴图的游戏对象很难做到动态合批
    • 着色器具有多Pass的材质对象无法动态合批
    • 受多个光照影响的游戏对象,即使满足动态合批条件合批后,也只会受到一个光源影响
    • 延迟渲染下不支持动态合批
    • CPU开销可能会增大,需要测试开启使用

    GPU Instancing限制

    • 需要图形API版本与Shader版本的支持
      • 移动设备上需要OpenGL es3.0以上版本的支持
    • GPU Instancing与SRPBatcher不兼容
    • 不同绘制API的参数与绘制个数不同
    • 渲染顶点数较少的网格时,效率可能会较差(测试使用)

    SRP Batching限制

    • 需要图形API对Const Buffer的支持
    • 必须是SRP渲染管线
    • Shader必须是compatible时才能生效
    • 粒子对象不能做SRP Batching合批
    • 使用MaterialPropertyBlocks的游戏对象不能合批

    合批失败的原因汇总(Unity2022版本上最全最新)

    • 这些原因一般都会显示在Frame Debug中抓取的管线信息,如下图所示的位置

    • 补充:
    • 1.由于要走多个灯光Pass所以不能合批
    • 2.即使材质的属性数值完全相同也不行
    • 3.这里的不能合批是指在Shadow Pass中的合批
    • 2.对象不能进行GPU Instancing合批
    • 4.这种情况主要是由于静态批次合并的网格顶点数达到64000时,即使两个对象一样,距离也临近,但还是会拆到两个批次中去
    • 2.这种情况一般发生在粒子对象定义了Additional Vertex Stream时
    • 5.因为这种情况它也没有对象可以合


    • 4.也就是一个SRP Batcher Const Buffer内容达到最大时,会进行Flush操作,这时会自动开启下一个SRP Batcher
    • 6.节点材质需要改变渲染设备状态时,会切换SRP Batcher。因为所有渲染器状态切换都会进行一个新的Set Pass Call
    • 7.因为这时前面也没有任何对象进行渲染
    • 8.这种情况一般是你修改了管线中默认的顶点数据结构,两个不同顶点结构的网格对象是不能进行合批的