NGUI和UGUI性能优化比较

本文对比分析了NGUI和UGUI在元素更新、DrawCall合并规则、网格更新机制等方面的性能优化。NGUI的元素更新采用轮询方式,而UGUI使用布局和外观变化队列,减少了无谓的开销。在DrawCall合并规则上,UGUI的分层合并更高效。在网格更新控制上,UGUI在动态HUD界面表现更优。建议战斗外使用NGUI,战斗内使用UGUI,以平衡性能和渲染开销。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

元素更新方式  DrawCall合并规则  网格更新机制  堆内存分配

元素更新方式

    & 对制作的影响(ps:改变缩放和颜色也算动态)

        —“动态”元素尽量少用Outline、Tiled Sprite

        —尽量减少“动态”长文本

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无影响。

            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值