android - Android NDK OpenGL 应用程序的 float 或定点数?

标签 android opengl-es android-ndk

我正在尝试决定是对我的应用程序(大部分是 C++)中的所有 3D 相关元素主要使用 float 还是整数。我知道大多数基于 ARM 的设备不支持硬件浮点,因此我认为使用 float 进行任何繁重的工作都会明显变慢。

但是,我计划准备大部分数据(即在适用的情况下使用顶点缓冲区并使用变化不大的矩阵进行转换),所以我只是将数据塞进 OpenGL 的喉咙里。我是否可以假设这或多或少直接进入 GPU,并且速度相当快? (顺便说一句,最低要求是 OpenGL ES 2.0,因此大概不包括旧的基于 1.x 的手机。)

另外 - 当我混合和匹配整数和 float 时,惩罚如何?假设我所有的几何图形都只是预先构建的浮点缓冲区,但我对矩阵使用整数,因为这些确实需要昂贵的操作,如矩阵乘法,我会在这里招致多少愤怒?

顺便说一句,我知道我应该保持较低的期望值(听起来甚至要求 CPU 上的 float 都要求太多),但是是否有任何类似 128 位 VMX 寄存器的东西?

(我暗暗希望 fadden 正在阅读这个问题并且有一个很棒的答案。)

最佳答案

G1 和 MyTouch 等较旧的 Android 设备具有不支持浮点的 ARMv6 CPU。大多数较新的设备,如 Droid、Nexus One 和 Incredible,都使用具有 FP 硬件的 ARMv7-A CPU。如果您的游戏确实是 3D 密集型游戏,它对 3D 实现的要求可能比旧设备所能提供的要多,因此您需要决定要支持的硬件级别。

如果您只使用 Java 编写代码,您的应用程序将利用可用的 FP 硬件。如果你用NDK写原生代码,选择armv5te架构,你根本得不到硬件FP。如果您选择 armv7-a 架构,您会选择,但您的应用程序将无法在 ARMv7-A 之前的设备上使用。

来自 Java 的 OpenGL 现在应该位于“直接”字节缓冲区之上,目前从 Java 访问这些缓冲区很慢,但从 native 端访问速度非常快。 (虽然我不太了解 GL 实现,所以我不能提供更多信息。)

一些设备还支持 NEON“高级 SIMD”扩展,它提供了一些超出基本 VFP 支持的奇特功能。但是,如果您想使用它,您必须在运行时对此进行测试(看起来现在有示例代码——请参阅 NDK r4b 的 NDK page)。

较早的答案有一些 info about the gcc NDK 用于“硬”fp 的标志。

最终,“固定或 float ”的答案归结为您希望您的应用在何种设备上运行。为 armv7-a 编写代码当然更容易,但您将自己从市场中分离出来。

关于android - Android NDK OpenGL 应用程序的 float 或定点数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3385964/

相关文章:

android - 设置 Listview 的项目高度不起作用

c# - Unity3d 如何从另一个脚本引用滑动控件?

安卓 M : How to open Permission Dialog even if user selects Never Ask Again ?

android - 如何重建以前的 Activity ?

ios - 是否可以在不使用 LibGDX 的情况下从 RoboVM 访问 OpenGL ES?

android - 无法链接可执行文件 : empty/missing DT_HASH error

java - Android ndk 中的共享内存

opengl-es - LibGDX - Sprite 到像素图

android - 尝试在设备上绘制带纹理的三角形失败,但模拟器可以运行。为什么?

android - TensorFlow Android 演示 : unable to build with Bazel, 无法读取 RELEASE.TXT