Version: Unity 6.0 (6000.0)
语言 : 中文
使用使用提示减少绘制调用和几何体重新生成
平台和网格注意事项

控制动态图集的纹理

要减少因纹理更改而破坏的批次数量并实现良好性能,请使用图集将同时使用的纹理组合在一起。您可以使用以下任一方法实现此目的:

  • 使用精灵图集。使用此方法可以更好地控制精灵,但需要手动创建精灵图集。
  • 使用动态图集。当视觉元素引用动态图集时,UI 工具包会自动向动态图集添加纹理或从动态图集中删除纹理。

验证动态图集中的纹理

使用动态图集将纹理分组时,为了限制绘制调用次数,请确保纹理进入了动态图集。要进行验证,请使用帧调试器。帧调试器有助于观察纹理变化并推断批次中断的情况。

以下示例将验证动态图集是否包含运行时__ UI__(即用户界面,User Interface)让用户能够与您的应用程序进行交互。Unity 目前支持三种 UI 系统。更多信息
See in Glossary
中的所有纹理。

Dynamic Atlas 示例窗口包含运行时 UI 中的所有纹理。
Dynamic Atlas 示例窗口包含运行时 UI 中的所有纹理。

应用内置过滤器

动态图集纹理从指定的最小尺寸开始,根据需要以水平或垂直方向翻倍的方式增长,直至指定的最大尺寸。您可以在面板设置 (Panel Settings) 资源中定义最小和最大图集大小。还可以使用动态图集中的过滤器来决定是否向图集添加子纹理。

要启用或禁用过滤器,请在面板设置 (Panel Settings) 资源的检视面板 (Inspector) 窗口中,从动态图集设置 (Dynamic Atlas Settings) > 活跃过滤器 (Active Filters) 下拉列表中选择选项。

使用自定义过滤器

您可以为 PanelSettings.dynamicAtlasSettings.customFilter 分配自定义过滤器,以便在全局或每个纹理的基础上添加或放宽约束。

以下自定义过滤器示例绕过了 Size 过滤器中的大纹理,同时让 Size 过滤器对其他纹理保持活跃:

using UnityEngine;
using UnityEngine.UIElements;

class MyCustomFilter : MonoBehaviour
{
    public PanelSettings panelSettings;
    public Texture2D largeTexture;

    void OnEnable() { panelSettings.dynamicAtlasSettings.customFilter = Filter; }

    void OnDisable() { panelSettings.dynamicAtlasSettings.customFilter = null; }

    bool Filter(Texture2D texture, ref DynamicAtlasFilters filtersToApply)
    {
        if (texture == largeTexture)
        {
            // Disable the Size check for this one.
            filtersToApply &= ~DynamicAtlasFilters.Size;
        }
        return true;
    }
}

管理动态图集大小

当新元素出现在 UI 中时,它们的纹理将添加到动态图集,直到图集达到或超过 Dynamic Atlas Settings 中指定的 Max Atlas Size。

在内存有限的设备上,可能需要设置比默认值更低的 Max Atlas Size,例如 2048 像素(而不是 4096 像素)。

管理动态图集碎片化

在图集中添加或删除纹理时,可能导致碎片化,从而在先前纹理所在的位置产生小空间,这些空间太小而无法重新分配到其他纹理。

为了最大限度利用图集并避免碎片化,需要通过调用 RuntimePanelUtils.ResetDynamicAtlas() 扩展方法手动重置其内容,这需要访问 VisualElementpanel 属性。

请考虑根据应用程序的行为重置动态图集,例如在删除或添加大量视觉元素时。

以下示例展示了如何使用 RuntimePanelUtils.ResetDynamicAtlas() 扩展方法:

using UnityEngine;
using UnityEngine.UIElements;

[RequireComponent(typeof(UIDocument))]
class DynamicAtlasResetExample : MonoBehaviour
{
    VisualElement rootVisualElement => GetComponent<UIDocument>().rootVisualElement;

    public void OnEnable()
    {
        rootVisualElement.Add(new Button(ResetAtlas) { text = "Reset Dynamic Atlas"});
    }

    private void ResetAtlas()
    {
        rootVisualElement.panel.ResetDynamicAtlas();
    }

}

其他资源

使用使用提示减少绘制调用和几何体重新生成
平台和网格注意事项