ugui 优化总结

drawcall–合并时只有真正发生叠加的ui元素,且不能合批的才会产生新的drawcall..

  • 避免图集分离,使用相同的图集。
  • 同一图集的Image元素应尽量保证在Hierarchy中连续,避免中间插入其他图集,或插入文本。
  • 避免或减少Mask的使用, 其中有mask UI会增加两个UI Instructions(mask / unmask),且不能合并(最终增加两个drawcall,分别使用Increment / Decrement mask Material Instance)。Mask实际上是前后使用或移除Stencil mask(来做像素剔除),在之间画所有子UI元素,mask UI下的子UI元素也无法与mask UI 之外的UI元素合并批次。
  • 少用Outline,Tiled Sprite. 在一个空场景中,给Text添加outline之后,顶点数大约是未添加之前的7.5倍。
  • 线框图wireframe,更方便查看元素是否有重叠

overdraw

  • 如果sprite是中心镂空且切图为九宫格时,可以去除fill center,以减少over draw
  • 游戏中许多时候会使用一个透明的Image组件来监听点击事件或者屏蔽Image后面的按钮事件,空的Image可以解决这个问题,用起来也很方便,但是空的Image照旧会参与绘制,从而产生overdraw。解决办法是扩展Graphic组件来替换Image组件。 如果是只要点击区域,不要显示内容的。可以把空白透明Image替换成qiankanglai提供的Empty4Raycast (http://blog.uwa4d.com/archives/fillrate.html)。只接收事件,清空顶点绘制。

rebuild

  • 尽量减少“动态”长文本(运行时修改文本内容)
  • 避免在UI树形结构下(Canvas下)频繁删除/增加UI对象,UI层次结构发生变化会引起整个Canvas UI顺序更新,特别是复杂的UI树形结构。
  • 避免频繁动态的更新UI元素的Vertex, Rect, Color, Material, Texture等,可能引起Canvas数据更新和Batch更新计算,有可能引起VBO Update(重新提交顶点数据)。
  • 避免UI元素数目过多和层次结构过于复杂影响Batch更新速度。
  • Canvas重建就是为了合并DC,将经常变化的文字放在独立的Canvas,手动分离Canvas(会增加DC,不能和其它文字合并),但文字变化时其它Canvas就不需要重建。

Raycasts

  • Image或Text,如果不需要点击,则不要勾选Raycasts

发表评论