为了减少纹理更改导致的批次数量,并获得良好的性能,请使用图集将同时使用的纹理分组在一起。您可以通过以下两种方法来实现这一点
VisualElement
类。您可以设置外观、定义行为,并将它们显示在屏幕上作为 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()
扩展方法,这需要访问 VisualElement
的 panel
属性。
根据您的应用程序的行为考虑重置动态图集,例如当您删除或添加大量视觉元素时。
以下示例显示了如何使用 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();
}
}