Более высокая точность и плавная частота кадров с Adaptive Performance

DAVID BERGER / UNITY TECHNOLOGIESContributor
Apr 1, 2019|9 Мин
Более высокая точность и плавная частота кадров с Adaptive Performance
Эта веб-страница была переведена с помощью машинного перевода для вашего удобства. Мы не можем гарантировать точность или надежность переведенного контента. Если у вас есть вопросы о точности переведенного контента, обращайтесь к официальной английской версии веб-страницы.

Недавно прошла выставка GDC 2019, на которой мы рассказали об Adaptive Performance во время нашего ключевого выступления. Мы рады сообщить вам, что версия Preview и мобильный образец Megacity уже доступны, и вы можете начать изучать эту функцию. В этом блоге рассказывается об Adaptive Performance и о том, как применять ее в собственных проектах.

В отличие от игр для ПК или консолей, использование всей мощности мобильного оборудования требует тонкого баланса, чтобы игры выглядели красиво и работали плавно. Максимальное использование возможностей устройства может быстро снизить производительность игры, перегрузив аппаратное обеспечение, что приведет к дросселированию, низкому времени автономной работы и нестабильной производительности. Для разработчиков этот вопрос становится еще более проблематичным, учитывая широкий спектр целевых устройств от low-end до high-end.

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

Как работает Adaptive Performance

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

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

Мы несколько раз рассказывали об этой функции во время GDC 2019. Вы можете просмотреть слайд-деку здесь, а также посмотреть стендовую презентацию Unity GDC Booth Talk - Megacity на мобильном: Как мы оптимизировали его с помощью Adaptive Performance, описано ниже.

Сотрудничество с Samsung в области Adaptive Performance

Мы сотрудничаем с Samsung, крупнейшим в мире производителем мобильных устройств на базе Android, чтобы помочь воплотить это решение в жизнь. Созданная на основе GameSDK от Samsung, Adaptive Performance сначала будет доступна для устройств Samsung Galaxy, таких как Samsung Galaxy S10 и Galaxy Fold, а затем для других устройств Samsung Galaxy в конце этого года.

Первые результаты

Эти графики (показанные во время нашего выступления Unity на GDC 2019) иллюстрируют, как Adaptive Performance помогает обеспечить стабильно высокую частоту кадров в Megacity, запущенной на новом Samsung Galaxy S10.

Изображение частоты кадров

Красным цветом показана частота кадров в Megacity до добавления Adaptive Performance, а синим - результаты после добавления Adaptive Performance. С Adaptive Performance демонстрация работает при 30 FPS гораздо дольше и гораздо стабильнее.

Почему именно мегаполис?
Изображение из книги "Мегаполис

Megacity - это футуристический интерактивный город с миллионами объектов, демонстрирующий, как Unity может запускать даже самые сложные проекты на мобильном оборудовании текущего поколения. В нем представлены последние достижения нашего стека технологий, ориентированных на работу с данными(DOTS) - так называются все проекты, реализуемые под лозунгом "Производительность по умолчанию", включая Entity Component System (ECS), Native Collections, C# Job System и Burst Compiler. Megacity была впервые представлена на выставке Unite Los Angeles 2018 и выпущена для настольных компьютеров во время GDC 2019.

Megacity - подходящий проект, чтобы продемонстрировать пример реализации Adaptive Performance, так как он обеспечивает нам гибкость, позволяя динамически адаптировать игру, чтобы наилучшим образом использовать аппаратное обеспечение. Adaptive Performance была построена с учетом масштабируемости, что отлично сочетается с принципами DOTS, использованными для создания фундамента в Megacity.

Мобильная версия проекта содержит 4,5 млн сетчатых рендеров, 200 тыс. компонентов зданий, 100 тыс. источников звука и более 6 млн сущностей - идеальный кандидат для демонстрации возможностей Adaptive Performance.

Как работает Adaptive Performance (в Мегаполисе)

После установки Adaptive Performance через менеджер пакетов Unity автоматически добавляет подсистему Samsung GameSDK в ваш проект при сборке на устройство. Во время выполнения Unity создает и запускает Adaptive Performance Manager на поддерживаемых устройствах, который предоставляет вам информацию о тепловом состоянии мобильного устройства. Вы можете подписаться на события или запросить информацию у Adaptive Performance Manager во время выполнения, чтобы реагировать в режиме реального времени; в противном случае он будет только сообщать статистику в консоли.

Например, вы можете использовать предоставленный API для создания приложений, реагирующих на тепловые тренды и события на устройстве. Это обеспечивает постоянную частоту кадров в течение длительного времени и позволяет избежать теплового дросселирования даже до его начала. В примере реализации Adaptive Performance в Megacity мы использовали три разных способа сглаживания частоты кадров:

  • Начав с умеренных уровней CPU и GPU и постепенно увеличивая их, чтобы устранить узкие места, мы смогли сохранить низкое энергопотребление.
  • Если мы видели, что устройство приближается к дросселированию, мы могли изменить настройки качества, чтобы снизить тепловую нагрузку - и мы решили снизить уровень LOD.
  • Мы также снизили целевую частоту кадров, как только приблизились к дросселированию.
  • Когда целевая частота кадров достигнута, а температура снижается, мы увеличиваем уровни LOD, повышаем целевую частоту кадров и снова снижаем уровни CPU и GPU.

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

Загрузите пример проекта Megacity mobile здесь, чтобы увидеть, как мы это сделали. Для получения отзывов или вопросов о Megacity посетите эту ветку форума.

Adaptive Performance Manager

Сердцем пакета является Adaptive Performance Manager, который Unity создает во время запуска, позволяя вам легко получить доступ и подписаться на уведомления о тепловых и производительных событиях. В примере ниже показано, как получить доступ к Adaptive Performance Manager с помощью интерфейса IAdaptivePerformance в функции Start вашего MonoBehaviour.

private IAdaptivePerformance ap = null;

void Start()
{
ap = Holder.instance;
}

Тепловые события

Unity отправляет тепловые события при каждом изменении теплового состояния устройства. Важными состояниями являются состояние, когда дросселирование неизбежно и когда дросселирование происходит. В примере ниже вы подписываетесь на ThermalEvents, чтобы уменьшить или увеличить lodBias, что помогает снизить нагрузку на GPU.

используя UnityEngine;
используя UnityEngine.Mobile.AdaptivePerformance;

public class AdaptiveLOD : MonoBehaviour
{
private IAdaptivePerformance ap = null;

void Start() {
если (Holder.instance == null)
возвращение;

ap = Holder.instance;

если (!ap.active)
возвращение;

QualitySettings.lodBias = 1;

ap.ThermalEvent += OnThermalEvent;
}

void OnThermalEvent(object obj, ThermalEventArgs ev) {
switch (ev.warningLevel) {
case PerformanceWarningLevel.NoWarning:
QualitySettings.lodBias = 1;
перерыв;
case PerformanceWarningLevel.ThrottlingImminent:
QualitySettings.lodBias = 0.75f;
перерыв;
case PerformanceWarningLevel.Throttling:
QualitySettings.lodBias = 0.5f;
перерыв;
}
}
}

Обратите внимание, что если вы уменьшите lodBias ниже значения 1, то во многих случаях это будет иметь визуальный эффект, и может произойти проскакивание объектов LOD, но это простой способ снизить нагрузку на графику, если это не требуется для игрового процесса. Если вы хотите принять еще более детальные решения по тонкой настройке графики и поведения вашей игры, события узких мест будут очень полезны.

Уровни производительности CPU и GPU

Процессор и графический процессор мобильного устройства составляют очень большую часть потребляемой мощности, особенно при запуске игр. Как правило, операционная система решает, какая тактовая частота используется для CPU и GPU.

Ядра CPU и GPU менее эффективны, если работают на максимальной тактовой частоте. При работе на высоких тактовых частотах мобильное устройство легко перегревается, и операционная система дросселирует частоту CPU и GPU, чтобы охладить устройство.

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

  • IAdaptivePerformance.cpuLevel
  • IAdaptivePerformance.gpuLevel

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

  • Достигло ли приложение целевой частоты кадров в предыдущих кадрах?
  • Приложение находится во внутриигровой сцене или в меню?
  • Дальше будет тяжелая сцена?
  • Является ли предстоящее событие тяжелым для CPU или GPU?
  • Будете ли вы показывать рекламу, которая не требует высокого уровня CPU/GPU?

public void EnterMenu(){
если (!ap.active)
возвращение;

// Установите низкий уровень CPU и GPU в меню
ap.cpuLevel = 0;
ap.gpuLevel = 0;
// Установите низкий целевой FPS
Application.targetFrameRate = 15;
}

public void ExitMenu(){
// Установите более высокий уровень CPU и GPU при возвращении в игру
ap.cpuLevel = ap.maxCpuPerformanceLevel;
ap.gpuLevel = ap.maxGpuPerformanceLevel;
}

Система раннего предупреждения об узких местах в производительности

В Adaptive Performance Manager вы можете подписаться на получение событий, связанных с узкими местами производительности, которые позволят вам узнать, что вы ограничены GPU, CPU или "частотой кадров". Ограничение частоты кадров означает, что игра ограничена Application.targetFrameRate, и в этом случае приложению следует подумать о снижении требований к производительности.

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

void OnBottleneckChange(object obj, PerformanceBottleneckChangeEventArgs ev) {
switch (ev.bottleneck) {
case PerformanceBottleneck.TargetFrameRate:
если (ap.cpuLevel > 0) {
ap.cpuLevel--;
}
если (ap.gpuLevel > 0) {
ap.gpuLevel--;
}
перерыв;
case PerformanceBottleneck.GPU:
если (ap.gpuLevel < ap.maxGpuPerformanceLevel) {
ap.gpuLevel++;
}
перерыв;
case PerformanceBottleneck.CPU:
если (ap.cpuLevel < ap.maxCpuPerformanceLevel) {
ap.cpuLevel++;
}
перерыв;
}
}

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

Что дальше для Adaptive Performance

Это только начало! Мы продолжим инвестировать в Adaptive Performance, добавляя все больше функций и поддерживая все больше устройств. Текущий пакет включает в себя низкоуровневый API, но мы уже работаем над высокоуровневым API на основе компонентов, совместимым с DOTS, который должен еще больше упростить адаптацию производительности в ваших проектах Unity. Следите за дополнительной информацией.

Начните сегодня

Предварительная версия Adaptive Performance уже доступна для Unity 2019.1 (бета-версия) через менеджер пакетов Unity. Получить доступ к нему можно здесь. Чтобы получить актуальную информацию об Adaptive Performance, посмотреть, как ее используют другие разработчики, а также задать вопросы или оставить комментарии, посетите форум.