UGUI性能优化之Canvas

UGUI 性能优化系列:第二篇——Canvas 与 UI 元素管理 本文深入探讨UGUI性能优化的关键点,聚焦Canvas重建机制与UI元素管理。Canvas作为UI渲染的核心组件,其重建过程(布局重建和网格重建)会显著影响性能,尤其是频繁修改RectTransform、Text内容或LayoutGroup时。优化策略包括: 避免频繁重建:减少Update中的UI属性修改,采用事件驱动更新; 优化LayoutGroup:优先静态布局,动态元素使用对象池; 控制Text更新:用StringBuilder减少字符串生成; 合理分层:通过子Canvas隔离高频变动的UI。 同时 阅读详情

UGUI性能优化之Canvas

前言,觉得好的同学别忘了给个好评哦,另外,如果有什么疑问的,欢迎随时提问~~

自从Unity问世以来,UI一直都存在比较大的问题,自带的OnGUI不能所见即所得,制作过程比较麻烦。于是出现了很多第三方的优秀的UI插件,比如很多项目里面用到的NGUI,或者后来出的FairyGUI。Unity官方在4.x时代开始推出了自己的新UI系统,名为UGUI。由于是官方出品,所以选择使用的人也比较多。

UGUI是一个比较完整的所见即所得式的UI系统, 不过说实在的,我个人感觉它的成熟度还是差了点,有很多需要注意的地方,不然就会产生很多性能上的问题,比如DrawCall问题和运行时的效率问题。我就曾经在项目中遇到了,UGUI用的不好,它产生的消耗比3D场景内的地图和角色消耗还高的情况。这里分享一点经验,主要讲一下UI重绘的消耗和图集的一些问题。

要了解UGUI的一些坑,首先要明白它是基于什么原理来运作的。

首先,UGUI还是基于网格模型渲染的。一个矩形,实际上还是由4个顶点组成的一个mesh显示出来的,和正常的mesh模型渲染一样,它使用了材质球和贴图。我们平常看不到这些元素,是因为渲染UI用的Mesh网格是在运行中才生成的,它默认使用了Untiy内置的一个默认的材质球,然后使用我们指定的UI图片作为贴图。

打开一个Image来看看,可以看出Material是空的,那是因为它有默认的材质球。然后Unity也允许你再指定一个Material来渲染。值得注意的是,这个材质球如果你是直接挂在UI的Image上面,那么如果你在运行时修改Material,将会改到的是Share的原始Material。所以最好的做法是在代码里面生成一个材质球的复制实例,然后再赋给Image使用。

明白了单个UI元件的渲染原理之后,接下来需要说说渲染合并的问题。既然一个Image就是一个Mesh,然后上面有单独的贴图显示。那么是不是就代表着,我一个界面里有有100个UI元件,那么就会产生100个Mesh,产生100个DrawCall呢?

从原理上的确是会这样,但实际运行的时候,并没有产生这样的结果。这里Unity引入了一个Canvas(画布)的概念。在默认创建的UGUI根节点上面,你可以看到这个Canvas

它定义了一些东西,比如当前画布的渲染模式、排序情况。

然后当你往这个Canvas里面添加其他UI元件的时候,这些元件实际上就是被这个Canvas统和在一起了。比如,同一个Canvas里面有100个Image,Canvas将会把100个单独的Mesh合并成一个大的ShareMesh,用于渲染。如果刚好这100个Image都是使用了相同的图片或者是同一个图集里面的图片,那么由于使用的Mesh只有一个(ShareMesh),材质球都是同一个(内置的默认材质球),贴图也是同一张,所以得到的结果就是,DrawCall只有一个。

这实际上就是UGUI最基本的优化思路了。合并ShareMesh、合并图集,减少DrawCall。但在实际项目的操作中,会遇到很多问题。

就拿ShareMesh来说,我们可以把场景的静态合并拿来对比一下。这个ShareMesh和场景合并成CombinedMesh是一样的,把很多小模型合成一个大模型。但可以想象,场景的模型合并是静态的,也就是说它是摆在那里不会动的。大部分情况下,UI也是不会动的,在这种情况下,合并ShareMesh没有太大的问题。但还是会有很多会动的时候。比如说,Arpg很喜欢在角色头顶上显示角色名字,名字会跟随着角色移动。再比如,聊天里面不停的刷各种文字聊天信息,或者你需要一个图标从左边飞到右边的动画,或者你的血量条需要动态变化长度之类,等等。这些情况下,由于单个显示元素的Mesh 形状发生变化(文字的改变实际上也是改变了Mesh形状),如果原来这些UI元素就是和其他所有UI元素合并同一个ShareMesh的,那么问题就来了,假如你UI元素非常多,产生了一个2M的ShareMesh(这是一个比较极端的例子,实际上一般的ShareMesh都是几百K,出现这么大的ShareMesh本身就需要注意了),由于一个小顶点发生了改变,导致2M的整体ShareMesh也需要重新的生成顶点信息,并且整个ShareMesh重新渲染,这明显是得不偿失的。你会发现在UI动画的过程中,整个游戏都在卡。卡的是cpu方面的实时合并网格顶点,和渲染那边的整个大Mesh重新绘制。

那么怎么解决这个问题呢?思路也像场景模型和角色模型的关系一样。首先要知道的是,在根节点下面挂了Canvas之后,还是可以在子节点上面继续的挂Canvas的。这样,从理论上说,Unity会找到最小单位的Canvas作合并。既然大部分的UI是不会动的,那么我们可以做一些分层,把不会动的元素放在同一层,然后会动的元素,根据动的频率和类型,分别在他们的子节点上面挂上Canvas。这样就可以在保证大部分UI元素能合并渲染的基础上,减少整体重绘的范围、这就是所谓的动静分离。

Unity UGUI性能优化全解析:从Canvas拆分到合批策略 在游戏开发中,用户界面(UI)渲染是影响应用流畅度的关键技术环节。其核心原理涉及CPU的网格重建与GPU的绘制调用管理,直接决定了应用的响应速度和渲染效率。掌握UI性能优化技术,对于提升用户体验、降低设备功耗具有重要工程价值,尤其在移动端和复杂应用场景中至关重要。本文聚焦于Unity UGUI系统,深入剖析了Canvas拆分、合批优化等核心策略。通过系统性地管理Canvas重建与Draw Call,开发者能有效解决UI卡顿与过度绘制等常见性能瓶颈,为构建高性能交互界面提供实践指南。 阅读详情

相关推荐

Unity UGUI性能优化:Canvas.willRenderCanvases卡顿诊断与实战解决方案

在Unity游戏开发中,UI性能优化是保障流畅体验的关键环节。UGUI系统通过Canvas.willRenderCanvases委托机制,在每帧渲染前统一处理UI元素的重建与合批,其核心原理涉及布局计算、顶点重建和Draw Call优化。当UI元素频繁变更或结构复杂时,该机制可能成为性能瓶颈,导致帧率下降。本文聚焦Canvas.willRenderCanvases的性能诊断,提供从原理分析到工具开发的完整方案。通过自定义诊断脚本精准定位触发源,结合对象池、Canvas分层、更新频率控制等工程实践,系统解决U

weixin_29022115的博客 376

UGUI性能优化:动静分离原理与Canvas划分实战指南

在Unity UI开发中,渲染性能优化是提升应用流畅度的关键。其核心原理在于理解UI系统的渲染管线与批处理机制。UGUI通过Canvas组织UI元素,当元素属性变化时会触发Canvas重建,这是主要的性能消耗点。为了减少不必要的重建开销,工程师们引入了“动静分离”这一技术策略,旨在将更新频率不同的UI元素隔离到不同的Canvas中,从而将重建范围最小化。这项技术的工程价值在于,它允许高频动态元素(如血条、飘字)独立更新,避免“连累”整个静态界面重建,显著提升帧率稳定性。在实际应用场景中,需结合图集管理、层级

weixin_27943395的博客 231

Unity uGUI性能优化与框架设计:从Canvas重建到事件系统实战解析

在Unity游戏和应用开发中,UI系统是连接用户与程序的核心桥梁,其性能表现直接影响用户体验。UI系统通常基于保留模式架构,通过维护UI元素的状态描述来实现高效渲染和事件响应,这一设计在提升开发效率的同时,也带来了Canvas重建、合批优化等特有的性能挑战。理解RectTransform、Canvas与Graphic三大核心组件的协作机制,是优化UI性能、减少Draw Call的关键。在实际工程中,通过Canvas分层策略、合理使用图集以及优化事件系统的射线检测,可以显著提升UI渲染效率。这些技术对于开发高

weixin_34408717的博客 505

Unity UGUI优化(杂篇)

一.天空盒没有必要的话不要显示 如图,一个空场景的定点和三角面都大几千,如果是2d游戏或者用不到天空盒,在MainCamera把ClearFlags换成其他合适的模式 去掉天空盒的无谓开销后属性如下 二.动静分离 这个我了解的方法一般是用新增canvas做 方法一 在当前canvas平级路径新增一个canvas , 有需要动态会导致ui重建的元素就放到新增canvas中,动完再放回来。 这个缺点...

时光不染 1298

UGUI性能优化与疑难杂症实战指南:从Canvas合批到ScrollRect卡顿

在Unity游戏开发中,UI系统的性能与稳定性直接影响用户体验。UGUI作为Unity官方UI解决方案,其核心渲染机制基于Canvas的合批原理,通过合并材质与渲染顺序连续的UI元素来降低DrawCall,从而提升渲染效率。然而,不当使用Canvas重建、Mask组件或ScrollRect等常见功能,极易引发性能瓶颈。理解动静分离、对象池、事件射线检测等关键技术,对于构建流畅、响应迅速的UI界面具有重要工程价值。本文聚焦于UGUI开发中的高频性能问题与交互难题,针对Canvas重建、ScrollRect卡顿

weixin_29010003的博客 306

HIDL概述

HIDL背景 Treble 是 Google Android 团队的一项重大项目,意在 Android 操作系统框架在架构方面的一项重大改变,旨在让制造商以更低的成本更轻松、更快速地将设备更新到新版 Android 系统。Android 7.x 及更早版本中没有正式的供应商接口,因此设备制造商必须更新大量 Android 代码才能将设备更新到新版 Android 系统: 图1 Treble ...

u013357557的专栏 2万+

Unity优化之UI篇(UGUI)

Unity优化之UGUI

w739116149的博客 1990

手把手教你读懂蓝牙BQB射频测试报告:以PRBS9为例的实战分析

本文以蓝牙BQB射频测试中的PRBS9信号为例,提供了一份实战分析指南。文章深入解读了输出功率、调制特性、邻道泄漏等核心测试项,并分享了信号分析仪操作技巧、测试环境搭建要点及设备选型建议,旨在帮助工程师精准解读报告,高效定位问题,确保产品顺利通过认证。

weixin_29289821的博客 261

UGUI--以Image颜色改变来看Graphic以及重绘过程

以Image的Color改变来解读Graphic类以及重绘的过程

m0_65009805的博客 760

通达信源码-金牛暴起

趋势1:=3*SMA((CLOSE-LLV(LOW,27))/(HHV(HIGH,27)-LLV(LOW,27))*100,5,1)-2*SMA(SMA((CLOSE-LLV(LOW,27))/(HHV(HIGH,27)-LLV(LOW,27))*100,5,1),3,1) AND SJTJ,DOTLINE,COLORGRAY;谷:=(((DD-LLV(DD,21))/(HHV(DD,21)-LLV(DD,21)))*(4))*(25);{0,25指高度};

qq_57222058的博客 3521

如何将TDengine集成到Thingsboard?

1 概述 ThingsBoard是用于数据收集、处理、可视化和设备管理的开源物联网平台。它通过行业标准的物联网协议MQTT、CoAP和HTTP实现设备连接,并支持云和本地部署。 ThingsBoard迄今没有导入专业的时序数据库应用,用户可选择的只有PostgreSQL和Cassandra。虽然针对PostgreSQL引入了TimeScale插件,但由于其不是按照宽表的方式组织数据记录,TimeScale的优势根本发挥不出来。总之,这两种数据库不具备高效的数据吞吐能力。 而且,Thingsboard在

Wearable_device的博客 4766

前端性能优化:Canvas

Canvas 最常见的用途是渲染动画,目前,所有的主流浏览器都支持。 渲染动画的基本原理,无非是反复地擦除和重绘。为了动画的流畅,60Hz 刷新率设备的帧预算为 16.67ms,在这个时间之内,计算每个对象的位置、状态,还需要把它们都画出来。高刷设备的帧预算更低。所以需要时刻关注性能,防止计算和绘制耗时过长造成卡顿。 基础优化 1. 在离屏canvas上预渲染相似的图形或重复的对象 对于在每个动画帧上的重复相同的绘制操作,请考虑将其分流到屏幕外的画布上。然后根据需要频繁地将屏幕外图像渲染到主..

薛定谔的猫-前端领域 2698

编译原理(东南大学)一:【编译原理期末冲刺救命笔记】速存!看完再上考场稳了!

本文详细介绍了编译原理的核心概念和流程,包括程序设计语言的分类、编译程序的各个阶段(如词法分析、语法分析、语义分析、中间代码生成、优化和目标代码生成)以及编译程序生成和构造的基础知识。文章还探讨了编译中的表格管理、出错处理和遍的概念,以及编译基础知识如高级语言、语法规则、字母表和符号串的运算。此外,文中还涉及文法与语言的关系,包括文法的概念、非终结符、终结符、产生式、推导和规约等。整体内容旨在为学习编译原理的学生提供全面的复习资料和考试准备指南。

一位搞嵌入式和前端的genius的博客 1027

Unity UGUI Canvas基础知识及优化

unityUGUI源码:https://github.com/Unity-Technologies/uGUI.git 官方API:https://docs.unity3d.com/cn/2018.4/ScriptReference/Canvas.html Canvas 在这里只能讲一些思路,具体实现还是得看项目中运用相对应的处理方式去处理 Cavas的Render Mode是Overlay模式时,永远覆盖在其他物体之上,不受摄像机depth影响 Cavas的Render Mode都是Screen Spa

weixin_43926289的博客 6522

Ubuntu 22.04/24.04 安装 ROS2 完整教程(Humble / Jazzy)

最后更新:2026年2月适用系统:Ubuntu 22.04 LTS(Jammy) / Ubuntu 24.04 LTS(Noble)适用架构:x86_64 / arm64(包括树莓派)

2401_84116277的博客 6007

论文阅读:Training language models to follow instructions with human feedback

这篇论文的目标是通过引入一种基于人类反馈的训练方法,来让语言模型更好地按照用户意图行事。这是因为大规模语言模型虽然强大,但有时候会生成不准确、有偏见或者对用户无帮助的内容,这说明它们和用户的需求之间存在一定的“错位”。论文提出了一个新方法,将 GPT-3 进行优化,称为示例数据与监督学习:让人类标注员生成一些正确行为的示例,并使用这些示例来初步优化模型。比较数据与奖励模型:让标注员比较模型生成的多个输出,并将其排序,从中学到模型输出的优劣规则。强化学习优化:基于这些规则,使用强化学习算法进一步优化模型。

CSPhD-winston的博客 1715

UGUI性能优化实战:从Canvas重建到真机Profile的七层过滤网

Unity UGUI并非简单的界面绘制工具,而是一个深度耦合渲染管线、事件系统与资源生命周期的运行时子系统。其核心机制如Canvas重建(Rebuild)、Graphic Raycaster事件分发、Stencil Mask裁剪开销等,直接决定UI帧率稳定性与内存表现。理解UGUI本质需跳出组件堆叠式学习,转向渲染准备层与提交层的协同视角——例如Text修改触发全Canvas Layout Rebuild,或Mask强制打断DrawCall。技术价值体现在中大型项目中对首屏加载、热更新鲁棒性及多端兼容性的底

weixin_30587927的博客 575

JNI的本质解析:Android Framework视角下的Java-Native衔接机制

本文基于Android 14源码深入分析JNI机制,从Android Framework视角解析Java-Native衔接原理。主要内容包括:JNI的双轨制注册机制(静态与动态注册),核心数据结构(JNIEnv与JavaVM)的实现原理,以及完整的调用链路剖析。文章通过MessageQueue的JNI实现案例,展示Android Framework如何利用JNI实现Java层与Native层的高效交互,并提供了性能优化建议。分析表明,JNI作为Android系统架构的关键桥梁,其设计充分考虑了性能、安全性

保持专注,保持热爱 1210

Unity UGUI性能优化:Canvas.SendWillRenderCanvases全解析

当 Canvas 上的任何一个 UI 元素发生变化触发事件重新构建整个 Canvas 的顶点数据(Rebuild重新合批(Rebatch提交给 GPU 渲染关键点:Canvas 是整体重建的,即使只有一个元素变化,整个 Canvas 都会重建!

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 209

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Unity UGUI性能优化实战:5个让手游帧率翻倍的Canvas设置技巧

本文针对Unity手游开发中UGUI性能瓶颈,提供了5个经过真机验证的Canvas优化技巧。通过精细化拆分Canvas实现动静分离、优化Android纹理压缩(ETC1+Alpha)、禁用不必要的Pixel Perfect与Raycast Target、优化ScrollRect性能以及利用Profiler进行数据监控,能有效降低CPU与GPU负载,显著提升低端设备上的游戏帧率与流畅度。

a1b2c的博客 299

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Unity UGUI性能优化实战:数字孪生项目中的Canvas渲染与控件优化策略

在Unity开发中,UI系统的性能优化是保障应用流畅体验的核心环节。其底层原理主要围绕Canvas的渲染批次合并与Draw Call管理展开,通过优化材质、纹理和渲染顺序,可以有效降低GPU负载,提升渲染效率。这项技术的工程价值在于,它能显著改善复杂应用(如游戏、工业仿真)的界面响应速度与帧率稳定性。尤其在数字孪生、实时数据可视化等高负载场景下,海量的动态UI元素对渲染管线构成了严峻挑战。本文聚焦于Unity UGUI,深入剖析了从基础控件(如图像、文本)的精细化调优,到Canvas分层架构的设计策略,旨在

weixin_30407613的博客 370

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

UGUI动静分离:Canvas重建机制与UI性能优化实战

在Unity游戏开发中,UI性能优化是提升用户体验的关键环节。其核心原理在于理解渲染管线中的合批与网格重建机制:当UI元素属性变化时,会触发Canvas的网格重建,导致CPU开销增加。通过将更新频率不同的UI元素分离到不同的Canvas中,可以有效隔离重建影响,减少不必要的性能损耗。这一技术方案尤其适用于高频变化的数值文本、进度条等动态元素,能显著降低Canvas.SendWillRenderCanvases的耗时。在实际工程中,结合分层Canvas架构与Profiler性能分析,可以构建出高效且可维护的U

weixin_33919950的博客 471

Unity UGUI性能优化:Canvas拆分与GraphicRaycaster配置实战

在Unity游戏开发中,UI渲染性能是影响用户体验的关键因素。UGUI的核心渲染组件Canvas通过网格重建与合批机制来优化绘制调用,但其重建开销可能成为性能瓶颈。理解Canvas的批处理原理,掌握动静分离的策略,对于构建流畅的UI界面至关重要。在复杂的UI系统中,GraphicRaycaster负责处理交互事件,其配置直接影响点击检测的效率和准确性。通过合理的架构设计,如将动态与静态UI元素分离到不同的Canvas中,可以显著降低重建范围,提升运行时性能。这些优化思路在TEngine5等游戏框架的UI模块

lizaochengwen的专栏 166

Unity UGUI Canvas核心原理:渲染模式、多分辨率适配与性能优化全解析

在Unity游戏开发中,UI系统是连接玩家与游戏世界的桥梁,其底层渲染机制与性能表现直接影响用户体验。Canvas作为UGUI的核心容器,本质上是一个UI元素的渲染调度器,它定义了UI的坐标空间转换、绘制顺序与合批规则。理解其工作原理,对于构建流畅、自适应的交互界面至关重要。Canvas通过三种渲染模式(Screen Space - Overlay/Camera/World Space)来应对不同场景需求,从纯2D界面到沉浸式3D UI皆可覆盖。在移动端与多平台开发中,Canvas Scaler是实现多分辨

weixin_27945229的博客 233

Unity UGUI性能优化:用Profiler和反射揪出Canvas.willRenderCanvases的“元凶”

本文深入探讨Unity UGUI性能优化,重点分析Canvas.willRenderCanvases的高耗时问题。通过反射技术监控CanvasUpdateRegistry内部队列,精准定位频繁触发重建的UI元素,并提供动态文本、复杂布局及动画驱动的优化方案,帮助开发者提升UI性能。

weixin_33725722的博客 306

Unity UGUI核心机制与实战:从Canvas布局到性能优化全解析

在游戏与应用开发中,用户界面(UI)系统是连接用户与程序逻辑的关键桥梁。其核心原理在于通过一套坐标变换、事件响应与渲染管线,将视觉元素与交互逻辑高效结合。从技术价值看,一个健壮的UI框架能极大提升开发效率、保障多平台适配性并优化运行时性能。在Unity引擎中,UGUI作为内置的组件化UI解决方案,广泛应用于游戏菜单、HUD、设置面板及复杂的角色自定义界面等场景。本文聚焦于UGUI的Canvas渲染模式、RectTransform锚点系统以及Scroll View等核心组件,通过构建一个包含色相、饱和度、明度

weixin_33100393的博客 354
上一篇: unity3D接入Sign in with Apple
下一篇: UGUI性能优化之图集使用减少Drawcall
星火冰雷
博客等级 码龄6年 10粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值