NGUI 减小drawcall规则

前置说明一:测试

Unity中的drawcall定义:spa

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

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

 

前置说明二:开发

NGUI中的UIWidget的显示顺序:get

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

而且,UIPanel的权重很是大,能够认为,UIPanel的depth大的全部UIWidget比UIPanel的depth小的全部UIWidget比最后计算的depth必定大。举个例子:渲染

 

UIPanel1    depth  x                      UIPanel2    depth  y引用

UIWidget1  depth  m                      UIWidget2  depth  ncall

 

只要 x > y,那么无论m和n的大小,UIWidget1最后的depth必定大于UIWidget2。

 

减小drawcall的规则:

一、同一个UIPanel下的texture和font尽可能放在同一个altals下。也表达了另一个意思,使用同一个altals的元素尽可能放在同一个UIPanel下面。

二、若是一个UIPanel下面使用了多个altals,那么尽可能让使用相同altals的元素连续,尽可能避免altals交叉。

 

规则1的前半部分好理解。后半部分,参照前面显示顺序问题能够知道。若是使用同一个altals的元素在两个不一样的UIPanel下面,这就必然致使它们的drawcall分离。因此即便调整它们的depth一致,也没法合并成一个drawcall.

 

规则2的意思,举个例子就明白了:

同一个UIPanel下有4个UIWidget,w1,w2,w3,w4。

其中 W1和W2引用altals1。

其中 W3和W4引用altals2。

 

若是它们的depth顺序为  w1 : 1,w2 :2,w3 : 3,w4 : 4。

那么整个渲染须要2个drawcall,由于渲染顺序为 w1,w2,w3,w4。

而w1和w2公用一个altals,因此能够合并成一个drawcall,同理w3和w4能够合并成一个drawcall。

 

而若是它们的depth顺序为: w1 : 1,w2 :3,w3 : 2,w4 : 4。

那么整个渲染须要4个drawcall,由于渲染顺序为 w1,w3,w2,w4。

由于w1和w3不是公用一个altals,因此只能分开渲染。同理w3和w2,w2和w4也只能分开渲染。

 

UI制做强调说明:

使用NGUI制做UI有两大需求,
1 要打开界面要快 因此必须一直存在内存中
2 设置好公共资源 这是减小内存的占用

还有就是公共资源与界面之间的深度问题

NGUI没法导入问题:

导入时闪一下就消失没有反应

这是因为放在中文目录的缘由,必须放在英文路径下才可导入

因为unity对中文并无很好的支持

因此unity开发过程当中应尽可能避免使用中文路径或文件名

相关文章
相关标签/搜索