Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用jni中的openGL ES时java glSurfaceView与本机活动_Java_Android_Java Native Interface_Opengl Es 2.0 - Fatal编程技术网

使用jni中的openGL ES时java glSurfaceView与本机活动

使用jni中的openGL ES时java glSurfaceView与本机活动,java,android,java-native-interface,opengl-es-2.0,Java,Android,Java Native Interface,Opengl Es 2.0,我有一个Android项目,我使用JNI在gpu(OpenGLES2)上进行渲染 目前,我通过在Java中创建一个glSurfaceView,然后使用onDrawFrame调用我的JNI代码来执行这些命令。此操作正常时,渲染速度不好 我想知道如果我停止使用JavaGlsurfaceView来处理上下文创建,而是尝试使用本机活动并在cpp中执行所有操作,是否可以获得更好的性能 我认为这样我就不能再使用任何java代码了,所以我肯定会遇到其他问题,因为我的应用程序需要与一些java android

我有一个Android项目,我使用JNI在gpu(OpenGLES2)上进行渲染

目前,我通过在Java中创建一个
glSurfaceView
,然后使用
onDrawFrame
调用我的JNI代码来执行这些命令。此操作正常时,渲染速度不好

我想知道如果我停止使用JavaGlsurfaceView来处理上下文创建,而是尝试使用本机活动并在cpp中执行所有操作,是否可以获得更好的性能

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

我可以想象,在幕后,本机活动(我认为仍然由一些java代码包装)使用相同的
glSurfaceView
,因此不会有任何收获

我非常感谢关于这个话题的任何信息


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

如果瓶颈是软件或GPU,您需要分析。在找出哪一个是瓶颈后,您可以尝试优化这一方面

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

快速估算某物的成本:

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

  • glDraw*一次,带VBO/IBO 0.01-0.1ms(CPU)

  • 便宜的顶点着色器0.1-1ms(GPU)

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

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

  • 昂贵的片段着色器30-100ms(GPU)

  • 全屏混合N次将花费N倍片段着色器成本(GPU)


免责声明:这些数字只是非常粗略的估计。您应该使用评测和基准测试来为您的用例找到真正的值。

如果您的所有呈现代码都已经是本机代码,我认为将其转换为本机活动不会有显著的区别。调用本机渲染代码所需的每帧一次JNI调用无关紧要。谢谢。是的,我可以验证jni调用和任何非gles代码都不是瓶颈,因为只要我禁用对glDrawArray的所有调用,我就可以获得不错的帧率。到现在为止,我通过玩EGLConfig(特别是禁用aa当然会大大提高性能)来提高渲染速度。谢谢你的回答。如果你还提到EGLConfigs,我会接受它作为正确答案,它可以大大提高GPU性能(通过改进EGLConfigs,我的应用程序从15fps渲染到30fps。我禁用了AA,并将STENCIL_缓冲区从8设置为1)。不幸的是,我们不能在glDrawArray上使用glDrawElements,但我明白你的意思(通过使用tris的索引数据,我们可以减少顶点计算量)。目前,我们正在考虑防止重画相同像素位置的方法。