优化:UGUI 对Drawcall 的影响

张开发
2026/4/6 11:17:48 15 分钟阅读

分享文章

优化:UGUI 对Drawcall 的影响
理解UI性能瓶颈首先看看Unity中的UI性能瓶颈主要集中在哪些方面通常包含以下几个方面Draw Call过多每个UI元素都会产生一个Draw Call Draw Call 是每次渲染器调用GPU绘制一组图元如三角形、线条时所发出的命令。过多的Draw Call会增加渲染开销降低性能导致渲染开销过大。Canvas重建频繁Canvas是Unity中用于承载和管理所有UI元素的根对象。每个UI元素必须附加在一个Canvas上Canvas重建是指当Canvas上的UI元素发生变化时整个Canvas需要重新绘制频繁的重建会影响性能同一Canvas内所有元素都会被重建不会影响父Canvas或其他Canvas。内存使用不当大量图片、字体等资源的加载和未优化的内存管理会导致内存占用过高。复杂的UI逻辑复杂的UI逻辑和动画也会增加CPU负担。Canvas ReBuild当Canvas下的UI元素发生变化时Canvas会被标记为Dirty脏并在下一帧重新执行合并和计算这个过程被称为Rebuild。如果触发过于频繁会导致CPU峰值造成卡顿Rebuild的执行入口是CanvasUpdateRegistry类它监听了Canvas的willRenderCanvases事件每帧渲染前触发并通过PerformUpdate方法分三步处理先处理布局重建再执行裁剪最后处理图形重建布局重建 (Layout Rebuild)重新计算UI元素的位置和大小RectTransform修改RectTransform属性使用Layout Group如GridLayoutGroup且子元素发生变化文本内容变化导致尺寸变化CPU耗时高涉及层级遍历和排序计算网格重建 (Mesh Rebuild)重新生成UI元素的网格顶点、UV和颜色数据修改Image的Sprite修改Text的文本、字体、颜色修改材质或纹理CPU 内存带宽生成顶点数据并上传至GPU每个Canvas都有独立的渲染批次所以合理地将UI元素分组到不同的Canvas可以减少Canvas的重建频率。一般建议将动态变化频繁的UI元素与静态的UI元素分开使用多个Canvas。UI的性能优化不需要射线检测的UI取消勾选raycastTarget。UGUI会自动合并批次原理是它会把一个Canvas 下的所有元素合并在一个Mesh 里。如果Canvas下的元素很多任意一个元素发生位置 大小 的改变就需要重新合并所有元素的Mesh 。如果元素非常多的话可能就会造成卡顿。一个比较好的做法就是每个UI界面都设置成一个Canvas 。如果这个界面的元素比较多可以考虑多套几个Canvas 。尤其是会频繁改变位置大小的元素。这样就可以降低它合并Mesh的开销。而且层级管理更方便。但是Canvas 套的太多也不太好Mesh合并是降低了但是DrawCall上去了因为每个Canvas 都会单独占用一个DrawCall。需要根据需求去取舍。每个图片材质都会产生一个dc, 只有通过打包图集才能合并dc,。同个图集内的图片dc都为1。不同图集渲染顺序的交叉会产生额外dc所以界面尽量按图集整理UI顺序调整 UI 节点的层级顺序确保bottomUI规则满足UGUI的合批规则是自动计算元素的层级。先排除掉activefalse使用scale0或Canvas Group0RectMask2D 替代 Mask‌Mask 会增加额外的 DrawCall改用 RectMask2D 可减少开销在运行前合并静态 UI 元素UGUI优化drawcall得常用手段,就是将GUI得图片打成图集(1)开启图集模式; Editor--Editor设置 --Sprite Packer(2)哪些图片打入到同一个图集,就指定这些图片,将被导入到哪个图集;(3)启动打包生成图集;Text会打乱我们得drawcall 导致drawcall增加unity会根据UI层级位置,对场景影响,来改变物体得层级关系绘制顺序;再不影响场景效果得情况下,Unity会对UGUI进行绘制顺序得优化,能尽可能得降低drawcall; 如果Text影响了绘制效果,那么这个时候unity是不会调整顺序,所以drawcall 增加;Text是什么原理呢?Text对于Unity而言,底层用得和Image是同样得shader;Text--Image是一样得,就是现实得文字贴图;Unity:Text得核心原理:通过Text组件矢量字库字体大小文本内容生成一个文本内容现实得效果,生成一个贴图;底层 文本作为贴图来対待:只不这个贴图,不是 lmage,不是美术做得,而是通Text件矢量字库绘制制到一个纹理贴图対象上Rawlmage对drawcall影响Rawlmage与Image有什么区别?Rawlmage: Texture Sprite; Image - Sprite;Rawlmage支持设置我们的uv坐标; Image不支持;Image还可以做一起其它的效果,比如九宫格,。。。Rawlmage单独占用一个drawcall,无法合并drawcall;同一图集的不同图片Rawlmage也不能合并drawcall,除非同一张图片; 同一图片Rawlmage-合并;优化图片资源UI中的图片资源通常占用大量内存因此优化图片资源是内存优化的关键。压缩纹理使用Unity内置的纹理压缩Texture Compression将图片资源进行压缩以减少内存占用和加载时间。Unity支持多种纹理压缩格式如DXT、PVRTC等工具可以显著减少纹理占用的内存。合理的图片尺寸确保使用的图片尺寸与显示尺寸相匹配避免使用过大的图片。优化字体资源字体的渲染也会占用大量内存特别是在使用动态字体时。使用静态字体尽量使用静态字体替代动态字体静态字体只加载所需的字符集。字体缓存通过缓存字体纹理减少字体的重建开销。加载异步加载可以在不阻塞主线程的情况下加载资源特别适合于加载大图片或复杂UI对于不需要立即显示的UI元素可以采用延迟初始化的策略在需要时再进行加载和初始化

更多文章