Unity UI合批的问题

本文探讨了Unity中UI合批的关键因素,包括Depth、Material Id和Texture Id。深度决定了覆盖关系,Material和Texture用于进一步排序。排序完成后,Unity根据整体排序进行合批,合批过程不考虑原始深度信息。通过实例解释了如何影响合批批次数量。

今天看到一个问题,主要说的是Unity中的UI资源合批的问题

之前一直以为主要和UI资源在Hierarchy中的排列顺序有关,但其实这并不是最主要的,因为Unity会对同一个Canvas下的UI进行排序(注:不同Canvas下的资源是不能够合批的)

而合批的关键就是这个【排序】

先简单来说,排序主要根据三个键值:Depth、Material Id、Texture Id

  1. Depth

通常来说就是我们理解的覆盖关系,比如B覆盖在A的上方,即A先渲染,B后渲染,那么我们可以把A、B的Depth分别为0和1、如果都没有个被覆盖,那么大家的Depth都是0。Unity会先根据各个资源的Depth进行一个排序;

  1. Materail 和 Texture

在通过Depth进行排序了之后,同一Depth中的资源会先后根据【Material】和【Texture】在进行两次排序

以上就是Unity最资源排序整理的过程,而在排序了之后,就是合批。这里要注意的是,排序和合批是相互独立互不影响,排序做完了后,根据整体排序的UI资源进行合批。

### 解决 Unity UI 元素重叠时打断的方法 当处理 Unity 中的 UI 问题时,UI 元素之间的重叠可能会导致 GPU 绘制调用次数增加,从而影响性能。为了优化这种情况并保持良好的视觉效果,可以采取以下几种方法: #### 1. 使用 `CanvasGroup` 控件管理透明度交互状态 通过使用 CanvasGroup 可以统一控制一组 UI 元素的状态而不必单独调整每个组件。这样有助于减少不必要的绘制操作。 ```csharp using UnityEngine; using UnityEngine.UI; public class OptimizeUICanvas : MonoBehaviour { private void Start() { var canvasGroups = GetComponentsInChildren<CanvasGroup>(); foreach (var group in canvasGroups) { if (!group.blocksRaycasts && !group.interactable) continue; // Skip non-interactive groups // Adjust alpha or interactability as needed without affecting batching group.alpha = 0.8f; group.interactable = false; } } } ``` #### 2. 调整 `Sprite Packer` 设置来改善效率 确保所有的 Sprite 都被打包在一起,并且启用了读/写权限以便于动态纹理更新。此外,在项目设置中启用 "Always Create Meshes" "Packed Bitmaps" 来进一步提升表现[^1]。 #### 3. 尽量减少可见的对象数量 对于复杂的界面布局,考虑简化设计或隐藏不必要显示的部分。正如之前提到过的那样,降低场景中的对象数目能够显著缓解渲染压力[^2]。 #### 4. 应用自定义着色器实现高效的遮罩效果 创建专门针对特定需求定制化的 Shader Code,可以在不影响整体架构的前提下达到理想的视觉呈现同时维持较高的运行效能。 ```hlsl Shader "Custom/UI Mask" { Properties { _MainTex ("Texture", 2D) = "white" {} _StencilComp ("Stencil Comparison", Float) = 8 _Stencil ("Stencil ID", Float) = 0 _StencilOp ("Stencil Operation", Float) = 0 _StencilWriteMask ("Stencil Write Mask", Float) = 255 _StencilReadMask ("Stencil Read Mask", Float) = 255 } SubShader { Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} LOD 100 Pass { Stencil { Ref [_Stencil] Comp [_StencilComp] Pass [_StencilOp ] ReadMask [_StencilReadMask] WriteMask [_StencilWriteMask] } Blend SrcAlpha OneMinusSrcAlpha ZWrite Off Cull Off CGPROGRAM #pragma vertex vert #pragma fragment frag ... ENDCG } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值