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

в 9:44, , рубрики: android, android development, Android NDK, game development, mobile, physics engine, x86, Блог компании Intel, метки: , , , , ,

Запуск физического движка Bullet Physics на Android х86
Истоник фото
Постоянный рост вычислительной мощности мобильных устройств способствует развитию мобильных игр. В мобильном сегменте появился целый класс игр, который славится реалистичной графикой и правдоподобной физикой. Такие эффекты как взрыв гранаты в шутере, занос машины в гонке ложатся на плечи физического движка. В основе физического движка заложены математические модели, которые просчитываются в процессе игры. Как правило это вычислительные задачи и от того насколько быстро и качественно физический движок справляется с ними зависит привлекательность игры.
В этой статье показано, как собрать и портировать физический движок 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-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.
image
Рисунок 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.
image
Рисунок 3. Скриншоты APK Info (устройство Lenovo K900).

Заключение

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

Об авторах

Илья Крюков (ilya.krjukov@intel.com)
Денис Смирнов (denis.smirnov@intel.com)

Автор: ikryukov

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js