欢迎光临散文网 会员登陆 & 注册

《Unity性能优化》系列课程笔记——第拾节

2022-03-23 10:51 作者:Metaverse大衍神君  | 我要投稿

2022年3月22日第拾讲 UGUI(上)

Unity UI性能的四类问题

  1. Canvas Re-batch 时间过长

  2. Canvas Over-dirty, Re-batch次数过多

  3. 生成网格顶点时间过长

  4. Fill-rate overutilization

Canvas画布

Canvas负责管理UGUI元素,负责UI渲染网格的生成与更新,并向GPU发送DrawCall指令。

Canvas Re-batch过程

  1. 根据UI元素深度关系进行排序

  2. 检查UI元素的覆盖关系

  3. 检查UI元素材质并进行合批

UGUI渲染细节

  • UGUI中渲染是在Transparent半透明渲染队列中完成的,半透明队列的绘制顺序是从后往前画,由于UI元素做Alpha Blend,我们在做UI时很难保障每一个像素不被重画,UI的Overdraw太高,这会造成片元着色器利用率过高,造成GPU负担。

  • UI SpriteAtlas图集利用率不高的情况下,大量完全透明的像素被采样也会导致像素被重绘,造成片元着色器利用率过高;同时纹理采样器浪费了大量采样在无效的像素上,导致需要采样的图集像素不能尽快的被采样,造成纹理采样器的填充率过低,同样也会带来性能问题。

Re-Build过程

  • 在WillRenderCanvases事件调用PerformUpdate::CanvasUpdateRegistry接口

    • 通过ICanvasElement.Rebuild方法重新构建Dirty的Layout组件

    • 通过ClippingRegistry.Cullf方法,任何已注册的裁剪组件Clipping Compnents(Such as Masks)的对象进行裁剪剔除操作

    • 任何Dirty的 Graphics Compnents都会被要求重新生成图形元素

  • Layout Rebuild

    • UI元素位置、大小、颜色发生变化

    • 优先计算靠近Root节点,并根据层级深度排序

  • Graphic Rebuild

    • 顶点数据被标记成Dirty

    • 材质或贴图数据被标记成Dirty

使用Canvas的基本准则:

  • 将所有可能打断合批的层移到最下边的图层,尽量避免UI元素出现重叠区域

  • 可以拆分使用多个同级或嵌套的Canvas来减少Canvas的Rebatch复杂度

  • 拆分动态和静态对象放到不同Canvas下。

  • 不使用Layout组件

  • Canvas的RenderMode尽量Overlay模式,减少Camera调用的开销

UGUI射线(Raycaster)优化:

  • 必要的需要交互UI组件才开启“Raycast Target”

  • 开启“Raycast Targets”的UI组件越少,层级越浅,性能越好

  • 对于复杂的控件,尽量在根节点开启“Raycast Target”

  • 对于嵌套的Canvas,OverrideSorting属性会打断射线,可以降低层级遍历的成本


《Unity性能优化》系列课程笔记——第拾节的评论 (共 条)

分享到微博请遵守国家法律