当前位置:   article > 正文

Unity中Batching优化的动态合批_unity ui动态合批处理

unity ui动态合批处理


前言

我们来解析一下上篇文章中提到的 Batching 中的 动态合批


一、动态合批的规则

在这里插入图片描述

动态合批是Unity默认去执行的,我们无法控制中间的步骤,我们只能按照Unity指定的规则去做

1、材质相同是合批的前提,但是如果是材质实例的话,则一样无法合批。

什么情况下会产生材质实例呢?
在之前使用协程控制Shader材质变化的文章中,修改材质使用 .material 来修改会导致生成材质实例

2、支持不同网格的合批

3、动态合批需要网格支持的顶点条件

  • 单个网格最多 225 个顶点,900个顶点属性。(顶点属性的上限未来可能会调整)
  • 如果Shader中用到了网格的Position、normal 和 uv 的话,则最多 225 个顶点
  • 如果Shader中用到了网格的Position、normal 、uv0 、uv1 和 tangent 的话,则最多是 180 个顶点
  • 负方向缩放会导致无法动态合批,早期Unity缩放不一致也会导致无法动态合批

这里的顶点属性,指的是 顶点位置信息、顶点法线信息、顶点切线信息 等这些属性


二、我们导入一个模型并且制作一个Shader,来测试动态合批

1、我们选择模型的 Mesh ,可以查看模型的顶点信息

在这里插入图片描述

可以在Mesh信息中,了解到入下信息:

  • 顶点有 200 个,占用 9.4k
  • 顶点属性包含Position,Normal,Tangent,UV0

2、我们先来测试一下 225 个顶点限制的动态合批

Shader "MyShader/P2_6_2"
{
    Properties
    {
        
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                
                float4 vertex : SV_POSITION;
            };
            

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
               
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                return 1;
            }
            ENDCG
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 我们给 这个顶点数小于 300 的模型,使用这个Shader材质,我们会发现只有两个批次

在这里插入图片描述

  • 我们复制一份该模型,因为使用了同一个材质,所以被动态合批了,还是只有两个批次

在这里插入图片描述

  • 我们创建一个新的球体,因为使用了不同的材质,所以现在渲染了3批次

在这里插入图片描述

  • 但是,我们给该球使用同一材质时,会发现还是使用了3个批次

原因是:该球体的Mesh顶点数超过了300,不支持动态合批

在这里插入图片描述

3、我们来测试一下Shader中使用了 Position、normal 、uv0 、uv1 和 tangent 最多只能180个顶点以下的动态合批

如果这几个属性只是在Shader的appdata中声明,并不算真正的用到该属性

Shader "MyShader/P2_6_2"
{
    Properties
    {
        _Color("Color",Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float3 normal : NORMAL;
                float3 tangent : TANGENT;
                float2 uv1 : TEXCOORD1;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 pos : SV_POSITION;
                float2 uv1 : TEXCOORD1;
                float3 normal : TEXCOORD2;
                float3 tangent : TEXCOORD3;
                float3 worldPos : TEXCOORD4;
            };
            
            fixed4 _Color;
            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.worldPos = mul(unity_ObjectToWorld,v.vertex);
                o.uv = v.uv;
                o.uv1 = v.uv1;
                o.normal = v.normal;
                o.tangent = v.tangent;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                return i.worldPos.y * 0.15 + _Color;
            }
            ENDCG
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 可以看出,虽然我们的物体还是之前的两个板凳。但是批次变成了3次。说明没有动态合批成功

在这里插入图片描述

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号