Unity3D】【Unity基础】ngui和ugui哪个好_第2页回答

2020-11-03 14:01发布

10条回答
小狮子
2楼 · 2020-11-27 10:36

一个团队开发的,ugui兼容性更好

我的网名不再改
3楼 · 2021-11-05 15:32

元素更新方式  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无影响。


            


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,这没有开销。


相关问题推荐

  • 回答 17

    还是要学好编程基础呀如果你觉得编程很苦难 不一定要从c#开始学  学学js flash as等等  有个梯度就好多了如果要用好unity  不会编程那是不行的  学习的过程中都有个头疼的过程  记住  头越痛  代表你要接受的东西越多  坚持 你的大脑在和知识兼容中:D...

  • unity如何自学Unity3D 2022-01-06 15:24
    回答 18

    可以先思考学习的目的,是什么因素在驱动你。是完成一款作品?进入某个行业?还是探究某类问题?否则和技术相关的知识浩如烟海,很容易迷失在细枝末节上。而要找到动力源头。个人的经验,就是关注一些和自己同方向,同类型的创作者。他们输出的作品会激励你,...

  • 回答 23

    可以让模型师直接作出这样的形状,如果用纯Unity制作,就要用基本游戏对象拼接了,包括楼梯,城堡,都可以拼接出来。正常情况不会这样做,因为不够精美,都是建模师来实现,毕竟Unity不属于专业的建模软件,侧重于实现功能。...

  • 回答 2

    Shader Unlit/Test{Properties{_MainTex(MainTex,2D)=white{}_MainColor(MainColor,COLOR)=(1,1,1,1)_AddTex(AddTex,2D)=white{}_Maxset(Max,Range(0.1,1.0))=0.1}SubShader{Tags{RenderType=Transparent Queue=Tran...

  • 回答 4

    文章主要为大家详细介绍了Unity Shader实现水波纹效果,文中示例代码介绍的非常详细具体代码实现如下:Shader Custom/shuibowen{ Properties{ _MainTex(Base (RGB),2D)=white{} _distanceFactor(Distancefactor,float)=1 _timeFactor(time factor,float)=...

  • 回答 7

    策划的最基本的原则就是:改进缺点,做别人没有做到的。无论游戏策划还是其它策划都是一样!    游戏策划的第二个原则:放飞思想。也许你认为我是说策划们应该充满想象力,能想一些匪夷所思的东西!对不起。不是这意思!一个合格的策划不是为了发泄自己的...

  • 回答 7
    已采纳

    可以多玩一些其它的游戏,看一些科幻电影等,寻找灵感。

  • 回答 3
    已采纳

    游戏架构与设计不纯粹是一门科学,它不需要提出假设或探究真理,也不被逻辑或正规方法的严格标准所束缚。游戏的目的就是通过玩来获得娱乐,因此游戏设计即需要艺术家一样的创造力,也需要工程师一样的精心规划。游戏设计是一门手艺,就像好莱坞的电影摄像或服...

  • 回答 9

    1、先确定风格,科技的,高级的,小清新的,水墨的,各种风格,先得知道自己要做的东西是啥2、确定内容,主要就是画面和海报文字,比如人物用全景还是近景,字体是横版还是竖版3、放置主体,也就是构图4、细调,包括字体设计,字体纹理,画面风格化处理,加光...

  • 回答 5

    F1 -帮助F2 -剪切F3 -拷贝F4-粘贴F5-隐藏/显示画笔面板F6-隐藏/显示颜色面板F7-隐藏/显示图层面板F8-隐藏/显示信息面板F9-隐藏/显示动作面板F12-恢复Shift+f5-填充Shift+f6-羽化Shift+f7-选择→反选ctrl+h-隐藏选定区域ctrl+d-取消选定区域ctrl+w-关闭文件ctr...

  • 回答 20

    ADOBE有ACPE的考试和 ACCD的考试ACPE称为d 产品专家,包 括PS,AI,ID,AC等等,由于 ADOBE公司zhuan收购了flash的母公司,所以现在shuflash的认证也可以在ADOBE的网站上查到。考试分为笔试和机试,笔试为选择题,机试是操作题,考试需要到ADOBE认证的考试中...

  • 回答 11

    以上就是ugui里面的控件了.

  • 回答 10

    UGUI 是Unity 官方推出的最新UI系统。它从 Unity 4.6 开始,被集成到 Unity 的编辑器中。相较于旧的 UI 系统,它绝对属于一个巨大的飞跃!因为只要有过旧 UI 系统使用体验的开发者,大部分都对它没有任何好感,以至于在过去的很长一段时间里,大家都在使用资...

  • 回答 23

    可以的~美术基础确实有很好的造型功底,以及还有积累许久的视觉高度,但是这些后期都可以按课程方法对应提升的,所以美术生占优势,非美术生是可以按课程节奏也能完成设计任务及设计相关的工作内容。...

  • 回答 4

    个人建议是可以的,现在有很多的人不是设计专业毕业的同学,但是比较的喜欢设计从而通过培训来进入到设计这个行业,而且现在比较好的机构的师资也是比较的强的,学习的东西也是比较的多,可以更好和更快的进入到设计这个行业。我有朋友是在某就业学习的,品牌...

没有解决我的问题,去提问