随着移动设备计算能力的不断提升,游戏和模拟应用中对物理效果的需求也日益增长。例如,在射击游戏中的手榴弹爆炸效果,或是赛车模拟器中的汽车漂移效果,这些都依赖于物理引擎来实现。物理引擎的核心是物理模拟,它通常决定了游戏引擎的性能。游戏的成功往往取决于物理引擎计算物理模型的速度和准确性。
本文将向展示如何在基于Intel® Atom™ SoC的平台上构建和移植Android版本的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,需要:
整个过程可以在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) – 软件实习生
Intel、Intel徽标和Atom是Intel Corporation在美国和/或其他国家的商标。