company_banner

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

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

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


Игра 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
Вот график, на котором сравнивается производительность нативного и эмулированного кода на устройстве.


Выигрыш в производительности, которого можно достичь благодаря поддержке 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



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

Сразу после переноса кода игры на платформу 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.


Вот как можно включать и выключать альфа-смешивание в 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-отсечения.


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

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


Сравнение нагрузки на систему до и после изменения порядка вывода объектов в 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 x86, сначала следует портировать её на эту платформу, а затем – отыскать узкие места. Средства профилирования способны помочь в измерении производительности и в поиске проблемы с быстродействием, относящимся к GPU. Мощный аналитический инструмент Intel GPA может дать возможность поэкспериментировать с графической составляющей приложения без внесения изменений в исходный код.
  • +12
  • 18.3k
  • 6
Intel
180.38
Company
Share post

Comments 6

    +1
    Спасибо за статью.

    А вы пробовали замерять прирост производительности с теми же оптимизациями, но на исходной версии игры?
      +1
      Очередной Clash of Clans?
        +10
        Странная статья. Из описанных двух оптимизаций — отключить смешивание и поменять порядок рисования — ни одна не является чем-то экстраординарным, они никак не связаны с x86 и должны работать везде.
        Возможности Graphics Frame Analyzer тоже не раскрыты. Судя по всему, с его помощью многое можно измерить — но в статье даже картинки интерфейса уменьшенные и некликабельные, об особенностях его работы остаётся только догадываться.
          –1
          Я как пользователь недолюбливаю Unity за то, что большинство игр на этой платформе страдает «синдромом усталости». Т.е. сразу после запуска игра работает достаточно шустро, но постепенно начинают появляться мелкие едва ощутимые подлагивания. Особенно быстро их можно дождаться, если в игре происходит постоянная загрузка-выгрузка уровней.
          Затем, по мере дальнейшей игры, подлагивания становятся ощутимее, интервалы между ними тоже уменьшаются. Потом лаги переходят в фризы, когда изображение на экране приостанавливается на секунду-полторы. Наконец, начинает проседать и общая производительность — всё начинает еле ворочаться.
          Обычно на данном этапе (или даже не дожидаясь полной тормознутости) пользователь закрывает игру, открывает заново — и всё опять работает шустро, без фризов и лагов.
          Если же продолжить играть, хотя там всё уже еле шевелится, ещё минут через 10 игрушка самопроизвольно закрывается.
          Т.е. там точно где-то есть утечка памяти или иных ресурсов, ничем иным эту самую «усталость» не объяснить.
          Вот даже ради интереса скачаю Hero Sky: Epic Guild Wars и проверю, удалось ли там победить эту стандартную проблему Unity.
            –1
            Upd: уже даже из комментариев к игре всё ясно.
            Самсунг note 3 9005 периодические вылеты из игры на главный экран
            в самой игре подвисает не плохо, а после вообще вылетает, ну не возможно же
            Во-от, можно сколько угодно отрицать действительность (у юзеров плохие девайсы, плохие прошивки, кривые руки), но когда комменты через один про тормоза, лаги и вылеты, это о чём-то же говорит.
            Игра глючит и зависает! Из-за этого уже телефон 2 раза перезапускался!
            Ига очень тупит исправте пажалуйста
            Ужасные тормоза на любом телефоне. после обновы вобще перестала запускатся.А разработчики на это забили большой и толстый
            Лагиии Поч лагает
            Ответ: патамушта юнити-шмунити. Даже если разработчик 100 раз скажет «оно не тормозит, вывсёврёте», лагов у пользователей меньше не станет. И это ещё на устройствах с приличным количеством оперативки. Про девайсы с 1Гб памяти и меньше даже говорить нечего.
              0
              Играл на девайсе с 1 ГБ в несколько юнити-игр. Тормозов не замечал, кроме как в Hearthston'е, но он честно предупреждал, что девайс слабоват.

          Only users with full accounts can post comments. Log in, please.