Unity3D UI常见系统性能优化
什么是Drawcall?
Draw Call就是CPU调用图形编程接口,比如DirectX或OpenGL,来命令GPU进行渲染的操作。
如何避免Drawcall?
整理所有的Materials,按照它们的Shader类型将Materials进行分类,把所有使用同一个Shader的Material上的纹理放入atlas图集中,新创建一个Material,它包含着Shader以及前面的atlas图集,重新绘制网络上的UV纹理坐标,让它可以匹配到atlas图集,把前面创建的Material放到重新绘制的网络上。
什么是重建?
重建分为Rebatch(合批网格重建)和Rebuild(单个UI物体重绘),其中Rebatch负责Canvas下所有组件合批生成Mesh,Rebuild负责单个物体的重绘。
如何避免UI Rebuild?
#1)减少不必要的UI元素,减少深度排序时间,和rebuild的时间。(删元素)
#2)减少Rebuild的频率,将动态UI元素(频繁改变例如顶点、alpha、坐标和大小等的元素)与静态UI元素分离出来,放到特定的Canvas中。(动静分离)
#3)尽量不使用UI元素的enable和disable,而使用UI元素的Canvas或者canvas render 的enable和disable。()
#4)谨慎使用Text的Best Fit选项,代价很高,增加额外生成时间。(禁Best Fit)
#5)谨慎使用Canvas的Pixel Perfect选项,该选项会使得ui元素在发生位置变化时,造成layout Rebuild。(比如ScrollRect滚动时,如果开启了Canvas的pixel Perfect,会使得Canvas.SendWillRenderCanvas消耗较高)
#6)使用缓存池来保存ScrollView中的Item,对于移出或移进View外的的元素,不要调用disable或enable,而是把它们放到缓存池里或从缓存池中取出复用。
#7)除了rebuild过程之外,UGUI的touch处理消耗也可能会成为性能热点。因为UGUI在默认情况下会对所有可见的Graphic组件调用raycast。对于不需要接收touch事件的grahic,一定要禁用raycast。对于unity5以上的可以关闭graphic的Raycast Target而对于unity4.6,可以给不需要接收touch的UI元素加上canvasgroup组件。