Ориентация кадрового буфера
Если ориентация кадрового буфера вашего приложения не совпадает с ориентацией экрана устройства (портретная, для большинства устройств), Android поворачивает кадровый буфер приложения, чтобы соответствовать дисплею устройства каждый кадр. В зависимости от возможностей оборудования устройства, это дополнительное вращение может негативно повлиять на производительность. Если ваше приложение использует Vulkan Graphics API и устройство поддерживает Vulkan, Unity может применить это вращение во время рендеринга, что уменьшает влияние вращения на производительность. Это называется pre-rotation.
Использование предварительного вращения в Unity
Чтобы Unity применял предварительное вращение, вы можете использовать скрипт C# или Unity Editor:
Через C# скрипты: Установите PlayerSettings.vulkanEnablePreTransform на
true.Через Unity Editor:
Выберите Изменить > Project Настройки.
В окне настроек Project выберите вкладку Игрок, затем откройте Android Player Settings.
В разделе Другие настройки включите Применять вращение экрана во время рендеринга.
Как Unity применяет предварительное вращение
Unity применяет предварительное вращение, когда он рендируется непосредственно в обратный буфер устройства, а не когда он рендируется в Текстура рендеринга. Чтобы применить вращение, Unity изменяет матрицу проекции, которая влияет на UNITY_MATRIX_MVP и UNITY_MATRIX_P Встроенные переменные шейдераЭто означает, что Unity применяет вращение в вершинном шейдере.
Предварительный поворот не влияет на поведение API C# в Unity. Например, для получения ширины экрана по-прежнему можно использовать Screen.width. То же относится к областям просмотра и прямоугольникам отсечения. Unity при необходимости корректирует их, а также обрабатывает операции чтения из заднего буфера, такие как Grab Pass, ReadPixels и Screenshot.
Unity предоставляет макросы для обработки особых случаев в шейдерах (для более подробной информации см. раздел Ограничения ниже).
Макрос UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION определяется только в том случае, если выполнены все следующие условия (в противном случае он не определяется):
preTransformвключено в Настройках Игрока- платформа установлена на Android
- графика API установлена на Vulkan
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM — константа, которая устанавливается на текущее вращение preTransform. Ее значение является одним из следующих:
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_0UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_90UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_180UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_270
Если UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION не определен, или при рендеринге в текстуру рендеринга, значение UNITY_DISPLAY_ORIENTATION_PRETRANSFORM будет UNITY_DISPLAY_ORIENTATION_0.
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM преобразуется в константу специализации Vulkan, поэтому её можно эффективно использовать в операторах if и switch.
Ограничения
В следующих случаях включение preTransform может потребовать дополнительных изменений в Unity Project, прежде чем вы сможете использовать его:
- Шейдеры, которые не используют матрицу проекции Unity
- Шейдеры, которые зависят от текущего положения пикселя в шейдере фрагмента (
SV_Position) - Шейдеры, использующие производные экранного пространства (ddx, ddy)
- Настоящие плагины отображения, которые используют образ Vulkan swapchain, могут нуждаться в модификации
- Использование backbuffer с Unity RenderPass API в MRT настройке вместе с другими текстурами рендеринга
Эти случаи применимы только при рендеринге непосредственно в backbuffer.
Дополнительные ресурсы
- Vulkan Руководство по дизайну на сайте разработчика Android.
- Vulkan Mobile Best Practice — Соответствующее использование вращения поверхности на сайте сообщества arm.