В этом материале мы покажем, какой производительности можно добиться, разрабатывая 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 может дать возможность поэкспериментировать с графической составляющей приложения без внесения изменений в исходный код.
Комментарии (6)
lgorSL
26.01.2016 20:45+10Странная статья. Из описанных двух оптимизаций — отключить смешивание и поменять порядок рисования — ни одна не является чем-то экстраординарным, они никак не связаны с x86 и должны работать везде.
Возможности Graphics Frame Analyzer тоже не раскрыты. Судя по всему, с его помощью многое можно измерить — но в статье даже картинки интерфейса уменьшенные и некликабельные, об особенностях его работы остаётся только догадываться.
Alexey2005
26.01.2016 22:28-1Я как пользователь недолюбливаю Unity за то, что большинство игр на этой платформе страдает «синдромом усталости». Т.е. сразу после запуска игра работает достаточно шустро, но постепенно начинают появляться мелкие едва ощутимые подлагивания. Особенно быстро их можно дождаться, если в игре происходит постоянная загрузка-выгрузка уровней.
Затем, по мере дальнейшей игры, подлагивания становятся ощутимее, интервалы между ними тоже уменьшаются. Потом лаги переходят в фризы, когда изображение на экране приостанавливается на секунду-полторы. Наконец, начинает проседать и общая производительность — всё начинает еле ворочаться.
Обычно на данном этапе (или даже не дожидаясь полной тормознутости) пользователь закрывает игру, открывает заново — и всё опять работает шустро, без фризов и лагов.
Если же продолжить играть, хотя там всё уже еле шевелится, ещё минут через 10 игрушка самопроизвольно закрывается.
Т.е. там точно где-то есть утечка памяти или иных ресурсов, ничем иным эту самую «усталость» не объяснить.
Вот даже ради интереса скачаю Hero Sky: Epic Guild Wars и проверю, удалось ли там победить эту стандартную проблему Unity.Alexey2005
27.01.2016 12:01-1Upd: уже даже из комментариев к игре всё ясно.
Самсунг note 3 9005 периодические вылеты из игры на главный экран
в самой игре подвисает не плохо, а после вообще вылетает, ну не возможно же
Во-от, можно сколько угодно отрицать действительность (у юзеров плохие девайсы, плохие прошивки, кривые руки), но когда комменты через один про тормоза, лаги и вылеты, это о чём-то же говорит.
Игра глючит и зависает! Из-за этого уже телефон 2 раза перезапускался!
Ига очень тупит исправте пажалуйста
Ужасные тормоза на любом телефоне. после обновы вобще перестала запускатся.А разработчики на это забили большой и толстый
Лагиии Поч лагает
Ответ: патамушта юнити-шмунити. Даже если разработчик 100 раз скажет «оно не тормозит, вывсёврёте», лагов у пользователей меньше не станет. И это ещё на устройствах с приличным количеством оперативки. Про девайсы с 1Гб памяти и меньше даже говорить нечего.Charoplet
29.01.2016 17:04Играл на девайсе с 1 ГБ в несколько юнити-игр. Тормозов не замечал, кроме как в Hearthston'е, но он честно предупреждал, что девайс слабоват.
Mear
Спасибо за статью.
А вы пробовали замерять прирост производительности с теми же оптимизациями, но на исходной версии игры?