Истоник фото
Постоянный рост вычислительной мощности мобильных устройств способствует развитию мобильных игр. В мобильном сегменте появился целый класс игр, который славится реалистичной графикой и правдоподобной физикой. Такие эффекты как взрыв гранаты в шутере, занос машины в гонке ложатся на плечи физического движка. В основе физического движка заложены математические модели, которые просчитываются в процессе игры. Как правило это вычислительные задачи и от того насколько быстро и качественно физический движок справляется с ними зависит привлекательность игры.
В этой статье показано, как собрать и портировать физический движок Bullet Physics на платформу Android на базе процессора Intel Atom.
Bullet Physics
Bullet Physics Library – физический движок реального времени, который активно используется в компьютерных играх, фильмах, программах трёхмерного моделирования, как компонент других игровых движков и во множестве других более специфичных случаях. В середине 2011 года появилась версия, поддерживающая ОС Android и включающая в себя оптимизированные под ARM NEON функции.
Bullet Physics собирается под архитектуру ARM из коробки. Такое приложение на телефонах с процессором Intel Atom будет работать через эмулятор.
Устройство | ARM версия | x86 версия |
---|---|---|
Samsung Galaxy tab 3 10.1 | 30 FPS | 60 FPS |
Таблица 1. Сравнение производительности (FPS – кадры в секунду) ARM и x86 версий демонстрационного приложения из Bullet Physics.
В таблице 1 приведено сравнение запусков приложения, собранного под разные архитектуры. Замеры производились с помощью инструмента профилирования графики Intel GPA. Для того, чтобы достичь максимальной эффективности работы и производительности на устройствах на базе Intel Atom – приложение должно быть портировано на архитектуру x86.
Повысив скорость обсчета физики в своей игре разработчик получает дополнительный временной бюджет кадра, который он может потратить либо на более реалистичную графику либо на более физичную модель.
Подготовка
Для сборки и портирования нам потребуется:
- Android SDK
- Android NDK
- Eclipse ADT
- Bullet Physics
- Скрипт для автоматической сборки проекта Bullet Physics
Весь процесс будет проходить на Windows, для Linux/Mac OS принципиально отличаться не будет. Производить тестовые запуски будем на Lenovo K900 и Samsung Galaxy Tab 3 10.1. Оба устройства на базе процессора Intel Atom Z2460.
К статье приложен скрипт, который производит все описанные действия в автоматическом режиме. Далее рассмотрим как собрать Bullet Physics в ручном режиме.
Сборка
Сначала соберем и запустим демонстрационное приложение PfxApp_1_Simple под ARM.
Рисунок 1. Демонстрационное приложение PfxApp_1_Simple (устройство Samsung Galaxy tab 3 10.1).
Cоберем основную компоненту физического движка — библиотеку PfxLibrary. Для этого, перейдем в проектную директорию библиотеки:
<BulletPhysics>bullet-2.80-rev2531ExtrasPhysicsEffectsprojectAndroidPfxLibraryjni
<BulletPhysics> – это путь, по которому находится проект bullet-2.80-rev2531. В этой директории откроем файл “Android.mk”, найдем и изменим переменную
LOCAL_PATH := <BulletPhysics>bullet-2.80-rev2531ExtrasPhysicsEffects
Далее, откроем консоль. В консоли перейдем по пути
<BulletPhysics>bullet-2.80-rev2531ExtrasPhysicsEffectsprojectAndroidPfxLibrary
и выполним команду:
ndk-build
Мы собрали библиотеку PfxLibrary под armeabi-v7a.
Теперь соберем само демо приложение. Для этого, передем в директорию
<BulletPhysics>bullet-2.80-rev2531ExtrasPhysicsEffectsprojectAndroidPfxApp_1_Simplejni
В этой директории откроем файл “Android.mk”, изменим переменную
LOCAL_PATH := “<BulletPhysics>bullet-2.80-rev2531ExtrasPhysicsEffects
Далее, откроем консоль. В консоли перейдем в директорию проекта приложения по пути
<BulletPhysics>bullet-2.80-rev2531ExtrasPhysicsEffectsprojectAndroidPfxApp_1_Simple
и выполним команду “ndk-build”. Для того чтобы запустить собранное приложение PfxApp_1_Simple на устройстве, будем использовать Eclipse. В Eclipse делаем импорт проекта:
File => Import => Android => Existing Android Code Into Workspace => Browse… => bullet-2.80-rev2531ExtrasPhysicsEffectsprojectAndroidPfxApp_1_Simple” => OK => Finish
и запускаем приложение на устройстве. Для этого кликаем правой кнопкой мыши на проект и нажимаем: Run As => Android Application.
Рисунок 2. Запуск приложения из Eclipse IDE.
Приложение PfxApp_1_Simple запустилось но работает в режиме эмуляции.
Портирование
Соберем и запустим PfxApp_1_Simple под x86. Сначала портируем библиотеку PfxLibrary под x86. Для этого, вернемся в директорию проекта библиотеки
<BulletPhysics>bullet-2.80-rev2531ExtrasPhysicsEffectsprojectAndroidPfxLibraryjni
Откроем файл “Application.mk”, в котором изменим переменную
APP_ABI := x86
Затем откроем файл “Android.mk”, в котором изменим переменные
LOCAL_PATH := <BulletPhysics>bullet-2.80-rev2531ExtrasPhysicsEffects
LOCAL_CFLAGS := $(LOCAL_C_INCLUDES:%=-I%) -DUSE_PTHREADS –pthread
LOCAL_ARM_NEON := false
и удалим строки из LOCAL_SRC_FILES, чтобы убрать исходные файлы, оптимизированные под ARM Neon:
src/base_level/solver/pfx_constraint_row_solver_neon.cpp
include/vecmath/neon/vectormath_neon_assembly_implementations.S
Пересоберем физический движок. В консоли перейдем по пути:
<BulletPhysics>bullet-2.80-rev2531ExtrasPhysicsEffectsprojectAndroidPfxLibrary
и выполним команду “ndk-build”. Мы собрали библиотеку PfxLibrary под x86. Теперь соберем само приложение под x86. Для этого, перейдем в директорию проекта приложения
<BulletPhysics>bullet-2.80-rev2531ExtrasPhysicsEffectsprojectAndroidPfxApp_1_Simplejni
В этой директории откроем файл “Application.mk”, изменим переменную
APP_ABI := x86
Затем откроем файл “Android.mk”, в котором изменим переменные
LOCAL_PATH := “<BulletPhysics>bullet-2.80-rev2531ExtrasPhysicsEffects
LOCAL_SRC_FILES := project/Android/PfxLibrary/obj/local/x86/libpfxlibrary.a
LOCAL_CFLAGS := $(LOCAL_C_INCLUDES:%=-I%)
LOCAL_ARM_NEON := false
и удалим строки из LOCAL_SRC_FILES, такие как
“sample/test_ARM_NEON_performance/neon_dot_product.S ”,
“sample/test_ARM_NEON_performance/neon_cross_product.S ”,
“sample/test_ARM_NEON_performance/neon_matrix4_operator_multiply.S ”,
“sample/test_ARM_NEON_performance/neon_matrix3_operator_multiply.S ”,
“sample/test_ARM_NEON_performance/neon_orthoInverse_transform3.S ”,
“sample/test_ARM_NEON_performance/neon_transform3_operator_multiply.S ”,
“sample/test_ARM_NEON_performance/neon_transpose_matrix3.S ”,
“sample/test_ARM_NEON_performance/test_neon_cross_product.cpp ”,
“sample/test_ARM_NEON_performance/test_neon_dot_product.cpp ”,
“sample/test_ARM_NEON_performance/test_neon_matrix3_operator_multiply.cpp ”,
“sample/test_ARM_NEON_performance/test_neon_matrix4_operator_multiply.cpp ”,
“sample/test_ARM_NEON_performance/test_neon_orthoInverse_transform3.cpp ”,
“sample/test_ARM_NEON_performance/test_neon_transform3_operator_multiply.cpp ”,
“sample/test_ARM_NEON_performance/test_neon_transpose_matrix3.cpp ”,
“sample/test_ARM_NEON_performance/test_neon_solve_linear_constraint_row.cpp”.
Далее, в консоли перейдем в директорию проекта по пути
<BulletPhysics>bullet-2.80-rev2531ExtrasPhysicsEffectsprojectAndroidPfxApp_1_Simple
и выполним команду “ndk-build”. Запускаем приложение на устройстве.
Для проверки результата использалось приложение APK Info.
Рисунок 3. Скриншоты APK Info (устройство Lenovo K900).
Заключение
В статье приведена пошаговая инструкция как собрать и портировать физический движок Bullet Physics. Результатом успешного портирования на архитектуру x86, для конкретного примера, можно считать двукратное ускорение вычислений физики, как следствие – повышение частоты обновления кадров (FPS).
Об авторах
Илья Крюков (ilya.krjukov@intel.com)
Денис Смирнов (denis.smirnov@intel.com)
Автор: ikryukov