动态批处理

这是我在《Unity游戏优化 (第2版)》看的,记录一下~

动态批处理可以降低DrawCall,他有啥优势呢?
1.批处理在运行时生成(批处理是动态产生的)
2.批处理中包含对象在不同的帧之间可能有所不同,这取决于哪些网格在主摄像机视图中当前是可见的
3.甚至能在场景中运动的对象也可以批处理

举个例子:


首先需要需要关闭影子显示

关闭静态动态批处理

关闭天空盒子


如图所示,为啥有9个DrawCall呢?
1.有1个批处理渲染场景的背景
2.剩余8个批处理渲染8个对象

那么要是开启动态批处理呢?
减少3个DrawCall(跟在场景的深度有关系,要把球放在方块后面)
因为四个立方体可以合并成一个 Dynamic Batch DrawCall中
但是四个球依然通过独立的DrawCall渲染,因为其不满足合批要求(定点数不超过300)


那么动态批处理的规则是什么呢?
1.所有网格实例必须使用相同的材质引用
2.只有ParticleSystem和MeshRenderer组件可以进行动态批处理(SkinnedMeshRenderer组件和其他所有可渲染的组件都不能进行批处理)
3.每个网格至多有300个顶点
4.着色器使用的顶点属性数不能大于900
5.所有网格实例要么使用等比缩放,要么使用非等比缩放,但是不能两者混用
6.网格实例应引用相同的光照纹理文件
7.材质的着色器不能依赖多个过程
8.网格实例不能接受实时投影
9.整个批处理中网格索引的总数有上限,和GraphicsAPI有关系,一般在32~64K之间


详细解释:
啥玩意是顶点属性?(4)
顶点属性是网格文件中基于每个顶点的一段信息,每一段通常表示为一组浮点数
包括:
a.顶点位置(相对于网格的Root)
b.法线向量(一个从对象表面指向外面的向量)
c.一套或多套纹理UV(定义一张或多张纹理如何包裹网格)
d.每个顶点的颜色信息

只有这些总数小于900的网格才可以进行动态批处理(查看inspterect的Preview里面的verts值)
着色器中,每个顶点使用的属性越多,网格允许拥有的定点数量就越少

比如:
漫反射的定点需要3个属性:位置、法线、UV
如果想用动态批处理就最多有300个顶点的网格
自动生成的球有515个顶点,共有1545个顶点属性,所以不能批处理

啥玩意是网格缩放呢?
等比缩放是xyz三个分量都相同
非等比缩放是xyz至少有一个是不同的

比如:
A(1,1,1),B(2,1,1),C(2,2,1),D(2,2,2)
A和D就是等比缩放,会在一个批处理中
B和C就是非等比缩放,会在另一个批处理中

如果为负数缩放,与负数值的奇偶个数有关
a.如果只有一个或者三个轴是负数,会放在一个批处理中
b.如果没有或者对两个轴是负数,会放在另一个批处理中

V(1,1,1),W(-1,1,1),X(-1,-1,1),Y(-1,-1,-1),Z(1,1,1)
本来以为:V和Z是一样的,会放在一个批处理中
但是却不会


总结:
渲染大量简单网格,动态批处理就很有用
比如大量外观几乎相同的简单物体:
1.到处是石头、树木或者灌木林
2.有很多简单而常见的元素
2.简单的集合体和粒子特效等

啥时候批处理对性能有损害呢?
场景中有数百个简单对象,但是每个批处理只有几个对象
这样检测和生成这么多小批处理组的开销成本就会比为每个单独网格执行DrawCall开销还要多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值