【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通道,如非必要,不使用透明物体以及透明图片,因为透明图片需要单独处理透明度和深度排序

posted @   皮卡味月亮  阅读(77)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示