NGUI UI DrawCall 优化

 首先要明确Unity中的drawcall定义:   

每次引擎准备数据并通知GPU的过程称为一次Draw Call。

Unity(或者说基本所有图形引擎)生成一帧画面的处理过程大致可以这样简化描述:引擎首先经过简单的可见性测试,确定摄像机可以看到的物体,然后把这些物体的顶点(包括本地位置、法线、UV等),(顶点如何组成三角形),变换(就是物体的位置、旋转、缩放、以及摄像机位置等),相关光源,纹理,渲染方式(由材质/Shader决定)等数据准备好,然后通知图形API——或者就简单地看作是通知GPU——开始绘制,GPU基于这些数据,经过一系列运算,在屏幕上画出成千上万的三角形,最终构成一幅图像。

NGUI中的UIWidget的显示顺序:

 

每一个UIWidget的显示顺序由depth值决定,跟z轴没关系,而这个depth值是由两部分组成的,一个是UIWidget所在的UIPanel的depth和UIwidget自身的depth值进行加权计算。

并且,UIPanel的权重非常大,可以认为,UIPanel的depth大的所有UIWidget比UIPanel的depth小的所有UIWidget比最后计算的depth一定大;NGUI合并drawcall是以UIWidget为最小单位并依据UIPanel来合并的,就是说在每一个UIPanel内部以UIWidget根据depth顺序合并统一图集元素drawcall;这样若是中间插有其他图集的UIWidget,NGUI将另起一个Drawcall来渲染。

 

因此在NGUI中优化drawcall最优先的解决方案原则就是尽量少的穿插试用不同图集:并且最好一个界面只使用一个UIpanel,因为每一个UIPanel都是一个Drawcall,在一个UIPanel内最好使用一个图集,UITexture只在场景的背景试用,能试用图集就是用图集,这样就可以使每个UIPanel内部Sprite都能合并在一个Drawcall上,字体不管是动态字体还是使用NGUIFontmaker的字体每一个字体都占据一个Drawcall,因此不同的字体使用一个深度段,并且这个深度段最好不要与Sprite深度段交叉,最好放在最上层;
 
同时,在UI结构布局时,可以考虑将深度值大的对象作为小的子物体,同一深度的物体放在同一级别,这样就可以试用脚本来统一管理UI深度层级;

转载于:https://www.cnblogs.com/smallboat/p/5549624.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值