NGUI DrawCall优化
来源:互联网 发布:手机淘宝改差评步骤 编辑:程序博客网 时间:2024/06/10 01:04
上一篇博客主要是简单的介绍了下NGUI合并DrawCall的基本原理,就是将一个UIPanel里所有的UIWidget按照Depth的大小进行排序,然后遍历排序后的UIWidget列表,将Depth相邻的并且懂事引用同一个Atlas的UIWidget的几何数据存入到一个UIGeometry中然后统一由一个UIDrawCall来调用GPU绘制。
那么知道了NGUI DrawCall 的基本原理 我们就可以对游戏里的UI进行优化以达到减少DrawCall的目的,那么该如何优化呢?
1、首先,我们的UI要分模块话,将只有该模块用到的图片尽量打包一个Atlas里,而一些其他模块都会用到的图片打包一个通用的Altas里,这样可减少Atlas的穿插应用,即减少了内存也方便管理,更主要的是这样我们更容易为后续减少DrawCall做准备。
2、然后就是尽可能的将引用到同一个Atlas的UIWidget的Depth相邻,这样能让后续UIWidget排序时将引用同一个Atlas的UIWidget相邻。比如我在项目中会将引用到同一个Atlas的UISprite的Depth设置在一个范围里,字体的设置在另一个范围里,尽可能的让它们之间少参插。
OK,大概的优化思路就是这样,接下来让我们做个例子来看看实际的效果:
上面的图就是我创建了5个UISprite但是他们应用的都是同一个Atlas,这时当你的这个UIPanel里所有的UISprite引用的都是同一个Atlas并且没有其他UIWidget时,Depth就不用管了,从图可以看到5个UISprite只有一个DrawCall,那么如果有引用了两个Atlas,那么DrawCall会不会只有两个?答案是否定的,只能说DrawCall最少有两个。继续看例子:
从图里可以看到我引用了两个Atlas但是DrawCall却有5个,这是不是有点恐怖,你想想如果没个UIWidget都要一个DrawCall的话,那我们UI的DrawCall就会大的让你无法接受,要是这样的游戏装在手机上玩那你的手机都可以煎鸡蛋了,呵呵。。 这样肯定是不行的。那么我是怎么做才会有这么都的DrawCall的呢,其实就他们的Depth进行了参插,将第二个和第四个sprite1引用Atlas设成了Refractive Atlas。下面就用上面说的优化思来优化尽可能的优化到2DrawCall,我这里是很容易做到的,如果UI很复杂的话我们就尽力而为吧,好了,看结果:
哦啦,DrawCall真的减少了而且是减到最少了,我的做法就是把引用到Wooden Atlas的UIWidget的Depth设成相邻的0、1、2,而引用Refractive Atlas的UIWidget的Depth设成3和4了,这样就达到了上面的效果了。
哦啦,NGUI DrawCall的优化就写到这啦,写的很简单,如果大神有更好的建议或补充请指教!!!!!!
- 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优化
- Mysql命令大全
- 解决方案-Genymotion 首次安装登陆时出现generic unknown error
- cocos2dx 物理按键
- 邻接表(Java)
- 多态的实现:http://bbs.csdn.net/topics/370166353
- NGUI DrawCall优化
- HDFS源码分析心跳汇报之整体结构
- CodeForces-630 J. Divisibility
- 绘制直方图
- js图片库(无缝循环切换,左右移动效果)
- iOS 开源项目介绍之网络篇
- hdu3709Balanced Number【数位dp】
- MapReduce:详解Shuffle过程
- 旋转数组的最小数字