版本:Unity 6 (6000.0)
语言:英语
使用使用提示来减少绘制调用和几何体重新生成
平台和网格注意事项

控制动态图集的纹理

为了减少纹理更改导致的批次数量,并获得良好的性能,请使用图集将同时使用的纹理分组在一起。您可以通过以下两种方法来实现这一点

  • 使用 精灵图集一个将多个精灵纹理紧密地打包到单个称为图集的纹理中的实用程序。 更多信息
    查看 术语表
    。使用此方法,您可以更好地控制精灵,但您需要手动创建 精灵一个 2D 图形对象。如果您习惯于使用 3D,精灵本质上只是标准纹理,但有一些特殊技术可用于组合和管理精灵纹理,以提高开发过程中的效率和便利性。 更多信息
    查看 术语表
    图集。
  • 使用动态图集。 UI(用户界面) 允许用户与您的应用程序进行交互。Unity 目前支持三种 UI 系统。 更多信息
    查看 术语表
    工具包在 视觉元素视觉树的节点,它实例化或继承自 C# VisualElement 类。您可以设置外观、定义行为,并将它们显示在屏幕上作为 UI 的一部分。 更多信息
    查看 术语表
    引用它们时,会自动将纹理添加到动态图集中,或从动态图集中删除纹理。

验证动态图集中的纹理

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

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

The example Dynamic Atlas window contains all the textures in runtime UI.
动态图集窗口包含运行时 UI 中的所有纹理。

应用内置滤镜

动态图集纹理从指定最小尺寸开始,并根据需要水平或垂直扩展,直至达到指定最大尺寸。您可以在面板设置资源中定义 最小和最大图集尺寸。您也可以使用动态图集中的滤镜来决定是否将子纹理添加到图集。

要在面板设置资源的检查器窗口中启用或禁用滤镜,请从 动态图集设置 > 活动滤镜 下拉列表中选择选项。

使用自定义滤镜

您可以将自定义滤镜分配给 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() 扩展方法,这需要访问 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();
    }

}

其他资源

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