当前位置: 首页 > news >正文

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自动将使用相同材质的对象合并渲染

具体优化方法:

  1. 使用图集:将UI元素打包到同一个图集中
  2. 材质合并:减少不同材质的数量
  3. 静态批处理:对静态对象启用批处理
  4. 动态批处理:对动态对象进行批处理优化
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优化最佳实践

开发阶段:

  1. 早期规划:在设计UI时就考虑DrawCall优化
  2. 图集设计:合理规划图集大小和内容
  3. 材质管理:统一管理UI材质和Shader
  4. 性能监控:使用Unity Profiler监控DrawCall

运行时优化:

  1. LOD系统:根据距离调整UI复杂度
  2. 对象池:复用UI对象减少创建开销
  3. 异步加载:避免UI加载时的卡顿
  4. 内存管理:及时释放不需要的UI资源

平台适配:

  1. 移动端:更严格的DrawCall限制
  2. PC端:相对宽松但也要控制
  3. 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数量,提升游戏性能,特别是在移动端和低端设备上效果显著。

http://www.dtcms.com/a/303914.html

相关文章:

  • Mac安装Navicat步骤Navicat Premium for Mac v17.1.9【亲测】
  • 【腾讯云】EdgeOne网站安全防护的配置方法 防范盗刷流量 附恶意IP和UA黑名单
  • 学习网址备份(二)
  • Linux 启动流程、密码破解、引导修复完全手册
  • 【智能协同云图库】智能协同云图库第八弹:基于阿里云百炼大模型—实现 AI 扩图功能
  • haproxy应用详解
  • 创建型设计模式-工厂方法模式和抽象工厂方法模式
  • 云端文档管理新纪元:Paperless-ngx与cpolar打造的无边界文件生态
  • Ext JS极速项目之 Coworkee
  • 在WSL中配置VS Code C++开发环境完整教程
  • Java抽Oracle数据时编码问题
  • 百元级工业级核心板:明远智睿×瑞萨V2H,开启AIoT开发新纪元
  • 论文阅读:LMM-Det: Make Large Multimodal Models Excel in Object Detection
  • 从0到1学PHP(三):PHP 流程控制:掌控程序的走向
  • 解析hive sql——将别名表、字段转化为指示表字段
  • 算法思维进阶 力扣 375.猜数字大小 II 暴力递归 记忆化搜索 DFS C++详细算法解析 每日一题
  • 详细说明零拷贝
  • LeetCode 1616.分割两个字符串得到回文串
  • 使用鼠标在Canvas上绘制矩形
  • 【dropdown组件填坑指南】鼠标从触发元素到下拉框中间间隙时,下拉框消失,怎么解决?
  • 前后端分离的项目,有一个计算的功能,是前端计算还是后端计算
  • C/C++离线环境安装(VSCode + MinGW)
  • leetcode热题——螺旋矩阵
  • JAVA中集合的遍历方式
  • Python OpenCV图像增强:高通滤波与浮雕特效实战指南
  • SAP-ABAP:Excel 文件内容解析到 ABAP 内表函数ALSM_EXCEL_TO_INTERNAL_TABLE运用详解
  • 记一次生产环境排查OOM问题,byte[]数组超多
  • 自动调优 vLLM 服务器参数(实战指南)
  • ArkTS懒加载LazyForEach的基本使用
  • 【Delphi】快速理解泛型(Generics)