要减少因纹理更改而破坏的批次数量并实现良好性能,请使用图集将同时使用的纹理组合在一起。您可以使用以下任一方法实现此目的:
使用动态图集将纹理分组时,为了限制绘制调用次数,请确保纹理进入了动态图集。要进行验证,请使用帧调试器。帧调试器有助于观察纹理变化并推断批次中断的情况。
以下示例将验证动态图集是否包含运行时__ UI__(即用户界面,User Interface)让用户能够与您的应用程序进行交互。Unity 目前支持三种 UI 系统。更多信息
See in Glossary 中的所有纹理。
动态图集纹理从指定的最小尺寸开始,根据需要以水平或垂直方向翻倍的方式增长,直至指定的最大尺寸。您可以在面板设置 (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() 扩展方法手动重置其内容,这需要访问 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();
}
}