将 Android* Bullet Physics 引擎移植到 Intel® 架构





5.00/5 (2投票s)
本文将向您展示如何构建 Android 版 Bullet 物理引擎并将其移植到基于 Intel® Atom™ SoC 的平台。
引言
随着移动设备计算能力的不断增强,如今已可以实现拥有震撼图形和逼真物理效果的移动游戏。手榴弹爆炸效果(射击游戏)和汽车漂移效果(赛车模拟器)等特效由物理引擎提供,而物理模拟是物理引擎的核心。通常,物理模拟决定了游戏引擎的性能。游戏的成功往往取决于物理引擎计算物理模型的速度和准确性。
本文将向您展示如何构建 Android 版 Bullet 物理引擎并将其移植到基于 Intel® Atom™ SoC 的平台。
Bullet Physics
Bullet Physics 库是一款实时物理引擎,广泛应用于许多电脑游戏、电影、3D 建模系统、其他游戏引擎的组件以及其他应用中 [http://bulletphysics.org]。2011 年年中,发布了一个支持 Android OS(ARM NEON* 优化)的版本。
我们首先在一台搭载 ARM 处理器、运行 Android 系统的三星 Galaxy* Tab 3 10.1 上运行了一个 Bullet Physics 应用程序,测量结果为每秒 30 帧 (FPS)。然后,我们将相同的 Bullet Physics 应用程序移植到了 x86 架构。我们在同一台三星 Galaxy* Tab 3 10.1 上运行了这个 Bullet Physics 应用程序,但这次它搭载的是 Intel® x86 处理器,测量结果为每秒 60 帧 (FPS)。我们使用 Intel® Graphics Performance Analyzers [http://software.intel.com/en-us/vcsource/tools/intel-gpa] 对两者的性能进行了比较。
通过将应用程序移植到 x86 架构,开发者可以获得额外的帧时间预算,从而提高游戏中物理计算的速度,这样他们就可以将更多时间用于更逼真的图形或游戏中更多的动画。
准备工作
为了构建和移植 Bullet,我们需要
- Android SDK [https://developer.android.com.cn/sdk/index.html]
- Android NDK [https://developer.android.com.cn/tools/sdk/ndk/index.html]
- Eclipse* ADT [https://developer.android.com.cn/sdk/installing/bundle.html]
- Bullet Physics [https://bullet.googlecode.com/files/bullet-2.80-rev2531.zip]
整个过程可以在 Windows*、Linux* 或 Mac OS* 上运行;在 Linux 和 Mac OS 上的操作与 Windows 上的操作在根本上没有区别。测试是在联想 K900 和三星 Galaxy* Tab 10.1 3 上进行的。这两个设备都基于 Intel Atom 处理器 Z2460。
一篇自动执行本文档中所述所有操作的脚本 已附上。
构建
第一步,构建并运行 ARM 上的示例应用程序 PfxApp_1_Simple。
然后,我们将构建 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
成功!我们已为 armeabi-v7a 构建了 PfxLibrary。
让我们构建示例应用程序。导航至目录
<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 来启动应用程序。将项目导入 Eclipse
File => Import => Android => Existing Android Code Into Workspace => Browse… => <BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects\project\Android\PfxApp_1_Simple\ => OK => Finish
运行示例应用程序。右键单击项目图标,然后选择 Run As => Android Application,如图 2 所示。
示例将在翻译模式下运行。
移植
让我们将此示例 PfxApp_1_Simple 移植到 x86。首先从核心 PfxLibrary 库开始。导航至项目文件夹
<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。现在我们已为 x86 架构构建了 PfxLibrary。重复这些操作以移植示例应用程序。导航至项目目录
<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 中删除这些行
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 命令构建项目,然后在设备上运行示例。
使用 Google Play 中的 APK Info 应用程序查看支持的架构 [https://play.google.com/store/apps/details?id=com.intelloware.apkinfo]。
结论
本文提供了构建和移植 Bullet Physics 物理引擎的详细分步说明。成功将应用程序移植到 x86 架构的结果是应用程序的物理部分速度提升了 2 倍,并且帧率 (FPS) 得到了提高。
关于作者
Ilya Krjukov (ilya.krjukov@intel.com) – 高级软件工程师
Denis Smirnov (denis.smirnov@intel.com) – 软件实习生
相关文章与资源
- 将 Android* 原生应用程序的低级部分移植到基于 Intel® 架构的平台
- Intel for Android* 开发者学习系列 #7:为 Intel® 架构创建和移植基于 NDK 的 Android* 应用程序
- 为IA上的NDK驱动的Android*应用程序创建和移植
- 将 OpenGL* 游戏移植到 Intel® Atom™ 处理器上的 Android*(第一部分)
- 将 OpenGL* 游戏移植到 Intel® Atom™ 处理器上的 Android*(第二部分)
Intel、Intel 徽标和 Atom 是 Intel Corporation 在美国和/或其他国家的商标。
版权所有 © 2014 英特尔公司。保留所有权利。
*其他名称和品牌可能被声明为他人的财产。