19 December 2013

Запуск физического движка Bullet Physics на Android х86

Intel corporate blogGame development

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

Подготовка


Для сборки и портирования нам потребуется:

Весь процесс будет проходить на Windows, для Linux/Mac OS принципиально отличаться не будет. Производить тестовые запуски будем на Lenovo K900 и Samsung Galaxy Tab 3 10.1. Оба устройства на базе процессора Intel Atom Z2460.
К статье приложен скрипт, который производит все описанные действия в автоматическом режиме. Далее рассмотрим как собрать Bullet Physics в ручном режиме.

Сборка


Сначала соберем и запустим демонстрационное приложение PfxApp_1_Simple под ARM.
image
Рисунок 1. Демонстрационное приложение PfxApp_1_Simple (устройство Samsung Galaxy tab 3 10.1).
Cоберем основную компоненту физического движка — библиотеку PfxLibrary. Для этого, перейдем в проектную директорию библиотеки:
<BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects\project\Android\PfxLibrary\jni

<BulletPhysics> – это путь, по которому находится проект bullet-2.80-rev2531. В этой директории откроем файл “Android.mk”, найдем и изменим переменную
LOCAL_PATH := <BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects

Далее, откроем консоль. В консоли перейдем по пути
<BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects\project\Android\PfxLibrary

и выполним команду:
ndk-build

Мы собрали библиотеку PfxLibrary под armeabi-v7a.
Теперь соберем само демо приложение. Для этого, передем в директорию
<BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects\project\Android\PfxApp_1_Simple\jni

В этой директории откроем файл “Android.mk”, изменим переменную
LOCAL_PATH := “<BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects

Далее, откроем консоль. В консоли перейдем в директорию проекта приложения по пути
<BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects\project\Android\PfxApp_1_Simple

и выполним команду “ndk-build”. Для того чтобы запустить собранное приложение PfxApp_1_Simple на устройстве, будем использовать Eclipse. В Eclipse делаем импорт проекта:
File => Import => Android => Existing Android Code Into Workspace => Browse… => \bullet-2.80-rev2531\Extras\PhysicsEffects\project\Android\PfxApp_1_Simple\” => OK => Finish
и запускаем приложение на устройстве. Для этого кликаем правой кнопкой мыши на проект и нажимаем: Run As => Android Application.
image
Рисунок 2. Запуск приложения из Eclipse IDE.
Приложение PfxApp_1_Simple запустилось но работает в режиме эмуляции.

Портирование


Соберем и запустим PfxApp_1_Simple под x86. Сначала портируем библиотеку PfxLibrary под x86. Для этого, вернемся в директорию проекта библиотеки
<BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects\project\Android\PfxLibrary\jni

Откроем файл “Application.mk”, в котором изменим переменную
APP_ABI := x86

Затем откроем файл “Android.mk”, в котором изменим переменные
LOCAL_PATH := <BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects
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-rev2531\Extras\PhysicsEffects\project\Android\PfxLibrary

и выполним команду “ndk-build”. Мы собрали библиотеку PfxLibrary под x86. Теперь соберем само приложение под x86. Для этого, перейдем в директорию проекта приложения
<BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects\project\Android\PfxApp_1_Simple\jni

В этой директории откроем файл “Application.mk”, изменим переменную
APP_ABI := x86

Затем откроем файл “Android.mk”, в котором изменим переменные
LOCAL_PATH := “<BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects
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-rev2531\Extras\PhysicsEffects\project\Android\PfxApp_1_Simple

и выполним команду “ndk-build”. Запускаем приложение на устройстве.
Для проверки результата использалось приложение APK Info.
image
Рисунок 3. Скриншоты APK Info (устройство Lenovo K900).

Заключение


В статье приведена пошаговая инструкция как собрать и портировать физический движок Bullet Physics. Результатом успешного портирования на архитектуру x86, для конкретного примера, можно считать двукратное ускорение вычислений физики, как следствие – повышение частоты обновления кадров (FPS).

Об авторах


Илья Крюков (ilya.krjukov@intel.com)
Денис Смирнов (denis.smirnov@intel.com)
Tags:android developmentandroid ndkgame developmentx86physics enginemobile
Hubs: Intel corporate blog Game development
+20
14.8k 59
Comments 20