快捷搜索:

将 Android* Bullet 物理引擎移植至英特尔® 架构,androidbullet

将 Android* Bullet 物理引擎移植至英特尔® 架构,androidbullet
简介

由于目前的移动设备上能够使用更高的计算性能,移动游戏现在也可以提供震撼的画面和真实物理(realistic physics)。 枪战游戏中的手雷爆炸效果和赛车模拟器中的汽车漂移效果等便是由物理引擎所提供,其核心是物理模拟。 一般而言,物理模拟决定了游戏引擎的性能。 一款游戏成功与否通常取决于物理引擎计算物理模型的速度和准确度。

本文将介绍如何构建 Android 版 Bullet 物理引擎并将其移至到基于英特尔® 凌动 SoC 的平台。

Bullet 物理

Bullet 物理库是一个实时物理引擎,通常作为其他游戏引擎的组件用于许多电脑游戏、电影、3D 建模系统以及其他应用中 [http://bulletphysics.org/]。 2011 年年中,发布了支持 Android OS 的版本(ARM NEON* 优化)。

首先,我们在 Samsung Galaxy* Tab 3 10.1 (采用基于 ARM 的处理器,每秒帧数为 30)上运行 Bullet 物理应用。 然后,我们将该 Bullet 物理应用移植到 x86 架构, 并在该 Samsung Galaxy* Tab 3 10.1 (现在采用英特尔® x86 处理器,每秒帧数为 60)上运行 Bullet 物理应用。 我们使用英特尔® 图形性能分析器对每种情况下的性能进行了比较 [http://software.intel.com/en-us/vcsource/tools/intel-gpa]。

将应用移植到 x86 架构后,开发人员能够获得额外的帧时间,从而提高其游戏中的物理计算速度,因此他们拥有更多的时间处理更多游戏中的真实物理或动作。

准备工作

构建并移植我们需要的 Bullet:

  • Android SDK [https://developer.android.com/sdk/index.html]
  • Android NDK [https://developer.android.com/tools/sdk/ndk/index.html]
  • Eclipse* ADT [https://developer.android.com/sdk/installing/bundle.html]
  • Bullet Physics [https://bullet.googlecode.com/files/bullet-2.80-rev2531.zip]

整个流程可以在 Windows*、Linux* 或 Mac OS* 上运行;这三种系统在这一方面并无本质差别。 我们在 Lenovo K900 和 Samsung Galaxy* Tab 10.1 3 上运行了测试。 两台设备均基于英特尔凌动处理器 Z2460。

此处随附了本文中介绍的能够自动执行所有操作的脚本。

构建

第一步是在 ARM 下构建并运行示例应用 PfxApp_1_Simple。



图 1. 示例应用 PfxApp_1_Simple (设备Samsung 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

打开 Android.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(设备 Lenovo K900)

结论

本文分步介绍了如何构建和移植物理引擎 — Bullet Physics。 将该应用成功移植至 x86 架构后,应用的物理移植速度提高 2 倍,帧速率(FPS)得到提高。

作者介绍

Ilya Krjukov ([email protected]) — 高级软件工程师

Denis Smirnov ([email protected]) — 软件实习生

相关文章与资源

  • 将 Android* 原生应用的低级别组件移植至基于英特尔® 架构的平台
  • 面向 Android* 开发人员的英特尔学习系列计划 #7: 为英特尔® 架构创建和移植基于 NDK 的 Android* 应用
  • 面向英特尔® 架构(IA)创建和移植基于 NDK 的 Android* 应用
  • 在英特尔® 凌动™ 处理器上将 OpenGL* 游戏移植到 Android* (第一部分)
  • 在英特尔® 凌动™ 处理器上将 OpenGL* 游戏移植到 Android* (第二部分)

英特尔、Intel 标识、凌动是英特尔公司在美国和/或其他国家(地区)的商标。

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

* 其他的名称和品牌可能是其他所有者的资产。


Bullet 物理引擎是什?

Bullet 是一个开源的第三方 物理引擎lib

可以通过下载源文件
或者SDK版本来使用
官方网址是
www.bulletphysics.com/

官方网站有子弹的英文手册 上面有使用的详细说明
 
怎使用Bullet物理引擎 碰撞检测

很多时候,在游戏中会遇到穿墙bug,那是因为没有使用CCD技术.
所谓CCD就是连续的碰撞检测,与之对应的是离散点碰撞检测..
这两种的碰撞检测技术的去别:
离散点的碰撞检测是指定某一时刻T的两个静态碰撞体,看它们之间是否交迭,如果没有交迭则返回它们最近点的距离,如果交迭则返回交迭深度,交迭方向等。
连续碰撞检测则是分别指定在T1、T2两个时刻两个碰撞体的位置,看它们在由T1运动到T2时刻的过程中是否发生碰撞,如果碰撞则返回第一碰撞点的位置和法线。连续碰撞检测是最为自然的碰撞检测,可以大大方便碰撞响应逻辑的编写,可以很容易避免物体发生交迭或者穿越。离散点的碰撞检测则没有那么友好,当检测到碰撞时两个物体已经发生了交迭,如果其中有三角形网格对象那么已经有许多三角形发生了交迭,如何将两个交迭的对象分开并按合理的方式运动是一个挑战。虽然连续碰撞检测是最自然的方式,但它的实现非常复杂,运算开销也很大,所以目前大部分成熟的物理引擎和碰撞检测引擎还是采用了基于离散点的碰撞检测,为了避免物体交迭过深或者彼此穿越,它们都要采用比较小的模拟步长。由于碰撞检测引擎的复杂性和对效率的高要求,我们应该尽量使用目前成熟的完整引擎,而不是自己去开发。
很幸运的是Bullet在2.7x版本以后就支持CCD技术.在Bullet中使用CCD技术比较简单
btRigidBody提供了两个函数用于实现CCD技术

setCcdMotionThreshold();
setCcdSweptSphereRadius();
通过刚体对象调用这两个函数,并且设置相应的参数就可以使用CCD技术了
比如:当物体每秒是移动速度超过1米时,将setCcdMotionThreshold();的参数设置为1,默认为0表述不使用CCD

body->setCcdMotionThreshold(1);

同时根据刚体碰撞形状的直径设置ccd扫描球
btVector3 pos;
btScalar radiu;
Shape->getBoundingSphere(pos,radiu);

body->setCcdSweptSphereRadius(radiu*0.2);

注意扫描球的直径要小于刚体的包围球的直径

通过以上设置后就不会出现物体在一些特殊的时候发生穿墙的事情了
 

http://www.bkjia.com/Androidjc/859944.htmlwww.bkjia.comtruehttp://www.bkjia.com/Androidjc/859944.htmlTechArticle将 Android* Bullet 物理引擎移植至英特尔 架构,androidbullet 简介 由于目前的移动设备上能够使用更高的计算性能,移动游戏现在也可以提供震...

本文源自: AG88环亚

您可能还会对下面的文章感兴趣: