Оптимизация Android-игр, созданных на Unity для платформы Intel: пример из жизни. Unity оптимизация android
пример из жизни / Блог компании Intel / Хабр
В этом материале мы покажем, какой производительности можно добиться, разрабатывая 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 |
Оценивая результаты тестов, стоит помнить о том, что они могут быть оптимизированы в расчёте, например, только на микропроцессоры от 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 Мб. |
Анализ и оптимизация, направленные на снижение нагрузки на систему
Устранение ненужного альфа-смешивания
Когда при отображении объектов используется альфа-смешивание, программа должна скомбинировать, в реальном времени, цветовые значения всех перекрывающихся объектов и фона для того, чтобы выяснить, каким будет итоговый цвет. Таким образом, вывод цветов, получаемых в результате альфа-смешивания, может оказать большую нагрузку на процессор, нежели отображение непрозрачных цветов. Эти дополнительные вычисления способны повредить производительности на медленных устройствах. Поэтому было решено избавиться от ненужного альфа-смешивания.В таблице показана более подробная информация о рисовании травы после выключения альфа-смешивания. Длительность работы 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-отсечения.
Вот как выглядит длительность работы 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 дюймов.
ОС | 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.
Время работы GPU | 8.56 мс |
Время, необходимое для показа кадра | 9.35 мс |
Вот, какую нагрузку на систему создавала исходная, неоптимизированная версия игры. Здесь приведены сведения о вызовах рисования, которые требуют больше всего системных ресурсов.
Небо | 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%.
Показатель | Базовая версия | Изменение порядка рисования (небо) |
Циклы 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 может дать возможность поэкспериментировать с графической составляющей приложения без внесения изменений в исходный код.
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 |
Оценивая результаты тестов, стоит помнить о том, что они могут быть оптимизированы в расчёте, например, только на микропроцессоры от 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 максимальное значение,
Настройте отображение растительности, деревьев и объектов следующими параметрами:
- Detail Density — Количество объектов деталей/травы в данной условной единице площади. Можно снизить значение для снижения потребления ресурсов на рендеринг,
- Detail Distance — Расстояние (от камеры), после которого детали будут отсекаться,
- Tree Distance — Расстояние (от камеры), за которым деревья будут отсекаться,
- Fade length — Расстояние перехода деревьев из 3D объектов в плоские спрайты,
- Max Mesh Trees — Максимальное количество видимых деревьев, которые будут представлены в качестве полноценных 3D мешей. После этого предела, деревья будут заменяться плоскими спрайтами.
Скрипты.
Метод FixedUpdate больше подойдет для небольших проверок относящиеся к физике,
CompareTag быстрее делает проверку тэга по имени,
Делайте как можно меньше вызовов thisTransform.forward или position, лучше эти значения один раз получить в Update,
(thisTransform.position — target.position).sqrMagnitude быстрее Vector3.Distance,
Старайтесь для включение скрипта на объекте при возможности использовать не GetComponent(…).enabled с заранее отключенным скриптом, а AddComponent(…) при заранее не повешенном скрипте на объекте,
Используйте статические переменные.
Заключение.
Если стараться придерживаться этих правил, можно достаточно существенно оптимизировать вашу игру.
Возможно, здесь указаны не все методы, если вам есть что добавить или вы считаете что какой то способ не подходит для оптимизации, пишите нам в комментариях. Удачных проектов!
На главную
3dgame-creator.ru