テクスチャの変更によって中断されたバッチの数を減らし、良好なパフォーマンスに達するには、アトラスを使用して同時に使用するテクスチャをグループ化します。これは以下のいずれかの方法で達成できます。
ドローコール の数を制限するために、動的アトラスを使用してテクスチャをグループ化する場合は、テクスチャが動的アトラスに入るようにします。確認するには フレームデバッガー を使用します。フレームデバッガーは、テクスチャの変化を観察し、バッチの中断を推定するのに役立ちます。
以下の例では、動的アトラスにランタイム UI のすべてのテクスチャが含まれていることを確認します。
動的アトラステクスチャは指定された最小サイズから始まり、必要に応じて拡大します。水平方向または垂直方向に 2 倍になり、指定された最大サイズまで拡大します。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 以上になるまで、新しい要素のテクスチャが動的アトラスに追加されます。
メモリが限られたデバイスでは、4096 ピクセルではなく 2048 ピクセルなど、Max Atlas Size をデフォルトよりも低く設定する必要が生じることがあります。
テクスチャをアトラスに追加するか、アトラスから削除することで、断片化が生じて、以前のテクスチャがあった場所に、他のテクスチャに再割り当てするには小さすぎるスペースができることがあります。
アトラスの使用を最大化し、断片化を回避するには、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();
}
}