使用来自 jni 的 openGL ES 时的 java glSurfaceView 与 Native-Activity

标签 java android java-native-interface opengl-es-2.0

我有一个 Android 项目,我在其中使用 JNI 在 gpu (openGL ES 2) 上进行渲染。

目前,我通过在 Java 中创建一个 glSurfaceView 来实现这一点,然后使用 onDrawFrame 调用我的 JNI 代码来执行 GLES 命令。虽然这可行,但渲染速度并不好。

我想知道如果我停止使用 java glSurfaceView 来处理上下文创建,而是尝试使用 Native-Activity 并在 cpp 中执行所有操作,是否可以获得更好的性能。

我认为这样我就不能再使用任何 java 代码了,所以我肯定会遇到其他麻烦,因为我的应用程序需要与一些 java android api 通信。

我可以想象 Native-Activity(我认为它仍然被一些 java 代码包裹)在底层使用相同的 glSurfaceView,所以不会有任何收获。

非常感谢有关此主题的任何信息。

我在 GPU 上的所有绘图都是使用 glDrawArray 完成的。也许这不是在 openGL ES 上运行的最快方式?

最佳答案

您需要分析瓶颈是软件还是 GPU。找出哪一侧是瓶颈后,您可以尝试优化那一侧。

glDrawElements 可以是对 glDrawArrays 的微小改进,因为顶点着色器可以为在网格中多次使用的每个顶点运行一次。但更重要的 GPU 端优化可以分段着色器、避免混合、确保深度测试正确防止多次重绘相同像素位置等。当然,如果您有复杂的几何图形,那么顶点处理也可能成为瓶颈。

快速估算某样东西的成本:

  • 调用 java 代码一次 0.001-0.01ms (CPU)

  • glDraw* 使用 VBO/IBO 0.01-0.1ms (CPU) 一次

  • 廉价的顶点着色器 0.1-1ms (GPU)

  • 昂贵的顶点着色器 1-10ms (GPU)

  • 便宜的全屏 fragment 着色器 2-5ms (GPU)

  • 昂贵的 fragment 着色器 30-100 毫秒(GPU)

  • 整个屏幕混合 N 次将花费 N 倍的 fragment 着色器成本 (GPU)

免责声明:数字只是非常粗略的估计。您应该使用分析和基准来为您的用例找到真正的值(value)。

关于使用来自 jni 的 openGL ES 时的 java glSurfaceView 与 Native-Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40256847/

相关文章:

android - 按钮没有包装它的内容

android - 通过 Android 推送通知启动应用程序

android - 从谷歌翻译 Activity 返回翻译文本

java - 如何从 C/C++ 调用 getter 返回二维数组?

java - 在 C++ 中使用 java 类时找不到类

java - 使用 Spring 和 JavaMail 发送合并的纯文本/HTML 邮件

inheritance - Java:方法是否继承 JRE 父类(super class),就像类继承 Object 一样?

java - 从网页中的 java servlet 检索数据

java - JNI 检测到应用程序错误 : use of deleted local reference 0x1

java - 如何在LWJGL/Slick2D中循环播放声音