《Unity游戏优化》第三章 批处理

批处理原理

批处理:在3D图形中,批处理是一个非常通用的术语,描述了将大量任意数据块组合在一起并将它们作为单个大数据块进行处理的过程。本文中的批处理通常指用于批处理网格数据的机制。
动态批处理和静态批处理这两种方法本质上是几何体合并的两种不同形式,用于将多个对象的网格数据合并到一起,并在单一指令中渲染它们,而不是单独准备和绘制每个几何体。

很多地方模糊的说 批处理原理是是减少Draw Call,其实严格来说并不对。
其中静态批处理并没有减少DC数量。那静态批处理是优化的什么呢?
首先DC是什么就不赘述了,DC之所以造成性能瓶颈是因为CPU每次为提交GPU所准备的数据和设置渲染状态而消耗了太多的时间。所以如果渲染状态不变,在多次DC调用之间并没有渲染状态的切换,渲染API(Command Buffer)会缓存绘制命令,起到了渲染优化的目的 。

批处理提升此过程的性能诀窍在于,新的DC并不一定意味着必须配置新的渲染状态。如果两个对象共享完全相同的渲染状态信息,那么GPU可以立刻开始渲染新对象,因为在最后一个对象完成渲染后,还维护这相同的渲染状态,这消除了由于同步渲染状态而浪费的时间,也减少了需要推入命令缓冲区CommandBuffer中的指令数,减少了CPU和GPU的工作负载。

动态批处理的工作原理:将所有游戏对象顶点转换到 CPU 上的世界空间,所以仅在该工作小于进行绘制调用的情况下,才有优势。绘制调用的资源需求取决于许多因素,主要是使用的图形 API。例如,对于游戏主机或诸如 Apple Metal 之类的现代 API,绘制调用的开销通常低得多,通常动态批处理根本没有优势。------引自2018.4官方文档

静态批处理的工作原理:将静态游戏对象转换到世界空间并为它们构建一个共享的顶点和索引缓冲区。如果已启用 Optimized Mesh Data__(in the Player settings),则 Unity 会在构建顶点缓冲区时删除任何着色器变体未使用的任何顶点元素。为了执行此操作,系统会进行一些特殊的关键字检查;例如,如果 Unity 未检测到 LIGHTMAP_ON 关键字,则会从批处理中删除光照贴图 UV。然后,针对同一批次中的可见游戏对象,Unity 会执行一系列简单的绘制调用,每次调用之间几乎没有状态变化。在技术上,Unity 不会减少 API 绘制调用,而是减少它们之间的状态变化(这正是消耗大量资源的部分)。在大多数平台上,批处理限制为 64k 个顶点和 64k 个索引(OpenGLES 上为 48k 个索引,在 macOS 上为 32k 个索引)。------引自2018.4官方文档

手动组合彼此接近的游戏对象,比批处理效果更好。例如,一个带有大量抽屉的静态橱柜通常只需在 3D 建模应用程序中或者使用 Mesh.CombineMeshes 来组合成一个网格。----引自2018.4官方文档
https://docs.unity3d.com/2018.4/Documentation/Manual/DrawCallBatching.html
在这里插入图片描述
注意:批次不是越少越好,过大的渲染数据会给内存带宽带来压力,拉高峰值波动上限。

批处理设置

Edit->Project Settin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值