在移动设备上构建和移植物理引擎

随着移动设备计算能力的不断提升,游戏和模拟应用中对物理效果的需求也日益增长。例如,在射击游戏中的手榴弹爆炸效果,或是赛车模拟器中的汽车漂移效果,这些都依赖于物理引擎来实现。物理引擎的核心是物理模拟,它通常决定了游戏引擎的性能。游戏的成功往往取决于物理引擎计算物理模型的速度和准确性。

本文将向展示如何在基于Intel® Atom™ SoC的平台上构建和移植Android版本的Bullet物理引擎。

Bullet物理引擎简介

Bullet物理库是一个实时物理引擎,广泛应用于许多电脑游戏、电影、3D建模系统,作为其他游戏引擎的组件,以及其他应用。2011年中期,发布了支持Android操作系统(ARM NEON*优化)的版本。

首先,在搭载ARM处理器的三星Galaxy* Tab 3 10.1上运行了一个Bullet物理应用,并测量了30帧每秒(FPS)。然后,将同一个Bullet物理应用移植到x86架构上。在搭载Intel® x86处理器的三星Galaxy* Tab 3 10.1上运行了Bullet物理应用,并测量了60 FPS。使用Intel®图形性能分析器比较了各自的性能。

通过将应用移植到x86架构,开发者可以获得额外的帧时间预算,提高游戏中物理计算的速度,从而可以花费更多时间在更逼真的图形或更多的游戏动作上。

准备工作

为了构建和移植Bullet,需要:

  • AndroidSDK
  • Android NDK
  • Eclipse* ADT
  • Bullet物理引擎

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

本文附带了一个脚本,可以自动执行本文描述的所有操作。

构建过程

首先在ARM架构下构建并运行示例应用PfxApp_1_Simple。然后,将构建PfxLibrary库,这是物理引擎的主要组件。为此,请转到库项目目录:

BulletPhysics\bullet-2.80-rev2531\Extras\PhysicsEffects\project\Android\PfxLibrary\jni

在该目录中打开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 := 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命令构建项目,然后在设备上运行示例。

使用Google Play上的APK Info应用程序查看支持的架构。

本文提供了构建和移植物理引擎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*应用
  • 在Intel® Atom™处理器上将OpenGL*游戏移植到Android*(第1部分)
  • 在Intel® Atom™处理器上将OpenGL*游戏移植到Android*(第2部分)

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

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485