将 Android* Bullet 物理引擎移植至英特尔® 架构
简单介绍
因为眼下的移动设备上可以使用更高的计算性能。移动游戏如今也可以提供震撼的画面和真实物理(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 (ilya.krjukov@intel.com) — 高级软件project师
Denis Smirnov (denis.smirnov@intel.com) — 软件实习生
相关文章与资源
- 将 Android* 原生应用的低级别组件移植至基于英特尔® 架构的平台
- 面向 Android* 开发者的英特尔学习系列计划 #7: 为英特尔® 架构创建和移植基于 NDK 的 Android* 应用
- 面向英特尔® 架构(IA)创建和移植基于 NDK 的 Android* 应用
- 在英特尔® 凌动™ 处理器上将 OpenGL* 游戏移植到 Android* (第一部分)
- 在英特尔® 凌动™ 处理器上将
OpenGL* 游戏移植到 Android* (第二部分)
英特尔、Intel 标识、凌动是英特尔公司在美国和/或其它国家(地区)的商标。
英特尔公司 © 2014 年版权全部。
全部权保留。
* 其它的名称和品牌可能是其它全部者的资产。
将 Android* Bullet 物理引擎移植至英特尔® 架构的更多相关文章
- 面向基于英特尔® 架构的 Android* 的 CoCos2D
Cocos2D 是一款游戏引擎,可与从电脑到手机等多种设备配合使用. 该引擎支持丰富的特性,可帮助创建出色的 2D 游戏.它甚至包含具备全面功能的物理引擎. CoCos2D 的核心元素是基本动画元素( ...
- Bullet物理引擎在OpenGL中的应用
Bullet物理引擎在OpenGL中的应用 在开发OpenGL的应用之时, 难免要遇到使用物理来模拟OpenGL中的场景内容. 由于OpenGL仅仅是一个关于图形的开发接口, 因此需要通过第三方库来实 ...
- Bullet物理引擎的安装与使用
图形赋予游戏一种视觉的吸引力,但是能够让游戏的世界鲜活起来的还应该是内部的物理引擎.物理引擎是游戏引擎中的子模块,是一种软件组件,可仿真物理系统.它根据牛顿力学定律,计算游戏中物体的合理的物理位置,并 ...
- 转:Bullet物理引擎不完全指南(Bullet Physics Engine not complete Guide)
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 前言 Bullet据称为游戏世界占有率为第三的物理引擎,也是前几大引擎目前唯一能够 ...
- 【Bullet引擎】Bullet物理引擎简单说明
说明 Bullet是一款开源的物理模拟计算引擎,包括刚体.柔体.弹性体等,是世界三大物理模拟引擎之一(包括Havok和PhysX),被广泛应用于游戏开发(GTA5等)和电影(2012等)制作中. Bu ...
- android游戏物理引擎开发——粒子系统(三)
生病了,医院躺了几天,动了个小手术,动手术之后的几天在医院看了几本<大众软件>,又想到自己必须得买台台式机了,这破笔记本实在用不下去了,然后开始喜欢看些硬件的东西,等我熟悉了以后,写几个硬 ...
- bullet物理引擎与OpenGL结合 导入3D模型进行碰撞检测 以及画三角网格的坑
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11681069.html 一.初始化世界以及模型 /// 冲突配置包含内存的默认设置,冲突设置. ...
- 链接收藏:bullet物理引擎不完全指南
这个也是博客园的文章,编辑得也很好,就不copy了,结尾还有PDF: https://www.cnblogs.com/skyofbitbit/p/4128347.html 完结
- 【AwayPhysics学习笔记】:Away3D物理引擎的简介与使用
首先我们要了解的是AwayPhysics这个物理引擎并不是重头开始写的新物理引擎,而是使用Flascc技术把一个已经很成熟的Bullet物理引擎引入到了Flash中,同时为了让as3可以使用这个C++ ...
随机推荐
- struts2实现图片验证码
生成图片验证码的主要工具类方法为: package com.yeting.fc.util; import java.awt.Color; import java.awt.Font; import ja ...
- Selenium:简单的尝试一下
一.创建maven工程引入依赖 1)创建项目 创建一个简单的maven工程即可 这里我使用jar项目进行简单的演示 2)引入依赖 <dependencies> <dependency ...
- CORS与JSONP的区别
CORS与JSONP: a. JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求. b. 使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSON ...
- JavaScript实现html页面转换成图片格式
本文提供三个JavaScript插件,并提供对应GitHub地址,自行查看使用方法: 1)dom-to-image:dom-to-image 2)html2canvas:html2canvas 3)r ...
- nodejs安装与概述
第一部分:安装与测试 1 官方下载地址 https://nodejs.org/en/ 2 测试是否安装成功? window下打开CMD窗口 输入:node -v => 显示安装的nodej ...
- List<T>与List<?>的区别
T 代表某一类型 ? 代表任意类型.. T因为代表是某一确定类型..所以你可以使用它..比如你有个List<T>类型的变量tList 你可以用T t = tList.get(1);也可以用 ...
- Git学习总结(8)——Git和SVN之间的基本区别
GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等.如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征.所以,这篇文章的主要目的就是 ...
- 任务调度器quartz的使用
1.quartz的获取. 可參照:Quartz任务调度模型实例 2.开发思路: 要使用定时器quartz.先弄清楚三个概念:调度器.任务.触发器.开发也是依照这三个方面来开发, 1>写一个Job ...
- Revit二次开发实现BIM盈利(以橄榄山快模为例解说) 视频讲座下载
应笔墨闲谈群的邀请, 在10月11号晚8:30分在其群做了一次关于BIM二次开发的讲座. 因为參与者基本上都是从设计院和施工单位来的,所以对Revit二次开发做了纵览性的解说, 以非程序猿能听懂的方式 ...
- fancybox关闭弹出窗体parent.$.fancybox.close();
fancybox弹出窗体右上角会自带一个关闭窗体,而且点击遮罩层也会关闭fancybox 有时我们不须要这样进行关闭,隐藏关闭窗体,而且遮罩层不可点击 在弹出窗体页面加一链接进行关闭使用parent. ...