[Unity]UWA NGUI 直播笔记

网页链接 http://blog.uwa4d.com/archives/video_UI.html 

一 :NGUI  直播1 

1 .ngui profiler 中的uirect.update()过多,和anchor中的Update有关。
2 Unity 5.2以后,才加上一个ingoreRayCast 检测,在4.x 和5.2之前,UGUI的UI元素都会接受射线物理碰撞
3.自制了一个EventManager.cs ,主要方法是通过forearch()收集所有的UIbutton ,然后添加NGUI自身的EventListener,统一处理OnClick(Gameobject go)
4  ETC1 基本所有安卓机器都支持,但是不支持Alpha通道  。ETC2部分安卓机器不支持。
5.NGUI自定义材质的时候,需要注意材质球 两个Panel滑动  ,三个滑动 1个滑动等记下。
6.particular System 交互 NGUI的RenderQ 显示顺序。
UI显示 使用的是ParticularSystemRender 修改renderQuence


particular System 裁剪 
a.不可滑动通过RenderQ
b.可滑动的
{ 1.序列帧的方式做粒子效果
          2.使用shader   -   
 3.通过额外的camera显示区域做。 
}


7.DrawCall优化。
DrawCall正常情况下是隐藏的gameobject的mesh.( NGUI如果想看UIDrawCall的话,把UIDrawCall中的 SHOW_Hidden_Object打开。可以看到每个DrawCall Gameobject的mesh等。)
Ngui自带的两个drawCall工具
  两个元素相邻,材质相同 ,但是两个Drawcall 就说明是两个Uitexture
合并两个UI元素 DrawCall 内存是不会增加的,顶点数 ,定点属性不会变的
一堆UITexture 打图集 ,NGUI自动绑定Uitexture.但是效果不同,为了效果,需要替换制定材质。


 
小技巧 :1. 在场景中 创建了材质,在desroy中未删除,就会在内存中增加很多。所以要记得删除的时候 清掉创建的对象。或者executeIneditorMode; 
2. 使用Material的时候,可以动态创建一个新的材质, var material = new Material("shader.find("x/shader")"),之后记得删掉动态创建的material ,因为material 和shared material 都会复制新的比较乱。
         3. NGUI的UIDrawCall 管理UI的显示,任何材质的替换,裁剪区域都在UIDrawcall中完成。OnWillRenderObject();
4. NGUI如果想看UIDrawCall的话,把UIDrawCall中的 SHOW_Hidden_Object打开。可以看到每个DrawCall的mesh等。

/

***********************

/

二  下篇优化技巧


主题 : NGUI的数据更新和网格更新的开销
1.几个重要函数 cpu部分 :UIPanel.LateUpdate() 主要() 。UICamera.Update()  、UIRect.update()  、UIRect.start()
  性能消耗在3毫秒以内优秀、其他都待优化。
  UIPanel.LateUpdate() 堆内存 10M-30M较合理。
   渲染部分 Mesh.CreateVBO 是每次界面重建的时触发,如果出现过多,则说明UI刷新频率过高


2.UIlabel 开销
  Font.CacheFontForText 动态字体拓展会撑大动态字体图集,触发该函数。
解决方法 :1 将固定的不改变的使用静态字体。 2 其他当前没什么好方法,因为中文字比较多,可以事先加载些字体。
Shadow、Outline 效果 顶点数目会增加四倍到八倍(outline8) 对于移动的、动态的文本尽可能少用(动态因为有UI重建) 。测试结果是: 上无outline 1.2ms ,outline 1.6ms  outline8 5.6
对于静态的label则影响不大。
3.UISprite 开销 (相对于label 性能好好多)
主要有Tilled Mode 可能会有影响。 合理使用影响不大 总体。主要针对的是移动的UI元素


4UIPanel更新机制 
   a. 更新单个UIDrawCall(只更新UIpanel中的某一个DrawCall)
   
所以这里要做的优化是尽可能的只使Panel更新一个DrawCall ,避免更新所有的drawCall .
UI中的DrawCall 并非越小越好,同一个DrawCall 动静分离。(比如举的例子  全部UI元素 一个DrawCall ,其中一个血条变动,使全部UI重建。优化方法,将该血条单独加个UIPanel)


 b.更新所有UIDrawCall(达成某种条件)
   主要原因 : UIPanel中的UIDrawCall发生了变化。(同一个DrawCall变成了2个 ,2个变成了一个。主要产生原因 动态添加或者删除UI元素)
 - 动态添加/移除元素/SetActive ,deepth 穿插其他panel.
 - createVBO 注意 
 -解决方法 : -动静分离,添加panel 优点: 简单快速。 缺点: 不同的panel的drawCall不能合并。
              -分离party 、unit frame 等。
              -createVBO 拆分后对单个创建也有优化。
     -调整deepth 不影响其他drawCall。
              -独立成UIPanel 、或者把其他静态的合并出去。 -crateVBO也会降低,只创建分离出去的DrawCall
More :
更新所有UIDrawCall的条件:
-添加/删除元素时候 穿插了其他的UIDrawCall 


总结1 :对于频繁变动的UI 元素,其所在的UIDrawCall面数,越少越好。
总结2: 动态添加UI元素时,注意Deepth的设置,尽可能合入已有的UIDrawCall(比如例子里面的新加入字体,虽然deeph 可以合并,但字体不可以合并,也会重建)
总结3  对于需要动态添加UI元素的UIPanel ,减少复杂度,从而避免在更新所有UIDrawCall时开销过大。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值