unity3d 关于 NGUI的UIDrawCall 和 U3D的drawcall(原)

关于遮挡关系

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合并时会创建一份合并数据,这份数据和所有对像的数据一样大,这样就会造成内存的开销,需要权衡利弊

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值