Files
obsidian-notes/3Resources/游戏开发/性能优化/卡片/Unity3D之DrawCalls、Batches和SetPassCalls的关系.md
2025-07-01 18:33:27 +08:00

19 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
原文发布链接: https://blog.csdn.net/Wei_Yuan_2012/article/details/88677172?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
tags:
- 性能优化
- Batch
- DrawCall
- SetPassCall
---
- [[DrawCall]]:CPU每次调用图像编程接口 glDrawElements(0penGl日中的图元清染函数)或者 DrawIndexedPrimitive(Direct中的顶点绘制方法)命令GPU渲染的操作称为一次Draw CallDraw Call就是一次渲染命令的调用它指向一个需要被渲染的图元(primitive)列表不包含任何材质信息glDrawElements 或者 DrawIndexedPrimitive 函数的作用是将CPU准备好的顶点数据渲染出来.**在Unity FrameDebugger中每一项都是一个DrawCall**
- [[Batch]]:把数据加载到显存设置渲染状态CPU调用GPU渲染的过程称之为一个Batch。这其实就是渲染流程的运用阶段最终输出一个渲染图元(点、线、面等)再传递给GPU进行几何阶段和光栅化阶段的渲染显示。**一个Batch必然会触发一次或多次DrawCall且包含了该对象的所有的网格和顶点数据以及材质信息。把数据加载到显存是指把清染所蛋的数据从硬盘加载到内存(RAM),再将网格和纹理等加载到显卡 VRAM)**,这一步比较释耗时。设置清染状态就是设置场景中的网格的顶点 Verex)片元(Fragment)着色器光源属性材质等。Unitv提供的动态合批(Dvnamic Batching)合并的就是这一过程将清染状态相同的对象合并成一个Batch减少DrawCall。
- [[SetPassCall]]:Shader脚本中一个Pass语义块就是一个完整的渲染流程一个着色器可以包含多个Pass语义块每当GPU运行一个Pass之前就会产生一个SetPassCall所以可以理解为一次完整的染流程次数。
由此可见一个Batch包含一个或多个DrawCall都是产生是在CPU阶段而目前普遍渲染的瓶颈恰恰就是CPUGPU的处理速度比CPU快多了Draw Call太高CPU会把大量时间花费在处理Draw Call调用上如果Batch太大CPU需要频繁的从硬盘加载数据切换渲染状态这个消耗要比DrawCall大所以后面Unity才逐渐弱化了DrawCall的显示。
再提一下优化的时候还要关注下Statistics窗口上的三角形数(Tris)和顶点数(Verts),这两个数据也是会影响到性能,比如**单个物体的顶点数最好不要超过900不然会影响到Unity的动态合批**。Unity的Statistics窗口上的三角形数(Tris)和顶点数(Verts)并不仅仅是视链中的梯形内的三角形数和顶点数而是Camera中 feld ofview所有取值下的三角形数和顶点数也就是说即使当前Gam视图中看不到这个 cube只有 field ofview在1-179 范围内都看不到这个cubestats面板才不会统计GPU才不会渲染否则都会渲染而且Unity不会把模型四拆分这个模型哪怕只有1个顶点需要渲染Unity也会把整个模型都渲出来。