首页 > 其他分享 >(十)Unity性能优化-UGUI优化

(十)Unity性能优化-UGUI优化

时间:2023-09-25 12:33:57浏览次数:59  
标签:Canvas 元素 Unity UI 组件 字体 UGUI 优化 图集

原链接:https://github.com/lwwhb/Unity2022_SUNTAIL_Stylized_Fantasy_Village_Optimization

Unity UI性能的四类问题
Canvas Re-batch 时间过长
Canvas Over-dirty, Re-batch次数过多
生成网格顶点时间过长
Fill-rate overutilization
Canvas画布
​ Canvas负责管理UGUI元素,负责UI渲染网格的生成与更新,并向GPU发送DrawCall指令。

Canvas Re-batch过程
根据UI元素深度关系进行排序
检查UI元素的覆盖关系
检查UI元素材质并进行合批
UGUI渲染细节
UGUI中渲染是在Transparent半透明渲染队列中完成的,半透明队列的绘制顺序是从后往前画,由于UI元素做Alpha Blend,我们在做UI时很难保障每一个像素不被重画,UI的Overdraw太高,这会造成片元着色器利用率过高,造成GPU负担。
UI SpriteAtlas图集利用率不高的情况下,大量完全透明的像素被采样也会导致像素被重绘,造成片元着色器利用率过高;同时纹理采样器浪费了大量采样在无效的像素上,导致需要采样的图集像素不能尽快的被采样,造成纹理采样器的填充率过低,同样也会带来性能问题。
Re-Build过程
在WillRenderCanvases事件调用PerformUpdate::CanvasUpdateRegistry接口
通过ICanvasElement.Rebuild方法重新构建Dirty的Layout组件
通过ClippingRegistry.Cullf方法,任何已注册的裁剪组件Clipping Compnents(Such as Masks)的对象进行裁剪剔除操作
任何Dirty的 Graphics Compnents都会被要求重新生成图形元素
Layout Rebuild
UI元素位置、大小、颜色发生变化
优先计算靠近Root节点,并根据层级深度排序
Graphic Rebuild
顶点数据被标记成Dirty
材质或贴图数据被标记成Dirty
使用Canvas的基本准则:
将所有可能打断合批的层移到最下边的图层,尽量避免UI元素出现重叠区域
可以拆分使用多个同级或嵌套的Canvas来减少Canvas的Rebatch复杂度
拆分动态和静态对象放到不同Canvas下。
不使用Layout组件
Canvas的RenderMode尽量Overlay模式,减少Camera调用的开销
UGUI射线(Raycaster)优化:
必要的需要交互UI组件才开启“Raycast Target”
开启“Raycast Targets”的UI组件越少,层级越浅,性能越好
对于复杂的控件,尽量在根节点开启“Raycast Target”
对于嵌套的Canvas,OverrideSorting属性会打断射线,可以降低层级遍历的成本

UI字体
避免字体框重叠,造成合批打断

字体网格重建

UIText组件发生变化时
父级对象发生变化时
UIText组件或其父对象enable/disable时
TrueTypeFontImporter

支持TTF和OTF字体文件格式导入

动态字体与字体图集

运行时,根据UIText组件内容,动态生成字体图集,只会保存当前Actived状态的 UIText控件中的字符
不同的字体库维护不同的Texture图集
字体Size、大小写、粗体、斜体等各种风格都会保存在不同的字体图集中(有无必要,影响图集利用效率,一些利用不多的特殊字体可以采用图片代替或使用Custom Font,Font Assets Creater创建静态字体资源)
当前Font Texture不包含UIText需要显示的字体时,当前Font Texture需要重建
如果当前图集太小,系统也会尝试重建,并加入需要使用的字形,文字图集只增不减
利用Font.RequestCharacterInTexture可以有效降低启动时间
UI控件优化注意事项

不需要交互的UI元素一定要关闭Raycast Target选项
如果是较大的背景图的UI元素建议也要使用Sprite的九宫格拉伸处理,充分减小UI Sprite大小,提高UI Atlas图集利用率
对于不可见的UI元素,一定不要使用材质的透明度控制显隐,因为那样UI网格依然在绘制,也不要采用active/deactive UI控件进行显隐,因为那样会带来gc和重建开销
使用全屏的UI界面时,要注意隐藏其背后的所有内容,给GPU休息机会。
在使用非全屏但模态对话框时,建议使用OnDemandRendering接口,对渲染进行降频。
优化裁剪UI Shader,根据实际使用需求移除多余特性关键字。
滚动视图Scroll View优化

使用RectMask2d组件裁剪

使用基于位置的对象池作为实例化缓存

标签:Canvas,元素,Unity,UI,组件,字体,UGUI,优化,图集
From: https://www.cnblogs.com/zerobeyond/p/17727688.html

相关文章

  • Unity Mathf
     插值运算 ......
  • 磁盘占用率100% 的优化方案
    1.禁用不必要的系统服务右键点击此电脑,打开管理打开服务寻找SysMain右键属性=》禁用=》停止=》应用SysMain的作用:当开机后,windows会加载大量的应用程序预加载到内存中,会在后台预加载数据(如果是旧版本windows,服务名称为:SuperFetch或DiagTrack)Windows的search......
  • Unity 协程等待某个条件完成
    1.使用WaitUntil,如下图所示:protectedvirtualIEnumeratorUpdateConfig(){configJsonStr="";usingUnityWebRequestrequest=UnityWebRequest.Get(configJsonUri);UnityWebRequestAsyncOperationoperation=request.SendW......
  • 数据结构优化建图
    2023ICPC网络赛2B分治看到1e5给10s以为是根号log的做法,一直在往小的块暴力,大的块O(n)建图想,但这并没有用。实际上有些常数的双log也可以很慢,还是不要根据数据范围把做法锁的太死!考虑优化每个虫洞之内的建图,关键在于那个曼哈顿距离是不独立的。考虑只有一个绝对值怎么做:直接排序......
  • SOLIDWORKS Simulation:优化设计的利器
    SOLIDWORKSSimulation是SOLIDWORKS软件家族中的一员,是一款强大的工程仿真分析工具。它通过模拟和分析,帮助工程师们更好地理解和评估设计方案的性能,并通过优化设计来提高产品质量和效率。这篇文章我们将介绍SOLIDWORKSSimulation的特点、应用领域以及其在现代工程设计中的重要作用......
  • C#开源、功能强大、免费的Windows系统优化工具 - Optimizer
    前言今天给大家推荐一款由C#开源、功能强大、免费的Windows系统优化工具-Optimizer。工具介绍Optimizer是一款功能强大的Windows系统优化工具,可帮助用户提高计算机性能、加强隐私和安全保护。该工具支持22种语言,同时提供了许多实用的功能,如关闭不必要的Windows服务、停止Wind......
  • 谷歌优化之确保链接可供抓取
    bookmark_border只有当您的链接使用正确的 <a> 标记和可解析的网址时,Google才能跟踪这些链接:使用正确的 <a> 标记只有链接是含有 href 属性的 <a> 标记时,Google才能跟踪这些链接。Google的抓取工具不会跟踪使用其他格式的链接。Google无法跟踪缺少 href 属性的 <a>......
  • NoSQL之Redis配置与优化
    目录NoSQL之Redis配置与优化1.关系数据库和非关系型数据库2.SQL与NoSQL的区别3.Redis3.1Redis概述问题3.2Redis为什么那么快?3.3Redis安装部署3.3.1环境准备3.3.2修改内核参数3.3.3安装redis3.3.4修改配置文件3.3.5定义systemd服务管理脚本3.4Redis命令工具3.4.1......
  • SpringBoot项目优化和JVM调优
    在开发中项目调优是必须得熟练掌握的事情。在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进行。修改配置文件关于修改配置文件application.properties,可参考SpringBoot详细配置文件其中比较重要的有:#Maximumnumberofconnectionsthattheserveraccepts......
  • unity 中实现 rts 游戏对士兵的选择和移动
    playerController部分用来处理玩家鼠标对场景内元素交互的逻辑代码如下usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.AI;publicclassPlayerController:MonoBehaviour{//场景中的士兵角色列表publicGa......