NGUI开发优化技巧(下)

NGUI开发优化技巧 屏幕自适应  参考链接 屏幕适配参考 & Scaling Style(UIRoot上)     主要用Constrained设置(content width和content height)进行整体布局------Constrained On Mobiles(NGUI做好了不同的适配)     或者如果是选取了Flexiable且横屏状态下,就需要动态改变适配的高度(一般是PC端) ... 阅读详情


NGUI更新开销:NGUI进行自身的数据更新以及生成网格的过程中所产生的开销,目前UI部分的CPU耗时大部分都是这部分的开销;

NGUI的更新开销几乎全部来源于UIPanel.LateUpdate中;一般超过3~4ms,说明这部分更新开销较高;

UI更新的数量和频率通过合理的布局,可以把这部分的开销限制在很多小的范围里面;

在关卡的切换或点击一些UI界面时,可以出现一些较高的峰值;

但在战斗部分要保证UIPanel.LateUpdate在很小的范围内波动,一般在2~3ms;

 

UIPanel.LateUpdate在进行完全的重建时,才会出现较高的堆内存开销;



NGUI更新的对渲染的影响:

NGUI的更新在渲染时的耗时出现在MeshRenderer.Render,Mesh.DrawVBO和Mesh.CreateVBO有一部分是由NGUI造成的,NGUI中UIPanel的刷新和UI元素的变动导致网格发生了变化或更新,都会使Mesh.Create产生开销;


UIPanel.LateUpdate的总堆内存分配在10~20M之间,是合理的;(10000~20000帧)

UIPanel的堆内存是有UIPanel的刷新引起的,堆内存越高说明UIPanel的刷新频率越高,所涉及的UI元素的数量可能越大;


UILabel的更新开销

1:Font.CacheFontForText

2:Shadow

3:Outline



在手机上,纹理的大小会有所限制,纹理的内容会不停地变动,纹理不停地刷新,会导致

Font.CacheFontForText不停地被触发;

出现文本比较大,首次出现,并且用的是动态字体,就会产生比较高的Font.CacheFontForText函数开销,对于频繁地、反复使用的文本,尽可能地做成静态字体;



开启和不开启Shadow的区别;



开启和不开启Outline8的区别;(比Shadow的性能开销还大)

 

对于频繁移动的文本,开启Effect效果,对性能开销比较大;

 

对于动态的文本(会移动或会变颜色),尽可能少用这些特效,对于静态的不影响;(不会每一帧去更新网格)

 

UISprite的更新开销

(Size越大,平铺地越多,三角面片和网格数越多,造成开销越大)


使用和不使用Tiled模式的区别;

 

UISprite或文本的UI元素本身在移动或变颜色时,才会真正产生开销;静止时则不会更新,

不产生开销;

 

 

UIPanel更新机制

1:更新单个UIDrawCall;

2:更新所有的UIDrawCall;

 

UIDrawCall:一个UIPanel中可能会有各种各样的UI元素,这些UI元素可能来自于不同的图集,对于来自于不同图集的元素最终渲染时不能合在同一个DrawCall里面,所以一个UIPanel里面会包含很多个UIDrawCall,这些UIDrawCall首先按照UI元素的深度(Depth)进行排序,

然后再根据相邻元素是否来自于同一个图集来进行合并,这里的每一个UIDrawCall都包含了若干个UI元素,这些UI元素来自于同一个图集,且深度值在排序里面是相邻的;

 

进行Panel更新时,有两种模式:

1:更新单个UIDrawCall:在更新过程中,某个UI元素进行了移动,只会更新自己所在的UI元素里面的网格,不会影响其他的DrawCall;

2:更新所有UIDrawCall:一旦满足某种条件,会直接重建UIPanel里面所有的DrawCall;

 





并不是把DrawCall降低地越低越好,当一个顶点发生变化时,因为这个顶点和其他的顶点在同一个Mesh上面,所以一个顶点的更新会导致所有Mesh的更新;

 

如果添加的界面并不是和变动的UI元素在同一个DrawCall里面,那么在更新元素时,并不会产生影响;

总结

对于频繁变动的UI元素,其所在的UIDrawCall面片数越少越好;

 

更新所有的UIDrawCall:

主要原因:UIPanel中的UIDrawCall发生了变化;(在UIPanel里面添加了DrawCall或是把UIPanel里面原有的DrawCall拆分成多个(动态地添加或删除一些UI元素))




在这一帧内,有很多网格进行了重建,会影响到Mesh.CreateVBO;

动态添加窗口,穿插了NGUI Panel,导致UIPanel的完全重建;


将其中一个UIDrawCall分离到其他的UIPanel中后

 

不同UIPanel下的UI元素是不能进行合并的;

调整深度,不要打断原有的DrawCall;

动态的UI元素中少放东西,或直接把它独立成一个UIPanel;

 

更新所有UIDrawCall的条件

1:添加/删除元素时,穿插了其他的UIDrawCall;

2:添加/删除的元素自成一个UIDrawCall;

 

总结:

1:对于频繁变动的UI元素,其所在的UIDrawCall面片数越少越好;

2:动态添加UI元素时,注意Depth的设置,尽可能合入已有的UIDrawCall;

(在添加UI元素时,这个Depth是包含在现有的DrawCall里面的,并且这个DrawCall的材质和所添加的元素的材质是一致的,这样就不会产生完全的重建)

3:对于需要动态添加UI元素的UIPanel,减少其复杂度,从而避免在更新所有

UIDrawCall时开销过大;(战斗过程中出现的连击提示,应尽可能地减小这种界面的复杂度,

不要把静态的东西(头像、置顶的怪物的血条)也放在UIPanel里面)

 

动态字体(字体在不停变换时):在手机上,文本所对应的字体、材质、纹理会不停地进行更新,每一次想往纹理里面添加新的文字,当发现纹理不够时,会触发刷新的操作,会根据当前创建纹理大小的限制(比如需要创建512*512,但根据某些机制发现只能创建256*256的),则会先把屏幕上激活状态的文本填入纹理,对于出现过的,但是已经被禁用的文字就会全部被剔除掉,这个过程相当于完全更新了纹理里面的内容,这种操作也是耗时最大的操作;

动态字体优化的两种方式:

1:如果字体可以做成静态的,则优先做成静态的,就可以避免Font.CacheFontForText;

但也会出现一些问题(比如:在一些剧情比较复杂的游戏中,涉及的剧情非常多,每一段剧情需要的文本量非常大,如果做成静态的,可能带来10多张1024*2048这种纹理,这就不同通过转成静态字体这种方式来处理这种情况);

2:文本只出现一次,后面不会出现,可以让它预先出现,比如创建一个Label,里面有这个文字,并且是处于激活状态的,只是相机看不到,可以把这些峰值移动到可以卡顿的地方,在真正播放剧情时,通过移动或者修改Layer让这些文字更流畅地逐渐显示出来;

进入读条时,先把这些文本放成激活状态,让动态字体需要的纹理先生成好;

 

 

多个动态的物体,放在一个Panel好,还是放在多个Panel好;

通常进行分组比较好,可以少量地提高合并网格的计算量(优化量并不多,因为网格总量是一样的,只是分成几个分组而已),影响比较大的是:Camera.Render里面的CreateVBO;

 

做UI元素的分离时有一个好处:

一个屏幕上存在多个UI元素,只有少量的UI元素在移动,可以做动态Panel的划分,对于静态不动的网格不应该去更新;




Unity NGUI完整GUI开发实战指南 在Unity引擎的UI开发历程中,原生的虽然实现了基本的界面绘制功能,但其缺乏可视化编辑、性能低下以及难以维护等问题逐渐暴露,尤其在中大型项目中显得捉襟见肘。为了解决这些问题,开发者社区逐步转向使用第三方UI插件,而正是其中的佼佼者。NGUI由Tasharen Entertainment开发,凭借其出色的性能表现、模块化架构以及强大的可视化编辑能力,迅速在Unity社区中获得广泛认可。其核心价值主要体现在以下几个方面:性能优化。 阅读详情

相关推荐

dotnet-NGUI与tolua的高效轻量级游戏框架构建指南

为了丰富游戏框架的结构,开发者需要添加自定义组件。自定义组件可以通过继承NGUI或Unity自带的组件类,并添加特定功能来实现。以下是添加自定义组件的步骤:创建自定义组件类:在Unity编辑器中,右键点击Project面板中的Assets文件夹,选择Create -> C# Script,命名为”MyCustomNGUIComponent”。编写自定义逻辑:打开”MyCustomNGUIComponent”脚本,并编写需要的功能逻辑。

weixin_42596214的博客 1021

Unity3D UGUI 优化:Font.CacheFontForText

前言: 最近在做项目优化的时候,有个东西非常耗时,就是Font.CacheFontForText。在真机上测出来的Profile简直吓人,几十、几百、上千毫秒都有可能。 所以这是一个必须优化的点,也是一个很难的点。因为他的API等东西,都是写在原生的Unity中的,外部访问不到;而如果自己重新实现一套又太费时费力了。 正文: 1、现状分析: 上图可以看到,由font.cache...

魔术师Dix的博客 5447

NGUI UIScrollView 性能优化

配套博文:http://blog.youkuaiyun.com/anyuanlzh/article/details/40621889

NGUI 3.x 深度管理及渲染优化

http://gad.qq.com/article/detail/7151089 UIWidget的显示顺序 我们在设置UISprite、UILabel等控件的深度时,都是在设置其Widget样式中的Depth值。其实这些控件都是继承至UIWidget。 但是UIPanel不是继承至UIWidget,Depth是UIPanel自身的一个属性。 在NGUI 3.x中每一...

weixin_30332705的博客 214

NGUIv3.12.1.rar

NGUI是Unity的一个经典UI工具,自Unity开始之时就持续迭代优化。这是新版本NGUI Next Gen UI v3.12.1。当Unity自身的UI工具(UGUI)还没有的时候,NGUI可以说是Unity程序必会的一个插件。即使UGUI出现,也不能掩盖NGUI的光芒,而且众所周知,NGUI的作者还是UGUI的开发者之一。

Unity+NGUI性能优化方法总结

Unity+NGUI性能优化方法总结---优化 资源分离打包与加载是最有效的减小安装包体积与运行时内存占用的手段。一般打包粒度越细,这两个指标就越小;而且当两个renderQueue相邻的DrawCall使用了相同的贴图、材质和shader实例时,这两个DrawCall就可以合并。但打包粒度也并不是越细就越好。如果运行时要同时加载大量小bundle,那么加载速度将会非常慢——时间都浪费在协程之间的调度和多批次的小I/O上了;而且DrawCall合并不见得会提高性能,有时反而会降低性能,后文会提到。因此需要有策略地控制打包粒度。一般只分离字体和贴图这种体积较大的公用资源。

Unity UGUI Font.CacheFontForText 消耗

棒啊 ,电脑上都有26ms的时间,手机上岂不是要起飞了? 用 TextMeshPro 试试 ,UI上的组件 如下图 ,代码获取类 得到的消耗结果 0.25ms 。

LM514104的博客 1040

自动化测试工具playwright中文文档-------1.编写测试

Playwright 测试非常简单,它们执行操作,并断言状态是否符合预期。在执行任何操作之前,无需等待任何内容:Playwright 在执行每个操作之前会自动等待一系列可操作性检查通过。此外,在执行检查时也不需要处理竞态条件——Playwright 的断言设计方式能够描述最终需要满足的期望。就这样!这些设计选择允许 Playwright 用户完全忘记他们测试中的不稳定超时和竞态检查。您将学习如何编写第一个测试如何执行操作如何使用断言测试如何在隔离环境中运行如何使用测试钩子。

2301_76646967的博客 2511

【Unity面试】 NGUI优化和UGUI优化 | 面试真题 | UI框架 | 全面总结 |建议收藏

最全NGUI和UGUI优化面试题

qq_21407523的博客 4971

Python实现支付宝转账接口

由于工作需要使用python开发一个自动转账接口,记录一下开发过程。 首先需要在蚂蚁金服上申请开通开发者账户,有了开发者账户就可以使用沙箱进行开发了。 在开发之前我们需要在沙箱应用中填写密钥,密钥的获取可以使用阿里提供的工具包自动生成。 前期准备工作完成了,接下来是编写代码部分。主要用到了python-alipay-sdk库,使用pip安装即可,如果安装的过程中遇到问题推荐使用Anaconda...

FanMLei的博客 8516

银河麒麟v10(x86_64)升级openssh实操成功

本文详细介绍了在银河麒麟V10系统上将OpenSSH从8.2p1升级至9.9p2版本的全过程。主要内容包括:系统环境确认、安装telnet备用连接、备份配置、卸载旧版本、安装新版本、服务配置与验证等关键步骤。特别强调了安全注意事项,如必须安装telnet作为备用连接、重要配置备份等。升级后提供了安全加固建议,包括修改SSH端口、禁用root登录等。文章还包含详细的故障排查方法和恢复方案,确保升级过程安全可靠。通过本教程,用户可以顺利完成OpenSSH版本升级,提升系统安全性。

淘淘小窝 1093

NGUI中如何减少CacheFontForText耗时

在NGUI中,UILabel里的CacheFontForText耗时一直是个大问题 CacheFontForText是在UILabel在渲染时,在对应的字体的FontTexture找不到需要渲染的字符时,就会重新生成FontTexture,FontTexture尺寸越大,重新生成这张FontTexture就越耗时。 网上已经有一些解决方案了,大多数是一开始就将FontTexture撑大,减

jackianroy的专栏 2010

Gröbner基方法入门第I部分:项序和约化

Gröbner基方法入门第I部分:项序和约化 理想的准素分解与矩阵分解是计算代数的核心问题,它们在计算机代数、计算代数几何、代数编码和密码学、多维系统理论等学科都有非常重要的理论意义与应用价值.Gröbner基理论是研究理想的准素分解与矩阵素分解的重要工具之一.更简单地概括:Gröbner基方法是从任意一个多项式理想的一组给定生成元,计算另一组性质良好的生成元,并称为该理想的Gröbner基.它能用来判定任意多项式是否属于该理想. Gröbner基的代数算法是Buchberger在1960年代开发的,并

MinCong Luo的博客 4269

NGUI开发优化技巧(上)

UGUI和NGUI的区别: 使用率:NGUI占大多数,NGUI和UGUI的使用占比为81% : 19%; 易用性:NGUI占一定优势,UGUI仍在慢慢改善; 性能:如果都合理搭配,UGUI在性能上还是有一点优势的,在Unity5.2、5.3之后UGUI有一部分网格合并的操作是放在多线程中进行,相对来讲,性能有一定的提升; 但NGUI的优化相对更简单一些,主要是因为NGU

编程小生的专栏 1673

松材线虫病害智能检测:基于YOLOv8的无人机航拍数据集构建与模型优化

本文探讨了基于YOLOv8的无人机航拍技术在松材线虫病害智能检测中的应用。通过构建高质量巡检数据集和优化模型架构(如RepVit主干网络和跨尺度特征融合模块),显著提升了病害识别准确率。该方案在复杂森林环境中表现出色,将检测效率提高数倍,为林业病害防控提供了高效解决方案。

vulkan6gpu的博客 995

实战指南:R语言多组倾向评分逆概率加权(IPTW)建模与结果解读

本文详细介绍了如何使用R语言实现多组倾向评分逆概率加权(IPTW)建模,包括数据预处理、倾向评分估计、权重计算及结果解读。通过实战案例演示,帮助研究者掌握这一统计方法,有效平衡多组混杂因素,模拟随机对照试验效果,适用于医学、社会科学等领域的数据分析。

weixin_42528534的博客 399

Unity程序员如何理解NGUI开发流程与底层实现:原理与商业项目实战

《Unity程序员深入理解NGUI开发流程与底层实现》 本文系统解析了NGUI的核心架构与实现原理,为Unity开发者提供技术参考。文章首先指出NGUI在商业项目中的持续价值,特别针对300+款老游戏维护需求。核心内容分为两大部分: NGUI架构解析: 四层架构设计(渲染/布局/交互/动画) 与UGUI的关键差异(Transform坐标系统、组件化渲染、碰撞器事件) UIWidget基类实现机制 深度技术实现: 渲染管道流程分析 UIWidget类详细源码解读 UISprite等控件的具体实现方式 本文特别

小宝哥Code的专栏 1066

GhidrAssist:AI驱动的逆向工程助手实战指南

逆向工程是分析软件内部工作原理、理解二进制代码逻辑的关键技术,广泛应用于软件安全、恶意代码分析和漏洞挖掘等领域。其核心原理在于通过反编译、控制流与数据流分析等手段,将机器码还原为可理解的高级语言表示。传统逆向分析高度依赖人工经验,面对海量代码时效率低下且易出错。随着大语言模型(LLM)技术的发展,其强大的代码理解与推理能力为自动化逆向分析提供了新的可能。通过将LLM与成熟的逆向工程框架(如Ghidra)相结合,可以构建智能辅助系统,实现代码意图的自动解释、变量/函数的智能重命名以及潜在漏洞模式的辅助识别,从

weixin_42547335的博客 596

NGUI UIButton组件

UIButton是NGUI中用于创建按钮的组件,它可以响应用户的点击、触摸或键盘输入,并触发相应的事件。UIButton适用于游戏中的菜单、对话、技能激活等交互场景。

Unity打怪升级 977

双重机器学习模型中解释变量是连续变量的代码,看到好多都是0/1变量,如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!    📌 特别说明: 文中部分技术问题来源于真实生产环境及网络公开案例,均经过精挑细选与系统化整理,并结合多位一线资深架构师和工程师多年实战经验沉淀,提

**My Coding Family** 854

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NGUI List优化

腾讯是如何做 Unity 手游性能优化的 https://juejin.im/entry/5774af485bbb50005925a3b1 Unity - NGUI - 优化ScrollView的一些心的 https://www.cnblogs.com/9-de/p/5109057.html NGUI滑动优化,滑动系数,滑动慢问题UIScrollView https://www.bobs...

weixin_30908941的博客 169

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

unity中NGUI制作UI界面的小建议

NGUI和UGUI的渲染方式是不同的,UI界面的拼接也是有差别的,这里就只说NGUI拼接UI界面相关的事项 一.NGUI中的drawCall统计规则: (1)一个UITexture就是一个单独的drawCall (2)每个Panel就是一个drawCall (3)相邻的depth的相同图集 合成一个drawcall(如果相邻的depth使用不同的图集,drawcall不能合并,每个图集就单独计为一个drawcall) 二.NGUI中的刷新规则: (1)首先对UiPanel,按照depth进行排序 (2)然后

木马人 702

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【Unity插件】NGUI核心组件之UICamera

目录(?)[-] NGUI:UIPanel参数Tips NGUI:UIPanel UIPanel负责创建实际的集合图形。你不需要手动的添加UIPanel-一旦你创建一个控件,它会自动被添加。如果你想将你的UI渲染拆分到不同的Draw Call中,你可以手动创建你自己的UIPanel,例如你要创建一个分屏的游戏,每个屏用一个摄像机进行渲染,这种秦光下你就需要2个UI

xinshou_jiaoming的专栏 1253

记录一些U3D对象的优化

Component 相关优化 Transform 使用内建的数组,比如用 Vector3.zero 而不是 new Vector(0, 0, 0); transform.localRotation = Quaternion.Euler(Vector3.zero); transform.localScale =Vector3.one; transform.localPosition =Vector3...

qq_17347313的博客 290
上一篇: NGUI开发优化技巧(上)
下一篇: Q&A——内存管理(一)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独立游戏开发指南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值