包含此页的版本:
不含此页的版本:
要减少因纹理更改而中断的批次数量并获得良好的性能,请使用图集将同时使用的纹理组合在一起。您可以使用以下任一方法实现此目的:
VisualElement类。您可以设置外观样式、定义行为并将其作为 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();
}
}