Unity 6.3
0 онлайн 118 гостей 3 в системе
Вход
Материалы и шейдеры Шаг 379 из 442

Уменьшить дублирование шейдера в AssetBundles

Если вы используете AssetBundles, Unity может компилировать дубликаты шейдеров. Например, если материалы в двух AssetBundles ссылаются на один и тот же шейдер, Unity может включать копию компилированного шейдера в каждом AssetBundle. Это может увеличить память и пространство, используемое вашим проектом, и нарушить рисовать вызов пакетирования.

Чтобы избежать дублирования шейдеров, добавьте ваши шейдеры в AssetBundle, и во время выполнения убедитесь, что вы загрузили шейдеры AssetBundle первыми.

Используйте один из следующих подходов:

  • Добавьте все ваши шейдеры в один AssetBundle. Это самый простой подход, но он может потреблять больше памяти во время выполнения.
  • Создайте отдельный AssetBundle для шейдеров из каждой сцены или типа среды.

Добавьте все ваши шейдеры в один AssetBundle

Выполните следующие действия:

  1. Создайте файл, содержащий список вариантов шейдеров, используемых вашим созданным приложением.

    Если вы нацелены на DirectX 12, Vulkan, Metal или WebGPU, создайте файл .graphicsState. Дополнительные сведения см. в разделе Отслеживание и управление сборами данных PSO.

    В противном случае создайте файл .shaderVariants. См. создать коллекцию вариантов шейдеров.

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

  2. Назначьте сгенерированный файл .graphicsState или .shadervariants файлу AssetBundle.

  3. Назначьте все ваши .shader ассеты одному и тому же AssetBundle.

  4. Назначьте ваши материалы либо шейдерам AssetBundle, либо другим AssetBundles. В других AssetBundles, Unity обнаруживает ассеты .shader, на которые сделана ссылка в первом AssetBundle, и не включает дублирующие шейдеры.

  5. Создайте свой проект. Во время сборки Unity использует информацию из файла .graphicsState или .shadervariants, чтобы убедиться, что он компилирует все варианты шейдеров, используемые вашим приложением.

  6. Во время выполнения сначала загрузите и создайте экземпляр AssetBundle, содержащий шейдеры. Затем загрузите и создайте экземпляр AssetBundles, содержащий материалы.

Информацию о том, как избежать Unity, включая дубликаты шейдеров как из AssetBundles, так и из сцен, см. в Избежание дублирования активов.

Создать отдельный AssetBundle для каждой сцены или типа среды

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

Чтобы избежать этого, создайте отдельный AssetBundle для каждой группы шейдеров, которые вы используете вместе. Например, AssetBundle для каждой сцены или типа среды.

Например:

  1. Создать файл, содержащий список вариантов шейдеров для одной сцены или среды.
  2. Назначьте сгенерированный файл .graphicsState или .shadervariants файлу AssetBundle.
  3. Назначить только соответствующие .shader ассеты тому же AssetBundle.
  4. Назначьте материалы сцены либо тому же AssetBundle, либо другому AssetBundle.
  5. Повторите шаги с 1 по 4 для каждой сцены или типа среды, используя для каждой из них другой AssetBundle.
  6. Когда вы загружаете сцену во время выполнения, сначала загрузите и инстанцируйте AssetBundle, содержащий ее шейдеры. Затем загрузите и инстанцируйте AssetBundles, содержащий материалы сцены.

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