65.9K
CodeProject 正在变化。 阅读更多。
Home

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

2014 年 8 月 14 日

CPOL

4分钟阅读

viewsIcon

10682

本文将向您展示如何构建 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,我们需要

整个过程可以在 Windows*、Linux* 或 Mac OS* 上运行;在 Linux 和 Mac OS 上的操作与 Windows 上的操作在根本上没有区别。测试是在联想 K900 和三星 Galaxy* Tab 10.1 3 上进行的。这两个设备都基于 Intel Atom 处理器 Z2460。

一篇自动执行本文档中所述所有操作的脚本 已附上

构建

第一步,构建并运行 ARM 上的示例应用程序 PfxApp_1_Simple。

图 1. 示例应用程序 PfxApp_1_Simple(设备 三星 Galaxy* Tab 3 10.1)。

然后,我们将构建 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 所示。

图 2. 从 Eclipse* IDE 启动应用程序

示例将在翻译模式下运行。

移植

让我们将此示例 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]。

图 3. APK Info 的屏幕截图(设备 联想 K900)

结论

本文提供了构建和移植 Bullet Physics 物理引擎的详细分步说明。成功将应用程序移植到 x86 架构的结果是应用程序的物理部分速度提升了 2 倍,并且帧率 (FPS) 得到了提高。

关于作者

Ilya Krjukov (ilya.krjukov@intel.com) – 高级软件工程师

Denis Smirnov (denis.smirnov@intel.com) – 软件实习生

相关文章与资源

Intel、Intel 徽标和 Atom 是 Intel Corporation 在美国和/或其他国家的商标。

版权所有 © 2014 英特尔公司。保留所有权利。

*其他名称和品牌可能被声明为他人的财产。

© . All rights reserved.