代码之家  ›  专栏  ›  技术社区  ›  EboMike

Android NDK OpenGL应用的浮点还是定点?

  •  8
  • EboMike  · 技术社区  · 14 年前

    我正在尝试决定是否主要使用浮动或int来为我的应用程序中的所有3D相关元素(大部分是C++)。我知道大多数基于ARM的设备都不支持硬件浮点运算,所以我认为任何带有浮点运算的重载操作都会明显慢一些。

    然而,我计划为大部分准备所有数据(即,在适用的地方有顶点缓冲区,并使用变化不大的矩阵进行变换),所以我只是把数据塞进OpenGL的喉咙里。我是否可以假设这或多或少直接进入GPU,因此会相当快(顺便说一句,最低要求是opengles2.0,因此可能不包括基于1.x的旧手机。)

    还有-当我混合和匹配int和float时,惩罚是怎样的?假设我所有的几何体都是预先构建的浮点缓冲区,但我对矩阵使用int,因为它们确实需要像矩阵乘法这样昂贵的操作,我在这里会招致多少愤怒?

    顺便说一句,我知道我应该保持我的期望值低(听起来,即使要求浮动的CPU是要求太多),但有什么像128位VMX寄存器远程?

    2 回复  |  直到 14 年前
        1
  •  14
  •   Community CDub    7 年前

    像G1和MyTouch这样的老Android设备有armv6cpu,不支持浮点运算。大多数较新的设备,如Droid、nexusone和Incredible,都使用ARMv7-cpu,这是一种具有FP硬件的cpu。如果你的游戏真的是3D密集型的,那么它可能需要比旧的设备提供更多的3D实现,所以你需要决定你想要支持什么级别的硬件。

    如果您只使用Java编写代码,那么您的应用程序将在可用时利用FP硬件。如果您使用NDK编写本机代码,并选择armv5te体系结构,则根本不会得到硬件FP。如果您选择了armv7-a体系结构,那么您会选择,但是您的应用程序在armv7-a之前的设备上不可用。

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

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

    早些时候的回答有一些问题 info about the gcc NDK用于“硬”fp的标志。

        2
  •  5
  •   olivierg    14 年前

    我认为你应该尽可能地坚持定点。

    不仅旧手机缺少浮点支持,HTC Wildfire等新手机也缺少浮点支持。

    另外,如果您选择要求使用ARMv7,请注意,例如摩托罗拉Milestone(Droid for Europe)的确有ARMv7 CPU,但由于Android 2.1是为该设备构建的,因此该设备将不会使用您的armeabi-v7a libs(并且可能会在市场上隐藏您的应用程序)。

    我个人通过使用新的 cpufeatures library 提供NDK r4b,使用dlopen()按需加载一些armeabi-v7a库。