完全通过 NDK NativeActivity 而不是通过 Java SDK 来执行 OpenGL+OpenCV 在性能方面是否值得?

Is it worth it performance-wise to do OpenGL+OpenCV entirely thru the NDK NativeActivity instead of thru the Java SDK?

我即将开始一个增强现实项目,该项目将涉及使用 EPSON Moverio AR 眼镜或类似产品。假设我们选择那些眼镜,它们 运行 在 Android 4.0.4 - API 15。该应用程序将涉及近乎实时的视频分析(来自眼镜相机的帧)以进行特征检测 /使用标记跟踪并根据标记在 'real world' 中叠加 3d 对象。

到目前为止,在技术方面,我们似乎要处理:

  1. API15
  2. OpenCV
  3. OpenGLES2

考虑到上述情况,我想知道是否值得通过 NDK 使用单个 NativeActivityandroid_native_app_glue 代码来完成这一切。当我说值得时,我的意思是性能明智。

当然,在 C/C++ 端完成这一切有一个好处,例如,代码可以通过最小修改移植到其他环境中的 运行。但是 OpenCV 确实有 Java 绑定 Android 并且从 Java 也可以在一定程度上使用 GL。所以我只是想知道在性能方面它是否值得,或者它与使用 GLSurfaceView.

大致相同

我在增强现实领域工作。我见过的绝大多数应用程序都是原生的。 Google 建议避免本机应用程序,除非收益是绝对必要的。我认为 AR 是相对少数需要它的情况之一。我知道的好处是:

  1. 本机相机访问将使您获得更高的捕获帧率。将数据传递到 Java 层会大大减慢速度。即使是 OpenCV 的非本地捕获在 Java 中也会变慢,因为 OpenCV 主要维护本地对象中的数据。您的捕获帧速率是您可以多快更新对象的姿势信息的限制因素。但是请注意,OpenCV 的原生相机 will not work on devices running Qualcomm's MSM optimized fork of android - 这包括许多金鱼草设备。
  2. 在 Java 中对 OpenGL 方法的每次调用不仅会产生与进入本机相关的成本,而且它们还会执行相当多的额外检查。查看 GLES20.cpp,其中包含 GLES20 class 方法的本机实现。您会发现使用本机调用可以绕过很多逻辑。这在大多数移动应用程序中都很好,但 3D 渲染通常会通过绕过这些检查和 JNI 开销而获得显着的好处。这在 AR 中更为重要,因为您已经用 CV 处理淹没了系统。
  3. 您很可能希望使用原生的检测相关代码。如果您想查看本机和 Java 检测性能之间的差异,OpenCV 有示例。前者将使用更少的资源并且更加一致。使用本机应用程序意味着您可以调用本机函数,而无需支付将大量数据从 Java 传递到本机的成本。
  4. 由于缺少垃圾收集和 JNI,本机传感器访问效率更高,速率在本机中更加一致。如果您将以有趣的方式使用 IMU 数据,这很重要。

您也许能够构建一个非本地应用程序,该应用程序的大部分代码都是本地代码,并且尽管基于 Java 但运行良好,但要困难得多。