Во встроенном конвейере рендеринга вы можете использовать уровни графики для применения различных настроек графики, когда ваше приложение работает на оборудовании с разными возможностями. Вы можете использовать встроенные настройки уровня Unity для настройки общих параметров или определить настраиваемое поведение в собственном шейдереПрограмма, работающая на графическом процессоре. Подробнее
См. в коде Словарь или в коде C#.
Примечание. Эта функция поддерживается только во встроенном конвейере рендеринга. В других конвейерах рендеринга Unity по-прежнему проверяет оборудование при запуске и сохраняет его значение в Graphics.activeTier; однако значение этого поля не имеет значения, и Unity не выполняет никаких других операций, связанных с уровнями графики.
Обзор уровней графики
Когда Unity впервые загружает ваше приложение, оно проверяет аппаратный и графический API и определяет, какому графическому уровню соответствует текущая среда.
The graphics tiers are:
Значение | Оборудование | Соответствующее значение перечисления GraphicsTier | Соответствующее ключевое слово шейдера |
---|---|---|---|
1 | Android: устройства, поддерживающие только OpenGL ES 2 iOS: iPhone до iPhone 5S (не включая 5S, но включая 5C), iPod до 5-го поколения включительно, iPad до 4-го поколения, iPad mini первого поколения Рабочий стол: DirectX 9 XR: HoloLens |
Tier1 | UNITY_HARDWARE_TIER1 |
2 | Android: устройства с поддержкой OpenGL ES 3, устройства с поддержкой Vulkan iOS: iPhone начиная с iPhone 5S, iPad Air, iPad mini 2-го поколения, iPod 6-го поколения, AppleTV WebGL: все устройства |
Tier2 | UNITY_HARDWARE_TIER2 |
3 | Desktop: OpenGL, Metal, Vulkan, DirectX 11+ | Tier3 | UNITY_HARDWARE_TIER3 |
Использование уровней графики со сценариями C#
Unity сохраняет значение текущего уровня графики в Graphics.activeTier, представленное GraphicsTier. Чтобы добавить пользовательское поведение на основе текущего уровня графики, вы можете протестировать это значение.
Чтобы переопределить значение Graphics.activeTier
, задайте его напрямую. Обратите внимание, что вы должны сделать это до того, как Unity загрузит любые шейдеры, которые различаются в зависимости от графического уровня. Лучше всего устанавливать это значение в предзагружаемой сценеСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
Посмотрите в Словарь перед загрузкой основной сцены.
Настройки уровня
В редакторе Unity вы можете настроить настройки уровня. Настройки уровня позволяют включать или отключать графические функции для каждого уровня.
Уровневые настройки работают путем изменения директив препроцессора #define
во внутреннем коде шейдера Unity. Эти изменения автоматически затрагивают готовые шейдеры для встроенного конвейера рендеринга (например, стандартный шейдер) и код внутренней библиотеки шейдеров для Шейдеры поверхностиУпрощенный способ написания шейдеров для встроенного конвейера рендеринга. Подробнее
См. в Словарь. Вы также можете добавить код в свои собственные шейдеры, написанные вручную, которые изменяют их поведение в зависимости от настроек уровня. Дополнительную информацию см. в разделе Уровни графики и варианты шейдеров.
Настройки уровня по умолчанию подходят для большинства случаев использования. Их следует изменять только в том случае, если у вас возникли проблемы с производительностью или если вы хотите включить функции на более дешевых устройствах, которые не включены по умолчанию.
Вы можете настроить различные параметры уровня для каждого уровня графики данной цели сборки. Вы можете изменить настройки уровня следующими способами:
- Используйте окно Настройки графики в разделе Настройки уровня.
- Используйте эти API в скрипте редактора:
Вы можете проверить настройки уровня в редакторе. Для этого перейдите в раздел Правка > Уровень графики и выберите уровень, который вы хотите использовать в редакторе Unity.
Уровни графики и варианты шейдеров
Во встроенном конвейере рендеринга Unity может создавать варианты шейдераВерсия шейдерной программы, которую Unity генерирует в соответствии с определенной комбинацией ключевых слов шейдера и их статусом. Объект Shader может содержать несколько вариантов шейдера. Подробнее
См. в Словарь, соответствующие уровням графики.
Примечание. Эти многоуровневые варианты шейдеров работают иначе, чем обычные варианты шейдеров. Во время выполнения, когда Unity загружает объект Shader в память ЦП, он загружает только варианты для активного уровня; он не загружает варианты для других уровней. Это помогает снизить влияние многоуровневых вариантов на время выполнения.
Чтобы сгенерировать многоуровневые варианты шейдеров, Unity добавляет этот набор ключевых слов шейдера ко всем графическим шейдерам:
UNITY_HARDWARE_TIER1
UNITY_HARDWARE_TIER2
UNITY_HARDWARE_TIER3
You can use these keywords in your HLSL code to write conditional behavior for lower or higher-end hardware, the same way that you would for any shader keywords. For example:
#if UNITY_HARDWARE_TIER1
// Put code for tier 1 devices here
#else
// Put code for other devices here
#endif
Дополнительную информацию о работе с ключевыми словами шейдеров в коде HLSL см. в разделе Объявление и использование ключевых слов шейдеров в HLSL.
Unity автоматически создает варианты многоуровневых шейдеров на основе настроек уровня для текущей цели сборки, например:
- Если все настройки для всех уровней одинаковы, Unity не создает никаких вариантов шейдера уровня.
- Если какие-либо настройки для разных уровней отличаются, Unity создает все варианты шейдера уровня.
После создания всех вариантов многоуровневых шейдеров Unity идентифицирует и дедуплицирует идентичные варианты многоуровневых шейдеров. Это означает, что если настройки для двух уровней идентичны (например, если уровень 1 отличается, но уровень 2 и уровень 3 идентичны друг другу), то эти варианты не увеличивают размер файла вашего приложения, а способ То, что Unity загружает варианты уровней, означает, что они не влияют на время загрузки или использование памяти во время выполнения. Однако это по-прежнему приводит к лишней работе по компиляции.
Если вы хотите использовать разные настройки для разных уровней, но также знаете, что это приведет к избыточной работе (например, если вы знаете, что ваше приложение будет работать только на устройствах уровня 1 и уровня 2), вы можете использовать скрипт для удаления ненужных вариантов уровня из компиляции, как и для любых других вариантов. Дополнительную информацию см. в разделе Удаление вариантов шейдера.
В дополнение к автоматическому поведению вы также можете заставить Unity генерировать варианты многоуровневых шейдеров для каждого шейдера. Это полезно, если вы используете эти константы в коде HLSL и хотите быть уверены, что Unity скомпилирует требуемые варианты, независимо от того, отличаются ли настройки уровней для текущей сборки друг от друга
Чтобы заставить Unity вручную генерировать варианты многоуровневых шейдеров для заданного шейдера, используйте директиву препроцессора #pragma hardware_tier_variants
в своем коде HLSL и укажите графические API, для которых вы хотите для создания вариантов для каждого уровня:
#pragma hardware_tier_variants gles3
Список допустимых имен графических API, которые можно использовать с этой директивой, см. в разделе Нацеливание на графические API. Общие сведения о директивах #pragma
см. в разделе директивы pragma.