NGUI Drawcall 优化
来源:互联网 发布:手机音乐软件 编辑:程序博客网 时间:2024/06/05 14:18
NGUI 方面的Draw Call 优化:
(1) 打包图集
一、每个材质/纹理的渲染一定是会产生DrawCall的,这个DrawCall只能通过打包图集来进行优化。
二、从功能角度进行划分,例如UI可以划分为公共部分,以及每个具体的界面,功能上,显示上密切相关的图片打包到一起
(2)渲染顺序
一、 U3D的渲染是有顺序的,NGUI的渲染顺序是由我们控制的,控制好NGUI的渲染顺序,你才能控制好DrawCall。
二、 一个DrawCall,表示U3D使用这个材质/纹理,来进行一次渲染,那么这次渲染假设有3个对象,那么当3个对象都使用这一个材质/纹理的时候,就会产生一次DrawCall。假设3个对象使用不同的材质/纹理,那么无疑会产生3个DrawCall。
例子:
A,B使用材质1,C使用材质2,这时候会有几个Draw Call?
有两种情况,3个Draw Call:
A:材质1
B:材质2
C:材质1
第二种情况,2个DrawCall
A:材质1
C:材质1
B:材质2
渲染顺序:Unity默认会按照控件的Depth来渲染。从后往前渲染,当使用相同材质的控件会合并为一个Draw Call。如果和前一个材质不相同则会重新产生一个Draw Call。所以会有上面两种不同的结果,如果同一个界面有更多的空间存在时,这个问题会更明显。在UI制作的时候就需要特别注意这一点。
NGUI为了减少GPU状态切换的消耗(比如切换material),把相同material的widget合并,减少DrawCall的数量。下文描述了NGUI如何对widget归类,以及减少DrawCall需要注意的地方。
归类widget的代码在UIPanel中的FillAllDrawCalls()里,代码如下
算法描述如下
先把UIPanel中的Widget按depth从小到大排序,如果depth相同那按照material的ID来排序。然后遍历每个元素,把material相同的Widget归类到同一个drawCall。合并之后的结果如下图
最后生成了3个DrawCall,并按顺序提交GPU绘制。
为何要采用这个算法呢?因为NGUI的Material是透明材质,不会写入深度缓存(但是会进行深度测试,以保证与非透明物体的层次正确),我们可以看NGUI材质所使用的Unlit/Transparent Colored这个Shader,里面有一句ZWrite Off。所以widget的前后关系与z坐标是没有关系的,而是与DrawCall的绘制顺序有关。所以如果要按照上图的depth来显示widget,必然只能分成3个DrawCall,并且按顺序绘制。
http://www.cnblogs.com/Oceanou/p/4001650.html
http://bbs.9ria.com/thread-282804-1-1.html
- NGUI Drawcall 优化
- NGUI界面Drawcall优化
- NGUI DrawCall优化
- NGUI DrawCall数量优化( 记录备忘 )
- NGUI DrawCall
- 【NGUI源码剖析】NGUI如何优化drawcall数量
- NGUI学习笔记(九):DrawCall优化简单总结
- NGUI 减少drawcall
- NGUI 减少drawcall
- NGUI 减少drawcall
- NGUI诡异的drawCall
- NGUI减少Drawcall
- NGUI减少Drawcall
- DrawCall 优化
- DrawCall 优化
- drawcall优化
- DrawCall优化
- drawcall优化
- httpclient4.x调用cxf发布的webservice的某个方法(有参数,有返回值)(未整合spring)
- 服务器端分页
- String.Empty、string=”” 和null的区别
- vtkCubeAxes的相关使用
- js setTimeout和setInterval
- NGUI Drawcall 优化
- A500的dial过程选择phone
- 线段树
- bzoj2521: [Shoi2010]最小生成树 最小割
- POJ 1904 King's Quest(强连通)
- 【JAVA】【NIO】8、Java NIO FileChannel
- json.dump() and sorted() dict
- cocos2dx 工程运行时 发生访问冲突 有可能是消息未移除的原因
- 高仿微信5.2.1主界面架构 包含消息通知