游戏图形的批处理渲染和优化分为:Unity的静态批处理技术和Unity动态合批技术。有过很多学习Unity技术的同学想要了解Unity动态合批技术详细教程。今天小编就具体为大家进行分布介绍。
动态批处理
想象一个场景:一场激战,双方射出的箭矢在空中飞舞,数量众多,材质相同;但是因为它们都在运动,所以不能进行静态批处理;如果这些箭头是一一绘制的,会导致draw命令的调用非常多。
激烈的战斗
对于这些具有简单模型和相同材料但在运动中的物体,是否有合适的批处理策略?是的,动态批处理就是为了解决这样的问题。
动态批处理没有静态批处理那样的预处理阶段,它仅在程序运行时发生。动态批处理会在每次绘制之前将可以批处理的对象“排序”在一起,然后将这些单元的网格信息“合并”,然后只向GPU发送一个绘制命令即可将它们作为一个整体完成绘图。
动态批处理比较简单,但还是有两点需要注意:
1、 批处理并不意味着在绘制之前“合并网格”。动态批处理不会在绘制之前创建新的网格。它只是将可以参与批处理的单元的顶点属性连续填充为一个块。顶点和索引缓冲区,让 GPU 认为它们是一个整体。
在 Unity 中,引擎已经自动分配了每种可以动态批处理的渲染器通用的顶点和索引缓冲区,因此动态批处理不会频繁创建顶点和索引缓冲区。
MeshRenderer 和 SpriteRenderer 在动态批处理时使用通用的顶点和索引缓冲区
ParticleSystemRenderer 在动态批处理时使用与 MeshRenderer 不同的公共顶点和索引缓冲区
2、批处理前会处理每个顶点的顶点属性
在用数据填充顶点和索引缓冲区之前,引擎会处理批处理网格的每个顶点信息,并将其在空间上转换为世界坐标系。
这是因为这些对象可能不属于同一个父节点,所以不能进行统一的空间变换(local to world),每个顶点的坐标都需要先转换到世界坐标系才能发送到渲染管线(所以在Unity中,在合并对象的顶点着色器中传入的M矩阵就是单位矩阵)。
Unity 动态批处理条件
比起上面看起来有点厉害但本质上没用的知识,了解动态批处理规则其实更重要。例如:
着色器是一样的;
Mesh顶点数不能超过300,顶点属性不能超过900;
●缩放不能为负(x、y、z向量的乘积不能为负)等。但我个人认为你不需要记住每个条件。除了上面提到的比较重要的情况外,其余的都可以通过FrameDebugger中指出的批量批量失败的原因逆向了解批量情况。
与静态批处理的区别
动态批处理和静态批处理的最大区别在于:
1、动态批处理不会创建常驻内存的“合并网格”,这意味着它不会导致运行时内存显着增加,也不会影响打包时的包大小;
2、动态批处理会在绘制之前将顶点转换为世界坐标系,然后填充顶点和索引缓冲区;静态批处理后,子网格不接受任何变换操作,只有手动批处理的Root节点才能操作,所以不会修改静态批处理的顶点和索引缓冲区中的信息(将传递Root的变换信息通过常量缓冲区);
3、因为2,动态批处理的主要开销是遍历顶点进行空间变换时的CPU性能开销;静态批处理没有这个操作,所以没有这个开销;
4、动态批处理使用根据渲染器类型分配的公共缓冲区,而静态批处理使用自己的专用缓冲区。
总之,希望以上的Unity动态合批技术详细教程能对大家有所帮助!虽然在Unity中,可以动态批处理的渲染器有很多种,它们的批处理规则可能略有不同;但我个人认为原理应该是差不多的,所以这里就不一一介绍了。更多关于“Unity培训”的问题,欢迎咨询千锋教育在线名师。千锋教育多年办学,课程大纲紧跟企业需求,更科学更严谨,每年培养泛IT人才近2万人。不论你是零基础还是想提升,都可以找到适合的班型,千锋教育随时欢迎你来试听。