UGUI中Rebatch和Rebuild
Unity UGUI Rebatch和Rebuild
在Unity中,UGUI(Unity GUI)是一种用于创建用户界面的系统。当使用UGUI时,有两个重要的方法可以用于更新UI元素:Rebatch和Rebuild。
Rebatch:Rebatch是UGUI的一个方法,它用于重新分配和重新创建UI元素的渲染批次,Rebatch发生在C++层面,是指Canvas分析UI节点生成最优批次的过程,节点数量过多会导致算法(贪心策略)耗时较长。对应SetVerticesDirty,当一个canvas中包含的mesh发生改变时就触发,例如SetActive、transform的改变、 颜色改变、文本内容改变等等,canvas独立处理,互相不影响。消耗在对meshes按照深度和重叠情况排序、共享材质的检测等。
当UI元素的属性(如颜色、位置等)发生变化时,可以使用Rebatch方法来通知系统重新组织和重绘UI元素,以优化渲染性能。使用Rebatch不会对布局进行重新计算,而只会重新创建和排序渲染批次。
Batch以Canvas为单位,同一个Canvas下的UI元素最终都会被Batch到一个Mesh中。Batch前,UGUI根据UI材质以及渲染顺序重排,在不改变渲染结果的前提下,尽可能将相同材质的UI元素合并在同一个SubMesh中,以减少DC。Batch只在UI元素发生变化时进行,合成的Mesh越大,耗时越大。重建对Canvas下所有ui元素生效,不论是否修改过。
5.2之后底层是多线程的,考虑到现在手机上都是多核,这部分消耗可能会小很多。
Rebuild:Rebuild是UGUI的另一个方法,它用于完全重新构建UI元素的布局和渲染。当UI元素的结构发生变化时,如添加、删除、调整子元素等,可以使用Rebuild方法来重建整个UI元素的布局和渲染。Rebuild方法会触发布局计算、重新分配网格、重新创建渲染批次等步骤,以确保UI元素按照新的结构正确渲染。
Rebuild发生在C#层面,是指UGUI库中layout组件调整RectTransform尺寸、Graphic组件更新Material,以及Mask执行Cull的过程,耗时和发生变化的节点数量基本呈线性相关。
只有LayoutGroup的直接子节点,并且是 Graphic类型的(比如 Image 和 Text)会触发SetLayoutDirty。
Graphic改变的原因包括,基本的大小、旋转以及文字的变化、图片的修改等等,对应SetMaterialDirty。
需要注意的是,虽然Rebuild方法在某些情况下很有用,但它的调用会较重量级,并且可能会导致性能下降,特别是在频繁调用的情况下。因此,在应用中应该谨慎使用Rebuild方法,并尽量避免不必要的调用。
综上所述,Rebatch用于重新分配和重绘UI元素的渲染批次,而Rebuild用于完全重建UI元素的布局和渲染。根据具体的需求和情况,选择适合的方法来更新和优化UI元素的渲染。