UIToolkit下一代UI系统_uitookit-程序员宅基地

技术标签: unity  ui  游戏引擎  UWA学堂  

1. UIToolkit运行时――下一代UI系统

UIToolkit的前身是UIElement,发布于Unity 2018。起初它用于开发Editor编辑面板中的UI,自Unity 2019、Unity 2020起正式支持运行时UI并且更名为UIToolkit,它以Package包的形式存在。自Unity 2021.2起,UIToolkit被官方内置在Unity中和UGUI的地位一致,UIToolkit作为下一代UI系统,设计之初目标就很明确,就是替换掉现有的UGUI系统。

现有的UGUI系统从2014年自Unity 4.6开始至今服务于太多项目,从我的角度来看UGUI使用上并没有太大问题,最大的问题就是效率低。我用UGUI也开发了好几款项目了,每个项目开发阶段都被吐槽UI打开慢、卡顿等等,导致我们不得不花很多时间去优化UI系统。

可循环滑动列表、图文混排、合理的UI划分还有资源按需加载基本上每个项目都要做一遍,尤其是滑动列表只要Item数量超过50个必卡无疑,导致每个项目每家公司都要自己做一遍,然而UIToolkit官方就内置了循环列表的功能。UGUI为什么效率低呢?就拿滑动列表来说吧,超出显示区域以外的面也需要合并Mesh,VBO数据也需要给GPU传,这样元素多提交GPU的数据量就大,还有就是它基于GameObject的方式,导致必然需要加载大量没用的数据,参与序列化的脚本数据有用没用都需要加载,导致几乎没有任何缓存命中率可言。

GameObject的方式致使UI效率低,Unity开发的DOTS就是为了解决GameObject的问题,对DOTS感兴趣的朋友欢迎看我之前的课程《DOTS深度研究之原理分析篇》《DOTS深度研究之应用实践篇》。UGUI还有那几个LayoutGroup、ContentSizefitter组件元素只要多一点就容易卡顿。UIToolkit继承了UGUI做得好的地方,比如Mesh合并就被保留下来,而且内置的ListView和ScrollView自带了无限循环列表的功能,并不会将所有看不见的元素都进行合并与提交GPU。它并没有采用GameObject的方式,参考了Web技术的XML和CSS方案,只保存变化的数据。

期初在UGUI诞生前甚至在NGUI诞生前Unity自己是有一套UI系统的,称之为IMGUI。它的运行原理更恐怖,每帧无论UI是否变化都需要将VB/IB传入GPU中,每个UI元素都要每帧设置渲染状态,DrawCall无疑就会非常恐怖。它在编辑模式下和运行时都同时支持,由于编辑模式下对性能并没有要求,而且编辑面板也不会制作特别复杂的功能,所以IMGUI被广泛应用于拓展编辑器的开发。而运行时的OnGUI几乎没有项目使用,由于使用不便利(没有编辑器),效率低(DrawCall高)的原因,所以后来在AssetStore中诞生了NGUI这样的第三方UI系统。随后在Unity 4.6中Unity官方也开发出UGUI。UIToolkit的诞生是有时代意义的,同时兼顾了编辑模式与运行模式的布局便利性与性能,保证同一套代码资源可以快速移植。UIToolkit目前处于高速发展中,论坛中开发者讨论的非常激烈,版本迭代的速度也非常快,通过UIToolkit被内置在引擎中足以见得官方对UIToolkit的使用决心。

很多朋友看到XML和CSS就联想到UIToolkit使用了上世纪90年代的老技术,还和WPF和WinForm作比较。就我看来XML和CSS只是界面的描述信息,就算是UGUI用的也是YAML来保存的界面描述信息,真正核心的技术应该是如何渲染与优化才对,如下图所示,UIToolkit中不同图集、不同文字、图文混排和不同深度只需要1次DrawCall就可以画完。

​UIToolkit在GPU保存了一份当前UI渲染的VB/IB,当渲染的UI发生变化时它会以最小的代价来更新这份VB/IB,它不会更新全部的VB/IB,只更新变化的部分保证CPU和GPU每帧都能高度运转。为了一次DrawCall能画完,它还实现了一套大而全的Ubershader,同时支持8个图集和1个字体,只要界面满足以上条件就可以一次DrawCall画完,如果对UI原理感兴趣的朋友在文章的后面有详细的介绍。

而且UIToolkit使用的UXML只记录了变化的数据,比如大部分图片在UI中可能永远都不会设置颜色、旋转或缩放。UIToolkit提供了默认参数,只要不修改它,UXML中就不会包含额外数据。反观UGUI它无论如何都需要把颜色、旋转和缩放一类的数据序列化在脚本中,一个复杂的界面可能有500多个元素,然而大量的内存都被白白浪费了,毫无缓存命中率可言,从这一点来看UIToolkit也要比UGUI先进。


1.1 致敬

首先来致敬一下UIToolkit的两位主要开发者Benoit Dupuis(贝努瓦·杜普伊)和 Damian Campeanu(达米安·坎皮努)。感谢在我学习的过程中在unite和官方论坛中多次看到他们精彩的分享与耐心的解答。​

贝努瓦·杜普伊(左) 达米安·坎皮努(右)(图片来自领英)

 

贝努瓦·杜普伊在论坛中多次发布UIToolkit的最新技术栈,以及UIToolkit未来的计划Roadmap解答开发者的疑问。达米安·坎皮努是UIToolkit的主要开发者,而且他还是DOTS编辑器团队的老大。

UIToolkit官方论坛:https://forum.unity.com/threads/ui-update-q3-2021.1138603/


1.2 下一代UI系统

Unity在2018年发布UIElement时我就简单看过,由于当时它只支持Editor面板的UI,所以我就没有继续深入学习。Unity在2019年UIElement改名UIToolkit并且支持运行时UI时我又简单学了一遍,发现它就是基于XML和CSS的20年前的老技术,期初内心是有点抵制的,直到Unity 2021.2正式内置UIToolkit到引擎中,又一次勾起了我学习它的热情。时至今日它依然有很多问题是无法解决的,如:UI和粒子特效叠层、UI和3D模型叠层、UI裁剪粒子特效、3D界面、多UI相机叠层、UI特殊着色器和K帧动画等等。

毕竟UGUI已经好几年都没更新了,一个好引擎必然要跟上时代,替用户解决通用的痛点问题。在我看了UIToolkit最新的Roadmap以后我更加坚信UIToolkit会代替UGUI。目前无法满足需求的地方官方正在积极的开发,UIToolkit已经支持UGUI混合使用、支持Text mesh pro 图文混排和无限滑动列表。未来会支持Shader Graph、3D粒子与UI的叠层和深度问题。大家如果有需求也可以在这个链接中发布自己的想法,这里也能看到官方正在支持以及未来支持的功能。

https://unity.com/roadmap/unity-platform/gameplay-ui-design


1.3 安装UIToolkit

最好使用Unity 2021.2以及以前的版本,此版本中UIToolkit已经内置在引擎中不需要添加额外的Package包。缺点就是不利于查看C#源码,它将DLL内置在引擎中。如果对源码有兴趣的朋友也可以使用Unity 2020.3以及以上版本,但需要手动安装Package包。目前有个别功能只有在Unity 2021.2中才有,所以本教程我采用最新Unity 2021.2.9f1版本,在源码学习部分我会切到Unity 2020.3版本。

如果是Unity 2020版本,如下图所示,需要在PackageManager中添加,com.unity.ui和com.unity.ui.builder两个包,目前两个包的最新版本都是1.0.0-preview.18版本。

"com.unity.ui": "1.0.0-preview.18",

"com.unity.ui.builder": "1.0.0-preview.18",

 com.unity.ui包就是UIToolkit,com.unity.ui.builder包则是UIBuilder,UIBuilder是UXML和USS的可视化编辑器,让使用者不需要手写布局代码,在编辑器中可以方便做出各式各样的界面。

戳此《UIToolkit下一代UI系统》查看全文。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/UWA4D/article/details/123232933

智能推荐

【玩转华为云】手把手教你利用ModelArts实现垃圾自动分类_华为云人工智能 垃圾分类-程序员宅基地

文章浏览阅读1.4k次。本篇推文共计2000个字,阅读时间约3分钟。华为云—华为公司倾力打造的云战略品牌,2011年成立,致力于为全球客户提供领先的公有云服务,包含弹性云服务器、云数据库、云安全等云计算服务,软件开发服务,面向企业的大数据和人工智能服务,以及场景化的解决方案。华为云用在线的方式将华为30多年在ICT基础设施领域的技术积累和产品解决方案开放给客户,致力于提供稳定可靠、安全可信、可持续创新的云服务,做智能世界的“黑土地”,推进实现“用得起、用得好、用得放心”的普惠AI。华为云作为底座,为华为全栈全场景A.._华为云人工智能 垃圾分类

Python 开发桌面应用居然如此简单_python制作桌面端-程序员宅基地

文章浏览阅读6.4k次,点赞4次,收藏86次。我们都知道 Python 可以用来开发桌面应用,一旦功能开发完成,最后打包的可执行文件体积大,并且使用 Python 开发桌面应用周期相对较长假如想快速开发一款 PC 端的桌面应用,推荐使用 Aardio + Python 搭配的方式进行开发1. Aardio介绍Aardio 是一款专注于 Windows 桌面端的软件开发,适用于快速开发一些自用的 PC端桌面工具,并且它支持与Python、JS、Golang 等主流语言进行混合编程它是一款免费的开发工具,简单易学,支持多线程,具有轻巧..._python制作桌面端

IDEA中Spring配置错误:class path resource [.xml] cannot be opened because it does not exist_class path resource [feign/requestinterceptor.clas-程序员宅基地

文章浏览阅读10w+次,点赞71次,收藏72次。如果在运行 Spring 项目时出现了类似于:class path resource [applicationContext.xml] cannot be opened because it does not exist这样的异常 意思就是没有找到你的 .xml 配置文件原因我可以肯定你一定用的是 ApplicationContext ctx = new ClassPathXmlApplicati_class path resource [feign/requestinterceptor.class] cannot be opened becaus

Activiti工作流引擎-程序员宅基地

文章浏览阅读1w次,点赞8次,收藏50次。Activiti是一个工作流引擎, activiti可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN2.0进行定义,业务流程按照预先定义的流程进行执行,实现了系统的流程由activiti进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发维护成本。........._activiti工作流引擎

【BZOJ】【3053】The Closest M Points-程序员宅基地

文章浏览阅读76次。KD-Tree  题目大意:K维空间内,与给定点欧几里得距离最近的 m 个点。  KD树啊……还能怎样啊……然而扩展到k维其实并没多么复杂?除了我已经脑补不出建树过程……不过代码好像变化不大>_>  然而我WA了。。。为什么呢。。。我也不知道……  一开始我的Push_up是这么写的:inline void Push_up(int o){ rep(..._euclidean distance between w and the closest point to w in s v

testng生成报告ReportNG美化测试报告-程序员宅基地

文章浏览阅读184次。testng生成报告ReportNG美化测试报告testng生成报告ReportNG美化测试报告ReportNG 是一个配合TestNG运行case后自动帮你在test-output文件内生成一个相对较为美观的测试报告!ReportNG 里面Log 是不支持中文的,我改过ReportNG.jar源码,具体方法看最下面,也可以找我直接要jar!话不多说直接上环境准备:1,你需要这些架包 ..._testng reportng美化报告

随便推点

C++实现线性表的顺序存储结构_c++使用顺序存储表示方法创建线性表-程序员宅基地

文章浏览阅读2.5k次,点赞6次,收藏48次。C++线性表的顺序存储结构 线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。线性表的特点除第一个元素外,其他每一个元素有且仅有一个直接前驱。除最后一个元素外,其他每一个元素有且仅有一个直接后继。直接前驱和直接后继描..._c++使用顺序存储表示方法创建线性表

重装protobuf报错undefined symbol: _ZNK6google8protobuf7Message11GetTypeNameB5cxx11Ev-程序员宅基地

文章浏览阅读1.4w次,点赞2次,收藏7次。服务器将protobuf版本从2.6.1降级到2.5.0后,重新装回2.6.1,出现报错:protoc: symbol lookup error: /usr/lib/x86_64-linux-gnu/libprotoc.so.9: undefined symbol: _ZNK6google8protobuf7Message11GetTypeNameB5cxx11Ev搜索网上解决办法,发现并...__znk6google8protobuf7message11gettypenameb5cxx11ev

【校招VIP】java语言考点之synchronized和volatile-程序员宅基地

文章浏览阅读356次。synchronized和volatile两个关键字也是校招常考点之一。volatile可以禁止进行指令重排。synchronized可作用于一段代码或方法,既可以保证可见性,又能够保证原子性。_synchronized和volatile

互联网平台经济模式逐渐形成,许多新的创新型企业涌现出来,将会影响到社会的治理结构以及公共政策走向-程序员宅基地

文章浏览阅读461次。作者:禅与计算机程序设计艺术 1.简介在新冠病毒疫情期间,由于经济全面恢复、国内外大量人员返乡、工作日程调整等因素的影响,使得整个社会成为新冠病毒大流行的重灾区。为了减轻生产企业和消费者的不满情绪,提高社会福利水平,防止再次发生类似事件,各地都制定了诸多限制、规范、政策等方面的法律法规,但这些法律法规

ethereum/EIPs-161 State trie clearing-程序员宅基地

文章浏览阅读152次。EIP 161: State trie clearing- makes it possible to remove a large number of empty accounts that were put in the state at very low cost as a result of earlier DoS attacks. With this EIP, 'empty' accou..._eip161

2003与2007导出_导出2003-程序员宅基地

文章浏览阅读120次。using System;using System.Data;using System.Configuration;using System.Collections;using System.Data.OleDb;using System.IO;using System.Web;using System.Web.Security;using System.Web.U..._导出2003

推荐文章

热门文章

相关标签