Unity 6.3
0 онлайн 57 гостей 3 в системе
Вход

Текстуры управления динамического атласа

Чтобы уменьшить количество пакетов, разрушаемых изменениями текстуры, и добиться хорошей производительности, используйте атлас для группировки текстур, используемых одновременно. Вы можете сделать это любым из следующих способов:

  • Используйте Атлас спрайтов. С помощью этого метода, вы имеете больше контроля над спрайтами, но вам нужно вручную создать атлас спрайтов.
  • Используйте динамический атлас. UI Toolkit автоматически добавляет текстуры в динамический атлас или удаляет текстуры из него, когда визуальные элементы ссылаются на них.

Проверка текстур в динамическом атласе

При использовании динамического атласа для группировки текстур, для ограничения количества вызовов вызовов отрисовкиубедитесь, что ваши текстуры входят в динамический атлас. Для проверки используйте Frame Debugger. Frame Debugger помогает вам наблюдать изменения текстуры и выводить разрыв партии.

В следующем примере проверяется, что динамический атлас содержит все текстуры во время выполнения UI.

Пример окна Динамического Атласа содержит все текстуры во время выполнения UI.
Пример окна Динамического Атласа содержит все текстуры во время выполнения UI.

Применение встроенных фильтров

Текстура динамического атласа начинается с заданного минимального размера и увеличивается по мере необходимости, удвояясь горизонтально или вертикально, до заданного максимального размера. Вы можете определить минимальный и максимальный размеры атласа и в ассете Настройки панели. Вы также можете использовать фильтры в динамическом атласе, чтобы решить, добавлять ли субтекстуру в атлас.

Чтобы включить или отключить фильтры, в окне Inspector ассета Настройки панели выберите параметры из раскрывающегося списка Настройки динамического атласа > Активные фильтры.

Использовать настраиваемые фильтры

Вы можете назначить пользовательский фильтр 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 появляются новые элементы, их текстуры добавляются в динамический атлас до тех пор, пока атлас не достигнет или не превысит Максимальный Размер Атласа, указанный в Настройках Динамического Атласа.

На устройствах с ограниченной памятью, возможно, потребуется установить Max Atlas Size ниже значения по умолчанию, например 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();
    }

}

Дополнительные ресурсы