Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Mobile / Android

Porting the Android* Bullet Physics Engine to Intel® Architecture

5.00/5 (2 votes)
14 Aug 2014CPOL4 min read 10.2K  
This article shows you how to build and port the Android version of the Bullet Physics engine to the Intel® Atom™ SoC-based platform.

This article is for our sponsors at CodeProject. These articles are intended to provide you with information on products and services that we consider useful and of value to developers

Introduction

Mobile games with stunning graphics and realistic physics are now possible due to the increasing compute power now available on mobile devices. Effects such as grenade explosions in shooter games and car drifts in racing simulators are provided by the physics engine, whose heart is physics simulation. Typically, physics simulation determines the performance of the game engine. A game’s success often depends on how fast and accurately the physics engine computes the physics model.

This article shows you how to build and port the Android version of the Bullet Physics engine to the Intel® Atom™ SoC-based platform.

Bullet Physics

The Bullet Physics Library is a real-time physics engine, used in many computer games, movies, 3D modeling systems, as a component of other game engines, and other applications [http://bulletphysics.org]. In mid-2011, a version that supports the Android OS (ARM NEON*-optimized) was released.

We first ran a Bullet Physics application on a Samsung Galaxy* Tab 3 10.1 with an ARM-based processor and measured 30 frames per second (FPS). We then ported the same Bullet Physics application to the x86 architecture. We ran the Bullet Physics application on the same Samsung Galaxy* Tab 3 10.1, now with an Intel® x86 processor and measured 60 FPS. We compared the performance of each using Intel® Graphics Performance Analyzers [http://software.intel.com/en-us/vcsource/tools/intel-gpa].

By porting applications to x86-architecture, developers get an additional frame time budget, increasing the calculation speed of physics in their game, so they can spend more time on either more realistic graphics or more movement in their games.

Preparation

To build and port Bullet we need:

The whole process can be run on either Windows*, Linux* or Mac OS*; it does not differ fundamentally on Linux and Mac OS from the Windows effort. Test runs were performed on the Lenovo K900 and Samsung Galaxy* Tab 10.1 3. Both devices are based on Intel Atom processor Z2460.

A script that automatically performs all the actions described in this article is attached.

Build

Build and run the sample application PfxApp_1_Simple under ARM as the first step.

Image 1

Figure 1. Sample application PfxApp_1_Simple (device Samsung Galaxy* tab 3 10.1).

Then we’ll build the PfxLibrary library, the main component of the physics engine. To do this, go to the library project directory:

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

<BulletPhysics> is the path to the bullet-2.80-rev2531 folder. Open the Android.mk file in this directory and find and replace the declared variable, like so:

LOCAL_PATH := <BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects

Next, open the console and navigate to:

<BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects\project\Android\PfxLibrary

Run the command:

ndk-build

Success! We built PfxLibrary for armeabi-v7a.

Let’s build the sample application. Navigate to the directory:

<BulletPhysics>\bullet-2.80-ev2531\Extras\PhysicsEffects\project\Android\PfxApp_1_Simple\jni

Open the Android.mk file and replace the declaration:

LOCAL_PATH := <BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects

In the command prompt, change directories to the project folder:

<BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects\project\Android\PfxApp_1_Simple

Run the command:

ndk-build

We use Eclipse IDE to start the application. Import the project into 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 the sample application. Click the right mouse button on the project icon and select Run As => Android Application, as shown in Figure 2.

Image 2

Figure 2. Launching an application from Eclipse* IDE

The sample will run in translation mode.

Porting

Let’s port this sample PfxApp_1_Simple to x86. Begin with the core PfxLibrary library. Navigate to the project folder:

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

Open the Application.mk file and change this declaration:

APP_ABI := x86

Make these changes to the Android.mk file:

LOCAL_PATH := <BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects
LOCAL_CFLAGS := $(LOCAL_C_INCLUDES:%=-I%) -DUSE_PTHREADS –pthread
LOCAL_ARM_NEON := false

Remove the ARM NEON-optimized assembly files by deleting these lines from the LOCAL_SRC_FILES declaration list:

src/base_level/solver/pfx_constraint_row_solver_neon.cpp \
include/vecmath/neon/vectormath_neon_assembly_implementations.S

Rebuild the physics engine. In the command prompt, change the working directory:

<BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects\project\Android\PfxLibrary

Run ndk-build. We now have built the PfxLibrary for x86 architecture. Repeat these actions to port the sample application. Navigate to project directory:

<BulletPhysics>\bullet-2.80-ev2531\Extras\PhysicsEffects\project\Android\PfxApp_1_Simple\jni

Open the Application.mk file and replace the declaration:

APP_ABI := x86

Change variables in the Android.mk file:

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

Remove these lines from 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

Change the working directory for the project folder:

<BulletPhysics>\bullet-2.80-rev2531\Extras\PhysicsEffects\project\Android\PfxApp_1_Simple

Build the project using the ndk-build command, then run the sample on the device.

Use the APK Info application from Google Play to view supported architectures [https://play.google.com/store/apps/details?id=com.intelloware.apkinfo].

Image 3

Figure 3. Screenshots of APK Info (device Lenovo K900)

Conclusion

This article provided step-by-step instructions for how to build and port the physics engine, Bullet Physics. The result of successfully porting the application to x86 architecture is a 2x speedup of the physics portion of the application and improved frame rate (FPS).

About the Authors

Ilya Krjukov (ilya.krjukov@intel.com) – Sr. Software Engineer

Denis Smirnov (denis.smirnov@intel.com) – Software Intern

Related Articles and Resources

Intel, the Intel logo, and Atom are trademarks of Intel Corporation in the U.S. and/or other countries.

Copyright © 2014 Intel Corporation. All rights reserved.

*Other names and brands may be claimed as the property of others.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)