Unity_UI_NGUI_DrawCall
Unity_UI
五、NGUI进阶
2.DrawCall相关
2.1 DrawCall的概念
DrawCall定义:
- 字面理解:DrawCall就是"绘制呼叫"的意思,表示CPU(中央处理器)通知GPU(图形处理器-显卡)开始渲染
- 概念定义:DrawCall是CPU(处理器)准备好渲染数据(包括顶点、纹理、法线、Shader等等),然后告知GPU(图形处理器-显卡)开始渲染(将命令放入命令缓冲区)的命令
- 简单来说:一次DrawCall就是CPU准备好渲染数据通知GPU渲染的这个过程
性能影响:
- 如果游戏中DrawCall数量较高,会影响CPU的效率
- 最直接的感受就是游戏会卡顿
类比理解(文件拷贝):
假设我们创建10000个小文件,每个文件大小为1kb,然后把这些文件拷贝到另一个文件夹中
你会发现,即使这些文件加起来不超过10MB,但是拷贝花费的时间是很长的如果我们单独创建1个10MB的文件拷贝到另一个文件夹,基本可以瞬间拷贝完毕为什么?
因为每次文件分配操作都需要很多额外的操作,比如分配内存、创建数据等等
这些操作会带来一些额外的性能开销
简单来说,文件越多,额外开销就越大渲染过程与上面的例子非常相似
对于每次DrawCall,CPU都需要准备很多数据发送给GPU
所以,DrawCall越多,额外开销就越大
实际上GPU的渲染效率是很强大的,往往影响渲染效率的是CPU提交命令的速度
如果DrawCall过多,CPU会花费大量时间提交DrawCall,导致CPU过载,游戏卡顿
2.2 如何降低DrawCall数量
在UI层面上:
- 小图合大图:即多个小DrawCall变一次大DrawCall
- 图集(Atlas)技术:将多个小图片合并到一个大纹理中
- 批处理(Batching):Unity自动将使用相同材质的对象合并渲染
具体优化方法:
- 使用图集:将UI元素打包到同一个图集中
- 材质合并:减少不同材质的数量
- 静态批处理:对静态对象启用批处理
- 动态批处理:对动态对象进行批处理优化
2.3 制作UI时降低DrawCall的技巧
1. 通过NGUI Panel上提供的DrawCall查看工具
- 使用NGUI Panel组件中的DrawCall查看工具
- 实时监控UI的DrawCall数量
- 及时发现性能瓶颈
2. 注意不同图集之间的层级关系
- 同一图集的UI元素应该连续渲染
- 避免不同图集元素交错排列
- 合理设置UIPanel的Depth属性
3. 注意Label的层级关系
- Label通常使用自己的字体图集
- 不同字体图集的Label会影响批处理
- 合理安排Label的渲染顺序
4. 优化技巧总结:
优化方法 | 说明 | 效果 |
---|---|---|
图集合并 | 将小图片合并到大纹理中 | 减少DrawCall数量 |
层级优化 | 合理安排UI元素层级 | 提高批处理效率 |
材质共享 | 使用相同材质的UI元素 | 减少材质切换 |
静态批处理 | 对静态UI启用批处理 | 自动合并渲染 |
动态批处理 | 对动态UI进行批处理 | 优化动态渲染 |
2.4 DrawCall优化最佳实践
开发阶段:
- 早期规划:在设计UI时就考虑DrawCall优化
- 图集设计:合理规划图集大小和内容
- 材质管理:统一管理UI材质和Shader
- 性能监控:使用Unity Profiler监控DrawCall
运行时优化:
- LOD系统:根据距离调整UI复杂度
- 对象池:复用UI对象减少创建开销
- 异步加载:避免UI加载时的卡顿
- 内存管理:及时释放不需要的UI资源
平台适配:
- 移动端:更严格的DrawCall限制
- PC端:相对宽松但也要控制
- Web端:考虑网络传输的额外开销
2.5 DrawCall监控工具
Unity内置工具:
- Frame Debugger:详细分析每帧的渲染过程
- Profiler:监控DrawCall数量和性能
- Stats窗口:实时显示渲染统计信息
NGUI专用工具:
- UIPanel DrawCall查看:专门监控UI的DrawCall
- Atlas查看器:检查图集使用情况
- Batch查看器:分析批处理效果
第三方工具:
- RenderDoc:深度分析渲染管线
- PIX:微软的图形调试工具
- 自定义工具:根据项目需求开发专用工具
2.6 常见DrawCall问题及解决方案
问题1:UI元素过多导致DrawCall激增
- 解决方案:使用图集合并,合理分层
- 预防措施:设计阶段就考虑性能限制
问题2:动态UI频繁创建销毁
- 解决方案:使用对象池,复用UI对象
- 预防措施:避免频繁的UI创建操作
问题3:不同材质导致批处理失效
- 解决方案:统一材质,减少材质种类
- 预防措施:建立材质管理规范
问题4:Label字体图集过多
- 解决方案:合并字体图集,减少字体种类
- 预防措施:限制项目中使用的字体数量
通过以上优化方法,可以有效降低DrawCall数量,提升游戏性能,特别是在移动端和低端设备上效果显著。