【Unity】DrawCall 研究随记
参考文档:1. BatchBatchBatch.PDF
参考文档:2. DrawCall,Batches,SetPass calls是什么?原理?【匠】
DrawCall (绘制调用) 是什么
DrawCall就是CPU调用图像编程接口,比如 DirectX 的 DrawPrimitive/DrawIndexedPrimitive ,OpenGL 的 glDrawElement/glDrawArrays,以命令 GPU 进行渲染的操作
简单来讲,就是指 CPU 向 GPU 发送一条指令,用于进行渲染操作。即:DrawCall 就是一次渲染指令调用
Batches (批处理)又是什么
把数据加载到显存,设置渲染状态及数据,CPU 调用 DrawCall 的这一整个过程就是一个 Batch。
这个过程当中主要性能消耗点在于上传物体数据(加载到显存)和设置渲染状态及数据这一块,而不是DrawCall命令本身。
所以我们将多个 DrawCall 合并为一个 DrawCall 来减少调用DrawCall的开销(主要是调用DrawCall之前的一系列设置)
这个操作就是 Batches 批处理。
什么会造成DrawCall增加
1.无法合批/打断合批
1.Batch Breaker: Texture Change
纹理的更改会造成合批被打断,即:会增加 Batches 的数量,而 Sprite 的更改不会。
解决方法:若要降低 DrawCall ,可使用打包图集的方法。
RawImage 的图片更换则一定会打断合批。
2.Batch Breaker: Transform Change
位置、旋转、缩放、等空间变化的更改会打断合批。
解决方法:在 UGUI 的使用中进行动静分离,以减少 UI 重绘,降低 DrawCall
3.Batch Breaker: Material Change
不同材质的物体也没办法进行合批,会造成合批被打断
解决方法:1.使用材质图集将多个纹理合并为一个纹理,以便多个对象可以使用同一个材质,从而实现合批。
2.使用 Material Property Blocks 进行材质的动态属性修改
示例:
// 获取材质实例
Material instanceMaterial = renderer.material;
// 使用 Material Property Blocks
MaterialPropertyBlock propertyBlock = new MaterialPropertyBlock();
propertyBlock.SetColor("_Color", Color.red); // 修改颜色
renderer.SetPropertyBlock(propertyBlock);
2.透明物体
透明图片需要单独处理透明度和深度排序
每个透明物体通常需要一个单独的 draw call
因此,不透明图片尽量不开启Alpha通道,如非必要,不使用透明物体以及透明图片,因为透明图片需要单独处理透明度和深度排序
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)