Динамическое разрешение в Unreal Engine 4

0
34
Динамическое разрешение в Unreal Engine 4

Динамическое разрешение корректирует процентное соотношение основного экрана в соответствии с рабочей нагрузкой предыдущих графических процессоров. Разрешение регулируется (при необходимости) на основе эвристики, например, когда на экране слишком много объектов или если в кадр неожиданно входит дорогой эффект. Время рендеринга с помощью графического процессора увеличится, а разрешение экрана будет уменьшено, чтобы поддерживать целевую частоту кадров.

Включение динамического разрешения

Вы можете включить динамическое разрешение для своего проекта, используя Operation Mode (Режим работы), чтобы установить, как оно может быть переопределено и использовано в вашей игре. Чтобы контролировать это в профиле конфигурации вашего проекта (или профиле устройства) для вашей платформы (Xbox One, PlayStation 4 и т.д.) вы можете использовать следующую консольную команду:


   r.DynamicRes.OperationMode

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

  • 1 включает динамическое разрешение в зависимости от состояния пользовательских настроек игры (установлено в C++ или Blueprint).
  • 2 включает динамическое разрешение независимо от состояния пользовательских настроек игры.

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

Переменная КонсолиЗначение по умолчаниюОписание
r.DynamicRes.MinScreenPercentage50Устанавливает минимальный процент экрана для использования.
r.DynamicRes.MaxScreenPercentage100Устанавливает максимальный процент основного экрана, который используется для выделения render targets.
r.DynamicRes.FrameTimeBudget33.3Устанавливает бюджет кадра (в миллисекундах).
Вы можете использовать окно Device Profiles (профили устройств) в UE4, чтобы настроить файлы конфигурации и управлять ими за вас. Вы можете получить доступ к этому окну через меню файлов, выбрав Edit > Developer Tools > Device Profiles.

Приостановка и возобновление динамического разрешения

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


r.DynamicRes.OperationMode
ЗначениеОписание
0Отключено (по умолчанию)
1Включено в зависимости от настроек, используемых в GameUserSettings.
2Включено независимо от настроек, используемых GameUserSettings.

В таблице ниже представлены различные состояния, которые доступны, когда конкретный режим работы включен или отключен, и как это влияет на GameUserSettings:

Game User Settings = FalseGame User Settings = True
При- остановленоНе при-остановленоПри-остановленоНе при-остановлено
OperationMode=0нетнетнетнет
OperationMode=1нетнетнетда
OperationMode=2нетданетда

В C++ вы можете использовать следующие функции для контроля и проверки состояния динамического разрешения:

ДействиеC++ функция
Pause (пауза)GEngine->PauseDynamicResolution();
Resume (возобновление)GEngine->ResumeDynamicResolution();
Check Status (проверка статуса – Включено/Отключено или на Паузе)GEngine->GetDynamicResolutionStatus();
Функциональность, предоставляемую функциями C++ в этой таблице для Pause (паузы) и  Resume (возобновления), может быть достигнута включением или отключением узла Set Dynamic Resolution Enabled. Чтобы проверить состояние, используйте узел Is Dynamic Resolution Enabled.

Использование Статистики

Существует несколько экранов статистики, которые можно включить для отладки производительности с помощью динамического разрешения. Вы можете включить их, открыв консоль с помощью клавиши backtick (`) и введя одну из следующих команд:

  • Stat Unit (статический блок) используется для просмотра общего времени кадра, а также потока игры, потока рендеринга и времени графического процессора.
  • Stat UnitGraph используется для просмотра графика с данными Stat Unit.
  • Stat Raw выводит нефильтрованные данные с помощью Stat UnitGraph.

Stat Unit

Когда вызывается Stat Unit, вы можете сразу увидеть, включено ли динамическое разрешение для вашей сцены, ссылаясь на строку DynRes.DynRes OFF ue4

После включения метка DynRes будет отображать Процент Основного Экрана и Процент Вторичного Экрана:DynRes ON ue4

Здесь отображается процентное соотношение основного экрана для X и Y, чтобы вы не забыли, что он масштабируется по обеим осям. Количество пикселей, отображаемых графическим процессором, фактически пропорционально Screen Percentage x Screen Percentage (умноженный процент экрана).

Примером может быть 1920×1080 или 1280×720.

Stat UnitGraph и Stat Raw

Когда вызывается Stat UnitGraph, будет нарисован график, показывающий Процент Основного Экрана, выбранный динамическим разрешением.Stat Unit Graph ue4

  1. Сроки (отфильтрованные или необработанные)
  2. Порог времени целевого кадра
  3. Динамическое разрешение Макс. Процент экрана
  4. Динамическая процентная кривая основного экрана

UnitGraph может отображать процент основного экрана, который выбран динамическим разрешением. Однако эта кривая пропорциональна количеству пикселей, нарисованных графическим процессором, используя Screen Percentage x Screen Percentage.

Кроме того, вы можете получить нефильтрованные (необработанные) тайминги в UnitGraph, используя Stat Raw для переключения между фильтрованным и нефильтрованным. Метка тайминга графика изменится, чтобы показать, что он отображает необработанные тайминги.

Raw Timings UE4

Необработанные сроки

 

Filtered Timings UE4

Отфильтрованные сроки

 

Переключайтесь между фильтрованными и нефильтрованными таймингами с помощью окна консоли. Перед переключением Stat Raw необходимо сначала ввести Stat UnitGraph.

Дальнее Динамическое Разрешение

Реализация динамического разрешения в UE4 немного отличается от других, которые использовались ранее, потому что мы позволяем изменять разрешение по мере необходимости в пределах определенного диапазона, а не ограничиваться одним разрешением (1080p, 900p, 720p). В этом примере графика эта модель демонстрирует, что контролируют переменные консоли. Он демонстрирует, как динамическое разрешение автоматически настраивается в заданном диапазоне (3), когда все работает нормально и не превышает бюджет для данного кадра. Думайте об этом диапазоне как о крейсерской высоте для самолета, где он может свободно перемещаться по этому диапазону высоты для идеальной скорости, чтобы добраться до места назначения. Как и у самолета, разрешение делает то же самое, поднимаясь и опускаясь, так как необходимо поддерживать хороший баланс разрешения и адекватных характеристик.

Эта модель для демонстрации и не учитывает все, что происходит в данной сцене. Например, она не фиксирует, как будет выглядеть графический процессор, не синхронизированный с процессором, или даже то, что эвристика делает правильное предположение о том, насколько нужно изменить разрешение. Ее цель – четко продемонстрировать «идеальные» обстоятельства, чтобы показать, как работают переменные консоли с динамическим разрешением.

Frame GPU Graph UE4

НомерПеременная консолиОписание
1r.DynamicRes.FrameTimeBudgetВременной бюджет кадра измеряется в миллисекундах (мс).
2r.DynamicRes.TargetedGPUHeadRoomЗапас оставлен для увеличения GPU, прежде чем перейти за бюджет (в процентах от бюджета кадра). Вероятно, это будет зависеть от платформы доставки или от того, какие функции рендеринга включены. Например, для размытия в движении требуется дополнительное пространство для затрат, чтобы учесть быстрое вращение движений камеры.
3r.DynamicRes.ChangePercentageThresholdМинимальные изменения, которые требуются в процентах для фактического изменения размера выделения. Полезно не постоянно переключаться между очень близким разрешением. Если значение слишком мало, это может привести к постоянному изменению разрешения, а если оно слишком большое, это может привести к увеличению риска превышения бюджета GPU.
4r.DynamicRes.MinResolutionChangePeriodМинимальное количество кадров перед разрешением любых изменений разрешения. Эта команда имеет несколько целей. Они включают в себя повышение надежности эвристики для моделирования потребления графического процессора при заданном процентном соотношении основного экрана, несмотря на шум измерений, возможность избежать помех со смещением входной выборки временного дискретизации, которые могут возникать между дрожанием смещения по кадрам, и изменение разрешения, которое может быть ответственным за расхождение сглаживания.

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

Переменная консолиОписание
r.DynamicRes.HistorySizeКоличество кадров в истории эвристических кадров. Если оно слишком короткое, история может быть слишком шумной, чтобы эвристика была надежной, или, если она слишком длинная, корректировки могут быть очень запоздалыми.
r.DynamicRes.CPUBoundScreenPercentageПроцент основного экрана, на который следует ориентироваться, когда вы связаны процессором. Полезно установить меньший процент экрана, чтобы уменьшить разрешение на платформах, где центральный и графический процессоры используют одинаковую пропускную способность памяти.

Выход за рамки бюджета

Если вы обнаружите, что динамическое разрешение очень быстро выходит за рамки бюджета, например, во время съемки камеры или когда возникает дорогостоящий визуальный эффект, используемая эвристика не может на самом деле предсказать, когда это произойдет. В этих случаях переключатель «паники» используется для быстрого понижения разрешения, когда это случается, чтобы уменьшить количество кадров, превышающих бюджет. Если эвристика обнаружит, что N (некоторое количество) последовательных кадров с доступными временами GPU превышает бюджет, она немедленно адаптирует разрешение для борьбы с этими временами бюджета. Он также выполнит автоматический сброс истории, чтобы ранее менее дорогие временные интервалы кадров не влияли на эвристику для более дорогих кадров.

Используйте следующую консольную команду для управления максимальным количеством последовательных кадров, в которых графический процессор может превысить бюджет, прежде чем щелкнуть переключатель «паники», чтобы понизить разрешение:


r.DynamicRes.MaxConsecutiveOverbudgetGPUFrameCount

На этом графике кадр получает внезапный скачок, который ставит его выше установленного бюджета в 33,3 мс более двух кадров подряд. Переключатель «паники» активируется для быстрого понижения разрешения, чтобы кадр не превышал бюджет.График паники превышения бюджета UE4

  1. Максимальное число последовательных кадров GPU превышает бюджет.
  2. Задержка кадра между обнаружением и изменением разрешения, вызванная тем, что графический процессор не синхронизирован с потоком рендеринга.
  3. Обнаружение паники вызывает падение кадров.
  4. Изменение разрешения происходит для данных кадров.

В следующих снимках (взятых из демонстрационной версии Infiltrator, доступной на вкладке Learn в программе запуска Epic Games), команда Stat Raw используется для четкой идентификации поведения сцены при съемке с камеры или когда дорогой визуальный эффект происходит на экран:пример отображения превышения бюджета UE4

  1. После вырезания камеры кадр становится значительно дороже, по крайней мере, на несколько кадров.
  2. Динамическое разрешение вызывает паническую реакцию и быстро снижает разрешение, чтобы компенсировать его, а затем постепенно возвращается к нормальному состоянию.возвращение к нормальному состоянию бюджета UE41. Происходит визуальный эффект, который оказывается дороже, вызывая всплеск, который представляет собой выделенный бюджет кадра более чем на пару кадров. 2. Динамическое разрешение действует быстро, снижая разрешение, а затем постепенно возвращаясь к нормальному состоянию.

Тестирование контента с разными процентами основного экрана

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

Используйте ползунок, чтобы применить более высокий или более низкий процент экрана к окну просмотра и соответственно проверить уровень контента. Художники, в частности, должны использовать ползунок, чтобы проверить их содержание в верхнем и нижнем диапазонах процентного содержания экрана, который будет использоваться для проекта.

процент экрана 100 UE4

Редактор процента экрана:

100 (по умолчанию)

процент экрана 50 UE4

Редактор процента экрана:

50 (по умолчанию)

При настройке ползунка процентного соотношения экрана в окне просмотра (в нижнем правом углу) будет отображаться любое значение для процентного соотношения экрана, превышающее 100. Это означает, что напоминание о том, что процентное значение экрана видового экрана было изменено на значение, которое не является значением по умолчанию и может потенциально может вызвать проблемы с производительностью, поскольку он использует разрешение выше обычного.Индикатор редактора процента экрана UE4

Значения процента экрана, превышающие значение по умолчанию, могут вызвать медлительность или снижение производительности редактора. Когда это произойдет, попробуйте сбросить значение по умолчанию 100.

Поддерживаемые платформы

В настоящее время Xbox One, PlayStation 4 (исключая PSVR), Nintendo Switch и Oculus VR поддерживают динамическое разрешение. Дополнительная поддержка платформы планируется для будущих версий Engine.

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

Замена эвристики динамического разрешения в C++

Эвристика потока рендеринга, предоставляемая движком, полностью автономна в DynamicResolution.cpp. Архитектура настроена так, что она позволяет полностью заменить эвристику плагинами в игровом коде.

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


GEngine->ChangeDynamicResolutionStateNextFrame(new FMyGameSpecificDynamicResolutionState());
Рендерер теперь будет работать с ResolutionFraction, чтобы избежать деления на 100 в математике экрана. Он называется fraction (дробным), а не «масштабным», потому что коэффициент увеличения выполняется повышением дискретизации TAA, или пространственное повышение фактически представляется как 1, деленное на Resolution Fraction (Фракцию Разрешения), например, так:


Resolution Fraction = Screen Percentage/100 = 1/Upscaling Factor

Ограничения

Ниже приведены некоторые ограничения динамического разрешения:

  • Он не поддерживается для использования с мульти-миром Play-In-Editor.
  • Когда TAAU включен, он будет работать с VR. Поддержка Multi-Sample Anti-Aliasing (MSAA) появится в следующем выпуске.
  • API полностью совместим с мобильным визуализатором. Тем не менее, не предпринималось попыток сохранить размер представления не равным целевому размеру буфера рендеринга, который установлен верхней границей процента основного экрана.
  • У гауссового Depth of Field (DoF) и Distance Field Ambient Occlusion (DFAO) есть проблемы с изменением разрешения.

Часто задаваемые вопросы

Ниже приведены некоторые общие часто задаваемые вопросы, касающиеся динамического разрешения:

Можно ли заменить эвристику для Динамического Разрешения?

Да, это было разработано, чтобы быть модульным и подключаемым в C++. Unreal Engine 4 будет поддерживать только одну эвристику, но архитектура позволяет создавать автономную настраиваемую эвристику с настраиваемыми событиями игровых потоков, которые могут запускаться кодом геймплея или секвенсором.

Работает ли динамическое разрешение с произвольным процентом вторичного экрана?

Да. Это может быть достигнуто с помощью переменной консоли r.SecondaryScreenPercentage.GameViewport.

Для получения дополнительной информации читайте страницу «Процент экрана с временным обновлением».

Можно ли управлять динамическим разрешением процента вторичного экрана?

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

Почему функция в FPostProcessSettings для ScreenPercentage игнорируется динамическим разрешением?

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

Почему в редакторе отсутствует необязательный флажок показа для динамического разрешения?

Потому что это происходит глобально и по усмотрению игровой ветки. Флажок отображения процента экрана будет переключать только основной процент экрана.

Почему динамическое разрешение не поддерживается в окнах просмотра редактора?

В настоящее время динамическое разрешение поддерживается только для Xbox One, PlayStation 4 и Nintendo Switch, которые не используют PIE. Когда он будет доступен для платформ (Vulkan, D3D12), вы сможете использовать его в редакторе с PIE.

Можно ли получить доступ к Процентам Основного и Вторичного Экранов в Материалах?

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