unity3d 关于 NGUI的UIDrawCall 和 U3D的drawcall(原)
2014-09-18 11:55
387 查看
关于遮挡关系
1.NGUI2.6版本不同的panel用z轴调遮挡关系,一个panel下相同的atlas用depth调遮挡关系,不同的atlas用z调遮挡关系
2.NGUI3.5版本不管panel是否相同只用depth调遮挡关系,但如果renderQ使用startat则按renderQ计算遮挡关系
关于UIDrawCall
1.不管是NGUI的2.6版本还是3.5版本,都是panel做为一个渲染单元,panel负责产生UIDrawcall
2.所以优化应该为尽量减少panel的数量,但ngui低层有优化,如果没变化过的panel有可能不被重绘drawcall,所以在可以把不变的(没有动画的)panel和变动的panel分开,在这个前提下在减少panel
3.NGUI2.6版本一个panel下,相同的材质(每个atlas产生一个材质)会使用一个drawcall,所以制作功能界面时尽量一个面板下使用一个atlas。产生drawcall代码实现是
遍历当前panel下的所有材质,然后在遍历当前panel下的所有子物体,找到和当前材质相的所有子物体放到一份顶点数据缓存(UV坐标等缓存也一样),然后产生一个当前材质的drawcall传入合并后的数据缓存。
这样会造成一个问题,就是想要两个相同的atlas之间夹别一个atlas时无法做到,无轮是调z轴还是depth,原因是就相同的atlas合并数据后会接最远处的Z轴计算,这样中间的atlas就到最前面来了,造成遮错误,解决办法只能是添加panel
4.NGUI3.5版本一个panel下也是相同材质使用同一个drawcall,但前提是他们的depth相同或相临,如果中间夹有别的atlas,就会分别产生各自的drawcall(为了解决上面提到的遮挡问题)产生drawcall代码实现是
遍历当前panel下的所有子物体,如果发现和上一个子物体材质、贴图、shader有一个不同就创建新的drawll,都相同就使用上一个drawcall,然后把顶点数据等合并到这个drawcall的数据缓存(UV坐标等也一样)
关于U3D的drawcall
u3d自己实现了两种drawcall的批处理方式,分别是dynamic batching(动态批处理)和static batching(静态批处理),可以在playerset中开启或关闭
1.dynamic时,只需不需要人工干预,当是动态的对像,并且顶点数小于65000,u3d会自动合并使用一个drawcall
2.static时需要把场景中不动的对像,勾选成static属性,无论是坐标还是动画都要不动,u3d会把这些相同的材质强制合并成一个drawcall,当场景中静态对像较多并使用同一材质时,效率会很大提升,但u3d合并时会创建一份合并数据,这份数据和所有对像的数据一样大,这样就会造成内存的开销,需要权衡利弊
1.NGUI2.6版本不同的panel用z轴调遮挡关系,一个panel下相同的atlas用depth调遮挡关系,不同的atlas用z调遮挡关系
2.NGUI3.5版本不管panel是否相同只用depth调遮挡关系,但如果renderQ使用startat则按renderQ计算遮挡关系
关于UIDrawCall
1.不管是NGUI的2.6版本还是3.5版本,都是panel做为一个渲染单元,panel负责产生UIDrawcall
2.所以优化应该为尽量减少panel的数量,但ngui低层有优化,如果没变化过的panel有可能不被重绘drawcall,所以在可以把不变的(没有动画的)panel和变动的panel分开,在这个前提下在减少panel
3.NGUI2.6版本一个panel下,相同的材质(每个atlas产生一个材质)会使用一个drawcall,所以制作功能界面时尽量一个面板下使用一个atlas。产生drawcall代码实现是
遍历当前panel下的所有材质,然后在遍历当前panel下的所有子物体,找到和当前材质相的所有子物体放到一份顶点数据缓存(UV坐标等缓存也一样),然后产生一个当前材质的drawcall传入合并后的数据缓存。
这样会造成一个问题,就是想要两个相同的atlas之间夹别一个atlas时无法做到,无轮是调z轴还是depth,原因是就相同的atlas合并数据后会接最远处的Z轴计算,这样中间的atlas就到最前面来了,造成遮错误,解决办法只能是添加panel
4.NGUI3.5版本一个panel下也是相同材质使用同一个drawcall,但前提是他们的depth相同或相临,如果中间夹有别的atlas,就会分别产生各自的drawcall(为了解决上面提到的遮挡问题)产生drawcall代码实现是
遍历当前panel下的所有子物体,如果发现和上一个子物体材质、贴图、shader有一个不同就创建新的drawll,都相同就使用上一个drawcall,然后把顶点数据等合并到这个drawcall的数据缓存(UV坐标等也一样)
关于U3D的drawcall
u3d自己实现了两种drawcall的批处理方式,分别是dynamic batching(动态批处理)和static batching(静态批处理),可以在playerset中开启或关闭
1.dynamic时,只需不需要人工干预,当是动态的对像,并且顶点数小于65000,u3d会自动合并使用一个drawcall
2.static时需要把场景中不动的对像,勾选成static属性,无论是坐标还是动画都要不动,u3d会把这些相同的材质强制合并成一个drawcall,当场景中静态对像较多并使用同一材质时,效率会很大提升,但u3d合并时会创建一份合并数据,这份数据和所有对像的数据一样大,这样就会造成内存的开销,需要权衡利弊
相关文章推荐
- unity3d 关于 NGUI的UIDrawCall 和 U3D的drawcall(原)
- Unity3d NGUI的drawcall,UISprite与UITexture
- Unity3D-深入剖析NGUI的游戏UI架构 --主要讲了UIWiget,UIDrawCall,UINode,UIPanel
- (转)最近一个项目中关于NGUI部分的总结(深度和drawCall)
- 【Unity3D游戏开发】NGUI之DrawCall数量 (四)
- NGUI所见即所得之深入剖析UIPanel,UIWidget,UIDrawCall底层原理
- NGUI 减少drawcall
- 源码分析NGUI的DrawCall合并原理
- 关于Unity3D中Resources动态加载NGUI图片的方法!!!
- [unity基础教程]关于Unity3D中Resources动态加载NGUI图片的方法!
- 各种 基于Unity3d 引擎的Android游戏优化 (drawcall)
- 源码分析NGUI的DrawCall合并原理
- 关于Unity3D中Resources动态加载NGUI图片的方法!!!
- Unity3D游戏设计之旅--页面篇:NGUI使用(二)关于系统通知设计的理念
- NGUI诡异的drawCall
- Unity3D性能优化之Draw Call Batching
- 关于Unity3D中Resources动态加载NGUI图片的方法!!!
- U3D DrawCall优化手记
- 关于Unity3D中Resources动态加载NGUI图片的方法
- Unity3D - 性能优化之Draw Call