Ngui和Ugui的区别

article/2025/10/6 14:41:11

NGUI的元素更新:

            UIPanel.LateUpdate采用轮询的方式,每帧都会执行,并且每帧都会有UIPanel.UpdateWidgets这个函数的调用,做的事情就是对这些UI元素的位置、缩放等信息的获取,也就是即使没有变化的UI元素,也会有正常的轮询操作的开销。

UGUI的元素更新:

            Canvas.SendWillRenderCanvas则不是通过轮询的方式,而是通过两个队列:m_LayoutRebuildQueue和m_GraphicRebuildQueue。这两个队列会分别记录Layout和外观(Graphic)发生变化的UI元素,在渲染之前,会在这个回调函数里去处理这两个队列里的元素,即分别进行Rebuild。所以,在UGUI中如果有大量UI元素但是是静态的,则不会有持续开销。

对动态HUD缓存机制的影响(缓冲池)

        -NGUI

                *适量元素(比如血条就需要20、30个让它在池子中,不停出现消失的话)可直接通过Color.alpha = 0去隐藏。这样UI元素的顶点数可被移除掉,也可节省一部分SetActive的开销

                *若有大量激活的UI元素在缓冲池中,开销较大,这时可以考虑二级缓存,在进入战斗的时候依旧可以通过上边的让a=0或1的方式去切换;但是当退出战斗后再让缓冲池里的元素按批的去SetActive(false)禁用掉,这样就可以保证出了战斗之后,这些缓冲池里的元素不会有持续的开销。

                注意:尽量不用Scale = 0 ,这仅仅把网格Scale为0,但顶点数还在,DC依旧会提交!

        -UGUI

                *Scale = 0,或挂一个Alpha Group = 0,这两种均可去掉元素的顶点,且无SetActive这种额外开销。

                注意:但尽量不用Color.alpha = 0这种把透明度设为0的方式,因为这相当于贴了一个透明面片还是会被画到场景中,对DC和OverDraw无影响。   

            

DrawCall合并规则

& 渲染顺序

            -- NGUI:depth

                    通过手动去设置Depth的值,NGUI就会根据值的大小以UIPanel为单位进行一个排序,相同材质的去做合并

            -- UGUI:hierarchy

                    *重叠检测(两个Button的例子)

                    *分层合并(如下图,每个颜色代表一个图集之类的可以合并合批,可以发现第一行相同的颜色进行了合并因为它们层能对应;第二行则不能,因为右侧加了一层黑色,黑色是第0层,而左侧依旧蓝色是第0层,所以层不能对应了,DC就高了;第三行,两边又都有了黑色,所以层又能对应了,就合并了)     

                    

& 调试工具

            -- NGUI:DrawCall Tool

            -- UGUI: Frame Debugger

              

网格更新机制 

    NGUI:UIPanel.LateUpdate两种更新方式

                -- UIPanel.FillDrawCall  更新单个DrawCall

                -- UIPanel.FillAllDrawCall 更新所有DrawCall

    UGUI:Canvas.BuildBatch 更新所有DrawCall

                -- WaitingForJob

                -- PutGeometryJobFence

                -- BatchRenderer.Flush(开了多线程渲染之后)  所以做优化时建议先关闭多线程渲染,然后去观察①②两个函数

综上,在选择时,可以进行NGUI和UGUI的混用。

    在制作功能界面时,DrawCall控制 NGUI>UGUI

    在功能界面的网格更新控制,NGUI >UGUI

    在动态HUD界面(如血条,伤害数字,弹出的一些文本等)的网格更新控制,UGUI >> NGUI(因为UGUI网格合并这块的算法是用C++做的,所以会比在C#做的快很多,而且C#难免会触发一些堆内存的问题)

    所以,战斗外用NGUI,战斗内用UGUI。

一般,DC控制在30ms以内就比较好 

降低界面的渲染开销 

   ===》DrawCall

            -UGUI

                    *Z值 != 0 (Unity5.x之后)的情况本来能合批的,也不能合批了,即限制:只能在herighy里相邻的,并且是相同图集的UI元素才可以进行合并。(eg:z=0时,本来所有红色合并一个,白色合并一个。但是z≠0后,因为在herighy层第一组的红色是和第二组的白色挨着的,第二组的红色和第三组的白色是相邻的,因此不能进行合并了)

                                    

                                * 未“隐藏”元素:Null Sprite , Color.alpha = 0依然会被渲染

                 

                                * Hierarchy的穿插 + 重叠    (如下图,有时候item的size不合适,可能会导致红点和旁边的icon重叠了,导致不能合并DC,看起来没有重叠,但实际上线框是重叠了的话 )(解决:把Icon 和 红点分别放在不同节点下,这样即使有重叠也可以合并了)(然后再去写脚本去对应每个红点和icon之间的对应关系即可)

                 

             -NGUI

                        * UITexture 少用(因为它一般不能和其他合并,除非2张一模一样)

                        * 未“隐藏”元素:Scale = 0

 ===》OverDraw

            * 减少UI层叠

                * 不用Image检测事件

 ===》降低界面的更新的开销

            * 动静分离

                * 降低更新频率

                   * 避免“敏感”操作

                            ——NGUI  元素的隐藏显示引发FillAllDrawCalls(整个网格重建)

                                    比如下图知识点击了这个技能弹出一个遮罩,其他元素都不变,就会引发一个10ms的峰值。

               FillAllDrawCalls常见原因:

                    -------添加、删除元素时,穿插了其他的UIDrawCall

                    -------添加、删除的元素自成一个UIDrawCall

                避免方式:

                        通过 scale = 0 或 alpha 接近0 来“隐藏”(因为这样网格还在,DrawCall也在,不会打乱)

            举例说明:当用SetActive或alpha = 0的时候,NGUI的规则是从UIPanel中移除。而这会导致穿插!再如,每个DC都有范围,比如当前插入的DC depth是5~100,当加入一个depth为10的元素时,理论上应该插入到这里,但是如果它与当前DC图集不一致不能合并,则NGUI的规则是会执行Rebuild,重建整个UIPanel!!

                   * 优化选项(NGUI)

                        === Static  在UIPanel上如果勾选了这个选项,则可节省轮询的开销。  优化移动UIPanel时! (比如把一个很复杂的背包的UIPanel勾选之后,那么在移动这个UIPanel的时候,它下边元素则不会去计算位置,因为它是跟着这个Panel在动)

小Tip:可以设置一个不参与Camera渲染的Layer,然后当需要隐藏的时候,把当前元素或物体的Layer设置为这个不渲染Layer,这没有开销。
 


http://chatgpt.dhexx.cn/article/9EQi6YBF.shtml

相关文章

Unity—UGUI

每日一句:读数、学习 去更远的地方,才能摆脱那些你不屑一顾的圈子 目录 InputFiled输入框 例:用户名和密码 Toggle组件 案例:冷却效果 InputFiled输入框 Text Component 输入文本组件 Text输入内容 Character Limit 输入字符…

【Unity3D】UGUI概述

1 UGUI 与 GUI 区别 GUI控件 在编译时不能可视化,并且界面不太美观,在实际应用中使用的较少。UGUI 在编译时可视化,界面美观,实际应用较广泛。 2 Canvas 渲染模式(Render Mode) Screen Space - Overlay&a…

怎样使用UGUI

什么是 UGUI UGUI 是 Unity 自带的一套 GUI 系统,含有基本的一些 UI 控件。 UGUI 控件有哪些? 我们常用的有 Canvas,Text,Image,Button,Toggle,Slider,Scroll Bar,Scroll…

Unity3D UGUI系列之合批

目录 1. 什么是UGUI的合批1.1 准备工作1.2 批处理1.3 批处理的意义1.4 UGUI的合批 2 分析工具的使用2.1 Frame Debugger的使用2.2 Profiler-UI的使用 3 UGUI合批规则3.1 UGUI合批初体验3.2 UGUI合批被打断初体验3.3 UGUI合批规则详解3.3.1 合批规则3.3.2 合批规则示例13.3.3 合…

unity中NGUI与UGUI的区别?

什么是UI? UI即User Interface(用户界面)的简称。泛指用户的操作界面,UI设计主要指界面的样式,美观程度。而使用上,对软件的人机交互、操作逻辑、界面美观的整体设计则是同样重要的另一个门道。好的UI不仅是让软件变得…

【UGUI】UGUI入门,系统介绍

Unity 2017.1.0f3 常用的UI控件 添加UI控件 创建UI控件时,如果没有Canvas和EventSystem系统会自动创建。 Canvas是画布,是所有UI控件的根类,所有UI控件都必须在Canvas上绘制。如果UI控件不在Canvas下,将无法正常渲染显示。 Eve…

UGUI框架

记录最新学习的UGUI框架。 UIType类保存面板基本信息(名称、路径),该面板会在具体的面板类里面(StartPanel)进行实例化。 public class UIType {private string name;public string Name { get > name; }private …

UGUI的简单理解

1.Canvas(画布) UGUI中几乎所有的组件都要在Canvas下搭建 2.EventSysteam(事件系统) 如果进行UI搭建的时候,缺少或删除了EventSysteam的话会导致UGUI中的组件无法交互,无法发生事件. 3.Panel 平时我们进行UI工程搭建的时候,我们都会先创建Panel面板,创建Panel面板的…

UGUI底层

关于UGUI底层的小知识---上 (转雨松momo) 1 | UGUI原理简述 1.1 原理 首先得生成显示UI用的Mesh,如图1-1所示,一个矩形的Mesh,由4个顶点,2个三角形组成,每个顶点都包含UV坐标,如果需要调整颜色&#xf…

UGUI组件详解

什么是 UGUI UGUI 是 Unity 自带的一套 GUI 系统,含有基本的一些 UI 控件。 UGUI 控件有哪些? 我们常用的有 Canvas,Text,Image,Button,Toggle,Slider,Scroll Bar,Scroll…

【Unity基础】ugui的基础知识篇

文章目录 前言一、常用用可视化控件1、Image2、RawImageI.和Image的区别 3、Text组件4、画布是怎么渲染出可视化UI的?II.这里整理一下渲染相关的关系图,如下: 5、关于画布的布局重构 二、Button交互组件1、Button组件的源码以及使用方式2、Button组件是如…

Unity之UGUI详解

UGUI 文章目录 UGUI六大基础组件概述Canvas对象上依附的:CanvasCanvas ScalerGraphic RaycasterRectTransform EventSystem对象上依附的:EventSystemStandalone Input Module Canvas画布组件Screen Space overlayScreen Space CameraWorld Space CanvasS…

using namespace std

整体认识 —— 解决命名冲突 一个简单的C程序&#xff1a; #include<iostream>using namespace std;int main(int argc,char **argv) {cout<<"hello world !"<<endl;system("pause"); // 让程序暂停,按任意键继续 注意&#xff0c;…

K8S:Namespace详解

Namespace概念 Kubernetes 支持多个虚拟集群&#xff0c;它们底层依赖于同一个物理集群&#xff0c;这些虚拟集群被称为命名空间。 命名空间 namespace 是 k8s 集群级别的资源&#xff0c;可以给不同的用户、租户、环境或项目创建对应的命名空间。 在创建pod的时候可以指定p…

TypeScript中的命名空间—namespace

TypeScript中的命名空间—namespace 什么是命名空间&#xff1f;在很多语言中都有这个概念。 命名空间是为了解决命名冲突。比如你在代码的不同地方&#xff0c;都定义了同名但是不同含义的函数、变量等&#xff0c;虽然不提倡这么做&#xff0c;但是有时候需要这么做。那怎么…

c++ 中的 namespace 用法

多人代码的整合&#xff0c;namespace 还是非常有用的。可以很轻松的避免变量与函数一样的命名 1. namespace 在 单个头文件 中使用 下面给一个简单示例演示命名空间和自定义头文件的使用&#xff0c;代码如下&#xff1a; compare.h&#xff1a; namespace compare{double…

【C++】命名空间(namespace) 以及理解using namespace std

命名空间 1.命名空间使用的背景1.背景 2.命名空间的定义&#xff08;namespace&#xff09;2.1正常的定义2.2 命名空间可以嵌套定义2.3允许命名空间相同 3.域作用限定符&#xff08;&#xff1a;&#xff1a;&#xff09;和命名空间的使用3.1域作用限定符&#xff08;&#xff…

C++ namespace

C namespace 一、什么是 namespace1.1 C语言标识符作用域的缺陷1.2 namespace作用 二、namespace的定义2.1 命名空间可以嵌套定义小技巧 2.2 可定义重复的命名空间 三、namespace使用3.1 命名空间名称作用域限定符使用3.2 using将命名空间中成员引入3.3 使用using namespace将整…

Linux namespace概述

操作系统通过虚拟内存技术&#xff0c;使得每个用户进程都认为自己拥有所有的物理内存&#xff0c;这是操作系统对内存的虚拟化。操作系统通过分时调度系统&#xff0c;每个进程都能被【公平地】调度执行&#xff0c;即每个进程都能获取到CPU&#xff0c;使得每个进程都认为自己…

C++ | 你真的了解namespace吗?

文章目录 一、前言二、命名冲突三、命名空间1、域作用限定符2、命名空间的概念&#x1f449;示例1&#x1f449;示例2 3、命名空间的定义4、命名空间的使用① 指定命名空间访问【做项目】② 使用using部分展开【做项目】③ 使用using namespace全局展开【日常练习】 5、小结 解…