Оптимизация Android-игр, созданных на Unity для платформы Intel: пример из жизни

в 13:38, , рубрики: android, game development, unity, unity3d, Блог компании Intel, Разработка под android

Unity – это один из самых популярных игровых движков для мобильных платформ (Android и iOS). Множество разработчиков используют его для создания и выпуска игр. До того, как Unity поддерживал Android-устройства, построенные на платформе Intel, игры приходилось исполнять в эмуляторе, который заменял низкоуровневый ARM-код на x86-код. В результате некоторые игры, которые изначально не были рассчитаны на платформу x86, в эмуляторе не запускались, либо имели проблемы с производительностью. Сегодня, с ростом присутствия процессоров от Intel в мобильной среде, многие разработчики заинтересованы в поддержке Android-устройств, основанных на архитектуре x86. Разработчики хотят знать, как оптимизировать игры для такого оборудования.

В этом материале мы покажем, какой производительности можно добиться, разрабатывая Android-приложения, рассчитанные на платформу x86, поделимся советами по оптимизации игр на примере Hero Sky: Epic Guild Wars.

Оптимизация Android-игр, созданных на Unity для платформы Intel: пример из жизни - 1


Игра Hero Sky: Epic Guild Wars

У компании Innospark, разработчика Hero Sky: Epic Guild Wars, имеется большой опыт в создании мобильных игр с использованием различных коммерческих игровых движков. Кроме того, у Innospark имеется и движок собственной разработки. Hero Sky: Epic Guild Wars – это первая игра компании, разработанная с использованием Unity и выпущенная на всемирном рынке. После публикации в Google Play, с ростом числа загрузок, компания начала сталкиваться с жалобами пользователей. На некоторых Android-устройствах, основанных на платформе Intel, игра попросту не работала, на других её производительность оставляла желать лучшего. В итоге в компании было принято решение портировать игру на платформу x86 и оптимизировать её. Здесь мы расскажем о том, как оптимизировали Hero Sky: Epic Guild Wars с использованием результатов профилирования приложения с помощью Intel Graphics Performance Analyzers (Intel GPA). В частности, поговорим о влиянии на производительность порядка вывода объектов и альфа-смешивания.

Предварительные сведения

Hero Sky: Epic Guild Wars – это онлайновая военная 3D-стратегия. Innospark разрабатывала и оптимизировала игру, пользуясь системой, основанной на Intel Atom (Bay Trail). Вот особенности эталонного устройства, применявшегося в тестах. Здесь приведены характеристики системы и результаты теста 3DMark.Устройство имеет экран размером 8 дюймов.

Показатель Характеристика
Процессор Intel Atom processor, Quad Core 1.46 Ghz
ОС Android 4.4.4
ОЗУ 2 Гб
Разрешение экрана 1920x1200
Результат теста 3DMarkICE Storm Unlimited 10386
Графика 9274
Физика 17899

Вот график, на котором сравнивается производительность нативного и эмулированного кода на устройстве.

Оптимизация Android-игр, созданных на Unity для платформы Intel: пример из жизни - 2

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

Оценивая результаты тестов, стоит помнить о том, что они могут быть оптимизированы в расчёте, например, только на микропроцессоры от Intel. Такие тесты производительности, как SYSMark и MobileMark, запускаются на конкретных системах, на которых установлены конкретные аппаратные компоненты, программное обеспечение. В их ходе выполняются определенные наборы действий. Любое изменение способно повлиять на результаты теста. Касается это программной и аппаратной составляющей устройства, а так же самого тестового приложения и набора испытаний. Поэтому, принимая на основе тестов какие-либо решения, например – о покупке устройства, постарайтесь найти как можно больше источников информации, в том числе о том, какие результаты показывает интересующее вас оборудование, работающее совместно с другим оборудованием. Подробнее о производительности вы можете узнать здесь.

После того, как игра была портирована для архитектуры x86, нагрузка на процессор снизилась примерно на 7,1%, FPS выросла на 27,8%, а время исполнения уменьшилось примерно на 32,6%. Однако, нагрузка на видеоядро выросла на 26,7% из-за роста частоты кадров.

В Innospark использовали Intel GPA для поиска узких мест в производительности центрального процессора и видеочипа в процессе разработки. Данные анализа приложения применялись для решения проблем с графикой и улучшения производительности игры.

В начале оптимизации с помощью Intel GPA System Analyzer было получено значение в 51.09 FPS, принятое за базовое. Graphics Frame Analyzer, который измеряет FPS только на стороне GPU, выдал значение в 120.9 FPS. Причина, по которой эти значения отличаются, кроется в том, что System Analyzer отслеживает поведение процесса в реальном времени, что включает в себя и работу CPU, и работу GPU. Graphics Frame Analyzer отслеживает только работу видеоядра и ту деятельность процессора, которая связана с отправкой данных драйверу и GPU.

Детальный анализ приложения с использованием Graphics Frame Analyzer

Оптимизация Android-игр, созданных на Unity для платформы Intel: пример из жизни - 3

Копия экрана первоначальной версии приложения

Сразу после переноса кода игры на платформу x86, она показала 59,01 FPS. Игру детально проанализировали с помощью Graphics Frame Analyzer для того, чтобы сократить нагрузку на видеоядро (GPU Busy) и процессор (CPU Load). В таблице показаны сведения, полученные с помощью Graphics Frame Analyzer.

Показатель Значение
Общее число примитивов 4376
Время работы GPU 8,58 мс
Время, необходимое для показа кадра 9,35 мс

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

Тип Номер эрга Длительность работы GPU Чтение из памяти, GPU Запись в память, GPU
Небо 1 1,43 мс 0,2 Мб 7,6 Мб
Земля 5 1,89 мс 9,4 Мб 8,2 Мб.

Анализ и оптимизация, направленные на снижение нагрузки на систему

Устранение ненужного альфа-смешивания

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

Graphic Frame Analyzer умеет настраивать вызовы команд рисования. Это даёт разработчику возможность протестировать программу и выяснить изменения в производительности, вызванные внесёнными изменениями, без модификации кода. Данную функцию можно найти на вкладке Blend State, которая находится в группе State.

Оптимизация Android-игр, созданных на Unity для платформы Intel: пример из жизни - 4

Вот как можно включать и выключать альфа-смешивание в Graphics Frame Analyzer без модификации исходного кода приложения

В таблице показана более подробная информация о рисовании травы после выключения альфа-смешивания. Длительность работы GPU, в результате, снизилась на 26,0%. Кроме того, обратите внимание на то, что показатель чтения из памяти снизился на 97,2%.

Показатель Базовая версия Отключение ненужного альфа-смешивания (земля)
Циклы GPU 1466843 1085794,5
Длительность работы GPU 1896,6  мкс 1398,4  мкс
Чтение из памяти, GPU 9,4 Мб 0,2 Мб
Запись в память, GPU 8,2 Мб 8,2 Мб

Эффективное применение Z-отсечения

Когда 3D-видеокарта выводит объекты, объёмные фигуры из трёхмерного пространства (x, y, z) преобразуются в двумерные (их положение определяется координатами x и y). При этом Z-буфер, или буфер глубины, используется для хранения информации о глубине (о координате z) каждого экранного пикселя. Если два объекта сцены должны быть выведены на одном и том же пикселе, GPU сравнивает информацию о глубине и перекрывает цвет текущего пикселя новым, если новый объект находится ближе к наблюдателю. Процесс Z-отсечения верно воспроизводит привычное восприятие глубины пространства, выводя более близкие объекты первыми. Они скрывают объекты, расположенные дальше. Z-отсечение позволяет улучшить производительность при выводе скрытых поверхностей.

В игре есть два вида вывода окружения: небо (эрг №1) и трава (эрг №5). Так как большая часть неба находится позади травы, значительная площадь неба никогда в процессе игры показана не будет. Однако небо выводится первым, что препятствует эффективному использованию Z-отсечения.

Оптимизация Android-игр, созданных на Unity для платформы Intel: пример из жизни - 5

Вызовы для рисования неба (эрг №1) и травы (эрг №5)

Вот как выглядит длительность работы GPU после изменения порядка вывода объектов.

Оптимизация Android-игр, созданных на Unity для платформы Intel: пример из жизни - 6

Сравнение нагрузки на систему до и после изменения порядка вывода объектов в Graphics Frame Analyzer.

В таблице показаны более подробные сведения о рисовании неба после изменения порядка вывода объектов. Время работы GPU, в частности, уменьшилось на 88%. Обратите внимание ни на то, что объём данных, записанных в память, сократился примерно на 98,9%.

Показатель Базовая версия Изменение порядка рисования (небо)
Циклы GPU 1113276 133975
Длительность работы GPU 1443  мкс 174,2  мкс
Раннее Z-отбрасывание 0 2145344
Количество записанных образцов 2165760 20416
Чтение из памяти, GPU 0,2 Мб 0,0 Мб
Запись в память, GPU 8,2 Мб 0,1 Мб

Результаты

В таблице показаны более подробные результаты оптимизации игры для платформы x86 после избавления от ненужного альфа-смешивания и изменения порядка вывода объектов. Длительность работы GPU уменьшилась примерно на 25%, чтение из памяти и запись в память сократились, соответственно, на 42,6% и 30.0%. System Analyzer показал, что FPS увеличилось всего на 1,06. Дело тут в том, что в Android используется режим вертикальной синхронизации и максимальное FPS ограничено 60 кадрами в секунду. А вот частота кадров в секунду, подсчитанная с помощь Graphics Frame Analyzer, выросла на 29,7%.

Показатель Базовая x86-версия Оптимизированная версия
Циклы GPU 6654210 4965478
Длительность работы GPU 8565,2  мкс 6386  мкс
Раннее Z-отбрасывание 16592 3348450
Количество записанных образцов 6053311 2813997
Чтение из памяти, GPU 20, 9 Мб 12.0 Мб
Запись в память, GPU 28,6 Мб 20.0 Мб
FPS, подсчитанное в System Analyzer 59,01 60,07
FPS, подсчитанное в Graphics Frame Analyzer 120,9 156,8

Вот основные показатели для базовой и оптимизированной версий приложения, приведенные в виде графика.

Оптимизация Android-игр, созданных на Unity для платформы Intel: пример из жизни - 7

Основные показатели до и после оптимизации

Выводы

Когда вы приступаете к оптимизации игры для Android x86, сначала следует портировать её на эту платформу, а затем – отыскать узкие места. Средства профилирования способны помочь в измерении производительности и в поиске проблемы с быстродействием, относящимся к GPU. Мощный аналитический инструмент Intel GPA может дать возможность поэкспериментировать с графической составляющей приложения без внесения изменений в исходный код.

Автор: Intel

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js