將AndroidBullet 物理引擎移植至英特爾 架構(gòu)
簡介
由于目前的移動設(shè)備上能夠使用更高的計算性能,移動游戲現(xiàn)在也可以提供震撼的畫面和真實物理(realistic physics)。 槍戰(zhàn)游戲中的手雷爆炸效果和賽車模擬器中的汽車漂移效果等便是由物理引擎所提供,其核心是物理模擬。 一般而言,物理模擬決定了游戲引擎的性能。 一款游戲成功與否通常取決于物理引擎計算物理模型的速度和準確度。
本文將介紹如何構(gòu)建 Android 版 Bullet 物理引擎并將其移至到基于英特爾® 凌動 SoC 的平臺。
Bullet 物理
Bullet 物理庫是一個實時物理引擎,通常作為其他游戲引擎的組件用于許多電腦游戲、電影、3D 建模系統(tǒng)以及其他應(yīng)用中 [http://bulletphysics.org/]。 2011 年年中,發(fā)布了支持 Android OS 的版本(ARM NEON* 優(yōu)化)。
首先,我們在 Samsung Galaxy* Tab 3 10.1 (采用基于 ARM 的處理器,每秒幀數(shù)為 30)上運行 Bullet 物理應(yīng)用。 然后,我們將該 Bullet 物理應(yīng)用移植到 x86 架構(gòu), 并在該 Samsung Galaxy* Tab 3 10.1 (現(xiàn)在采用英特爾® x86 處理器,每秒幀數(shù)為 60)上運行 Bullet 物理應(yīng)用。 我們使用英特爾® 圖形性能分析器對每種情況下的性能進行了比較 [http://software.intel.com/en-us/vcsource/tools/intel-gpa]。
將應(yīng)用移植到 x86 架構(gòu)后,開發(fā)人員能夠獲得額外的幀時間,從而提高其游戲中的物理計算速度,因此他們擁有更多的時間處理更多游戲中的真實物理或動作。 準備工作
構(gòu)建并移植我們需要的 Bullet:
Android SDK [https://developer.android.com/sdk/index.html]
Android NDK [https://developer.android.com/tools/sdk/ndk/index.html]
Eclipse* ADT [https://developer.android.com/sdk/installing/bundle.html]
Bullet Physics [https://bullet.googlecode.com/files/bullet-2.80-rev2531.zip]
整個流程可以在 Windows*、Linux* 或 Mac OS* 上運行;這三種系統(tǒng)在這一方面并無本質(zhì)差別。 我們在 Lenovo K900 和 Samsung Galaxy* Tab 10.1 3 上運行了測試。 兩臺設(shè)備均基于英特爾凌動處理器 Z2460。
此處隨附了本文中介紹的能夠自動執(zhí)行所有操作的腳本。
構(gòu)建
第一步是在 ARM 下構(gòu)建并運行示例應(yīng)用 PfxApp_1_Simple。
然后,我們將會構(gòu)建 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
然后,打開控制臺并導(dǎo)航至:
<BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects\project\Android\PfxLibrary
運行命令:
ndk-build
成功! 我們?yōu)?armeabi-v7a 成功構(gòu)建了 PfxLibrary。
接下來,我們來構(gòu)建示例應(yīng)用。 導(dǎo)航至以下目錄:
<BulletPhysics>\bullet-2.80-ev2531\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
我們使用 Eclipse IDE 啟動應(yīng)用。 將該項目導(dǎo)入 Eclipse:
File => Import => Android => Existing Android Code Into Workspace => Browse… =>
<BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects\project\Android\PfxApp_1_Simple\ =>
OK => Finish
運行相同的應(yīng)用。 在項目圖標上點擊鼠標右鍵,并選擇 "Run As => Android Application",如圖 2 所
示例將會在轉(zhuǎn)換模式下運行。
移植
接下來,我們將把該示例 PfxApp_1_Simple 移植到 x86。 從核心 PfxLibrary 庫開始。 導(dǎo)航至項目文件夾:
<BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects\project\Android\PfxLibrary\jni
打開 Android.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
通過將以下內(nèi)容從 LOCAL_SRC_FILES 聲明列表中刪除來移除 ARM NEON* 優(yōu)化的匯編文件:
src/base_level/solver/pfx_constraint_row_solver_neon.cpp \
include/vecmath/neon/vectormath_neon_assembly_implementations.S
重新構(gòu)建物理引擎。 在命令提示符下,更改工作目錄:
<BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects\project\Android\PfxLibrary
運行 ndk-build。 我們現(xiàn)在為 x86 架構(gòu)創(chuàng)建了 PfxLibrary。 重復(fù)上述操作,移植示例應(yīng)用。 導(dǎo)航至以下項目目錄:
<BulletPhysics>\bullet-2.80-ev2531\Extras\PhysicsEffects\project\Android\PfxApp_1_Simple\jni
打開 Application.mk 文件并更換聲明:
APP_ABI := x86
更換 Android.mk 文件中的變量:
LOCAL_PATH := \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 中刪除以下內(nèi)容:
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 命令構(gòu)建項目,然后在設(shè)備上運行示例。
使用 Google Play 提供的 APK Info 應(yīng)用查看支持的架構(gòu) [https://play.google.com/store/apps/details?id=com.intelloware.apkinfo]。
結(jié)論
本文分步介紹了如何構(gòu)建和移植物理引擎 — Bullet Physics。 將該應(yīng)用成功移植至 x86 架構(gòu)后,應(yīng)用的物理移植速度提高 2 倍,幀速率(FPS)得到提高。
本文鏈接:https://software.intel.com/zh-cn/android/articles/porting-the-android-bullet-physics-engine-to-intel-architecture?utm_campaign=eoe&utm_source=eoe.cn&utm_medium=Link&utm_content=intel-optimization