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


пример из жизни / Блог компании Intel / Хабр

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 может дать возможность поэкспериментировать с графической составляющей приложения без внесения изменений в исходный код.

habr.com

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

Загрузить документ

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

Intel Atom processor, Quad Core 1.46 Ghz

ОС

Android* 4.4.4

ОЗУ

2Гб

Разрешение экрана

1920x1200

Результат теста 3DMarkICE Storm Unlimited

10,386

Графика

9,274

Физика

17,899

 

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

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

 

Общее число примитивов

4,376

Время работы GPU

8.56 мс

Время, необходимое для показа кадра

9.35 мс

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

Type

Номер эрга

Длительность работы 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

1,466,843

1,085,794.5

Длительность работы GPU

1,896.6 мкс

1,398.4 мкс

Чтение из памяти, GPU

7.6 Мб

0.2 Mб

Запись в память, GPU

8.2 Mб

8.2 Mб

 

 

Эффективное применение 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%.

ПоказательБазовая версияИзменение порядка рисования (небо)
Циклы GPU1113276133975
Длительность работы GPU1443  мкс174,2  мкс
Раннее Z-отбрасывание02145344
Количество записанных образцов216576020416
Чтение из памяти, GPU0,2 Мб0,0 Мб
Запись в память, GPU8,2 Мб0,1 Мб

 

Результаты

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

ПоказательБазовая x86-версияОптимизированная версия
Циклы GPU66542104965478
Длительность работы GPU8565,2  мкс6386  мкс
Раннее Z-отбрасывание165923348450
Количество записанных образцов60533112813997
Чтение из памяти, GPU20, 9 Мб12.0 Мб
Запись в память, GPU28,6 Мб20.0 Мб
FPS, подсчитанное в System Analyzer59,0160,07
FPS, подсчитанное в Graphics Frame Analyzer120,9156,8

 

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

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

Выводы

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

software.intel.com

пример из жизни / СоХабр

26 января 2016 в 16:38 (МСК) | сохранено 26 января 2016 в 17:39 (МСК)

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 может дать возможность поэкспериментировать с графической составляющей приложения без внесения изменений в исходный код.

sohabr.net

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

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 может дать возможность поэкспериментировать с графической составляющей приложения без внесения изменений в исходный код.

Автор: Intel

Источник

www.pvsm.ru

Unity5. Оптимизация. - Create Games

Unity5. Оптимизация.

Как оптимизировать игру в Unity.

При разработке собственных игр  есть вероятность, столкнутся с проблемами оптимизации, т.е. будут ли у вас все модели низкополигонными(Low Polly) или даже отсутствие объемных эффектов и частиц, игра все равно не работает должным образом на любых устройствах. Что бы избежать таких проблем, существуют основные правила или приемы оптимизации игр в Unity.

Первым делом, проверьте показатель “draw calls” в окне Profiler; если он составляет больше нескольких тысяч (для PC) или нескольких сотен (для мобильных устройств), то вам требуется оптимизация игровых объектов.

Вот несколько основных приемов и советов по оптимизации игр.

Текстуры и материалами.

Уменьшите количество различных материалов в сцене — используйте один материал для нескольких объектов,

Шейдеры для материалов используйте из категории Mobile/ — т.к. Они прекрасно работают и на не мобильных платформ, но являются упрощёнными версиями более сложных шейдеров.

Используйте сжатие текстур, когда это возможно, а также отдавайте предпочтение 16-битным текстурами перед 32-битными.

Используйте меньше текстур.

Настройка игрового мира.

Туман (Fog) – очень сильно нагрузит вашу игру,

Для не статических объектов с коллайдерами старайтесь использовать Rigibody в режиме isKinematic.

Используйте один источник света, а для отдельных затемнений карты используйте Lightmap`ы.

GPU обрабатывает слишком много вершин. Какое количество вершин является нормальным, определяется GPU и набором вертексных шейдеров. Можно посоветовать использовать не более 100 тысяч для мобильных устройств и не более нескольких миллионов полигонов для PC.

Сохраняйте количество вершин между 200 000 и 3 000 000 в каждом кадре, если целевая платформа — PC.

Установите свойство Static для неподвижных объектов, чтобы использовать внутреннею оптимизацию static batching.

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

Тени в реальном времени хорошо выглядят, но они могут сильно снижать производительность, одновременно добавляя дополнительные draw calls для CPU и дополнительную обработку для GPU.

Настройка terrain.

Старайтесь не использовать большие размеры карт,

Установите значение pixel error максимальное значение,

Настройте отображение растительности, деревьев и объектов следующими параметрами:

Скрипты.

Метод FixedUpdate больше подойдет для небольших проверок относящиеся к физике,

CompareTag быстрее делает проверку тэга по имени,

Делайте как можно меньше вызовов thisTransform.forward или position, лучше эти значения один раз получить в Update,

(thisTransform.position — target.position).sqrMagnitude быстрее Vector3.Distance,

Старайтесь для включение скрипта на объекте при возможности использовать не GetComponent(…).enabled с заранее отключенным скриптом, а AddComponent(…) при заранее не повешенном скрипте на объекте,

Используйте статические переменные.

Заключение.

Если стараться придерживаться этих правил, можно достаточно существенно оптимизировать вашу игру.

Возможно, здесь указаны не все методы, если вам есть что добавить или вы считаете что какой то способ не подходит для оптимизации, пишите нам в комментариях. Удачных проектов!

На главную

3dgame-creator.ru


Prostoy-Site | Все права защищены © 2018 | Карта сайта