Version: 6000.3
语言: 中文
在运行时优化移动元素的性能
平台和网格注意事项

控制动态图集的纹理

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

  • 使用精灵图集将多个精灵纹理紧密打包在称为图集的单个纹理中的工具。更多信息
    请参阅术语表
    .使用此方法,您可以更好地控制精灵,但您需要手动创建sprite2D 图形对象。如果你习惯于在3D中工作,精灵本质上只是标准纹理,但有一些特殊的技术可以组合和管理精灵纹理,以提高开发过程中的效率和便利性。更多信息
    请参阅术语表
    地图集。
  • 使用动态图集。UI Toolkit 在以下情况下自动向动态图集添加纹理或从中删除纹理视觉元素实例化或派生自 C# 的可视化树的节点VisualElement类。您可以设置外观样式、定义行为并将其作为 UI 的一部分显示在屏幕上。更多信息
    请参阅术语表
    引用它们。

验证动态图集中的纹理

使用动态图集将纹理分组在一起时,要限制绘制调用的数量,请确保纹理进入动态图集。要进行验证,请使用帧调试器。帧调试器可帮助您观察纹理变化并推断批量中断。

以下示例验证动态图集是否包含运行时UI中的所有纹理。

示例动态图集窗口包含运行时UI中的所有纹理。
示例动态图集窗口包含运行时UI中的所有纹理。

应用内置过滤器

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

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

使用自定义过滤器

您可以将自定义过滤器分配给PanelSettings.dynamicAtlasSettings.customFilter以全局或每个纹理添加或放宽约束。

以下自定义过滤器示例绕过了“大小”过滤器中的大型纹理,同时使其他纹理的“大小”过滤器保持活动状态:

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中出现新元素时,其纹理将添加到动态图集中,直到图集达到或超过动态图集设置中指定的最大图集大小。

在内存有限的设备上,您可能需要设置比默认值更小的最大图集大小,例如2048 像素计算机图像中的最小单位。像素大小取决于您的屏幕分辨率。像素光照是在每个屏幕像素下计算的。更多信息
请参阅术语表
而不是4096像素。

管理动态图集碎片

当在图集中添加或删除纹理时,可能会导致碎片化,在以前纹理所在的位置创建小空间,这些空间太小而无法重新分配给其他纹理。

为了最大限度地利用图集并避免碎片化,您需要通过调用RuntimePanelUtils.ResetDynamicAtlas()扩展方法,该方法需要访问panel属性VisualElement.

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

以下示例演示如何使用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();
    }

}

其他资源

在运行时优化移动元素的性能
平台和网格注意事项