为什么Android上SDL2的OpenGL渲染速度如此之慢? 我在NDK和SDL的帮助下,将一个C++ 2D游戏移植到Android上;我使用OpenGL渲染精灵。演出相当令人失望

为什么Android上SDL2的OpenGL渲染速度如此之慢? 我在NDK和SDL的帮助下,将一个C++ 2D游戏移植到Android上;我使用OpenGL渲染精灵。演出相当令人失望,android,c++,opengl-es,sdl,Android,C++,Opengl Es,Sdl,经过一些调查,我发现瓶颈在于渲染过程中的OpenGL调用。等一下!在粘贴经典答案之前,请阅读以下内容:不要更改GL状态、不要绑定已绑定的纹理等 事实上,即使我在黑屏中间显示一个364x353 rgba纹理,渲染也会花费近20毫秒。该过程可以总结如下: 编辑下面用于调用glFlush的代码。正如托克拉在评论中指出的那样,这是没有必要的。然而,移除它并没有改善性能 glClear( GL_COLOR_BUFFER_BIT ); glBindTexture( the_texture ); glEna

经过一些调查,我发现瓶颈在于渲染过程中的OpenGL调用。等一下!在粘贴经典答案之前,请阅读以下内容:不要更改GL状态、不要绑定已绑定的纹理等

事实上,即使我在黑屏中间显示一个364x353 rgba纹理,渲染也会花费近20毫秒。该过程可以总结如下:

编辑下面用于调用glFlush的代码。正如托克拉在评论中指出的那样,这是没有必要的。然而,移除它并没有改善性能

glClear( GL_COLOR_BUFFER_BIT );

glBindTexture( the_texture );
glEnable(GL_BLEND);

glEnableClientState( GL_COLOR_ARRAY );
glColorPointer( 4, GL_FLOAT, 0, colors );

glEnableClientState( GL_VERTEX_ARRAY );
glVertexPointer( 2, GL_FLOAT, 0, positions );

glEnableClientState( GL_TEXTURE_COORD_ARRAY );
glTexCoordPointer( 2, GL_FLOAT, 0, texture_positions );

glDrawArrays( GL_TRIANGLE_FAN, 0, vertex_count );

glDisableClientState( GL_TEXTURE_COORD_ARRAY );
glDisableClientState( GL_VERTEX_ARRAY );
glDisableClientState( GL_COLOR_ARRAY );
glDisable(GL_BLEND);

//glFlush();
SDL_GL_SwapWindow( window );
此函数的最后两行flush和swap的执行时间非常不规则。它可能需要4到12毫秒

我在网上能找到的最好的提示是和这个

关于StackOverflow的问题的答案毫无帮助。根据问题的作者:

使用glClear清除与不清除帧不会影响我的fps。启用/禁用混合也不起作用

[…]只是想看看使用压缩纹理是否可以提高填充率。似乎没有[…]

Google Groups线程与我的问题非常相似,但当作者放弃时它就结束了:

所以基本上,没有办法画一个480x854 使用OpenGL以60帧/秒的速度在屏幕上显示图像,因为使用了texel读取 瓶颈

说真的,不行?为什么调用glFlush和SDL_GL_SwapWindow需要这么长时间?为什么它如此不规则?我能做点什么吗


我在SDL2的源代码中进行了快速搜索,SDL_GL_SwapWindow使用Java本机接口调用Java方法来完成这项工作。这可能是不规则的原因吗?对此我能做些什么?

我不知道你是否还在做,但请尝试咨询谷歌。你不会从网上的任何地方得到一个合理的答案。20ms基本上是50FPS。在完成你要求的简单任务时,你的速度通常为250帧/秒。如果,只是如果,它是故意被忽略的缓慢


我们过去常常编写简单的截获呼叫代码,并使用整个VGA卡。但如今,即使在智能手机中,它也以类似虚拟模式的方式运行。你需要让这些直接访问视频芯片在汇编或c级。询问并咨询谷歌。

更好的问题是,为什么首先要使用flush?嗯……我不记得为什么会有glFlush电话,只是很久以前觉得有必要。必要的,否则我就看不见精灵了。你认为我能把它扔掉吗?为什么呢?glFlush将强制命令尽快执行到这一点,有效地将您交给GL的任何工作优先于其他工作。通常,GL实现在决定需要执行什么以及何时执行方面做得相当好。调用glFlush,您可以告诉GL该做什么,从而限制执行顺序达到最佳的机会。它不像glFinish那样糟糕,glFinish会一直阻塞到完成,但在大多数应用程序中仍然是不必要的。另外,如果你看不到精灵,冲洗不是解决办法。某个地方出了点问题。好的,我将尝试删除glFlush并尽快进行测试,看看是否有任何差异。尽管如此,它告诉所有程序只要指望完成之前发出的所有命令,就应该调用glFlush。例如,在等待用户输入之前调用glFlush,这取决于生成的图像。因此,我对实际结果有些怀疑。这就是glFlush被很好地指定的地方:即使之前发出的命令尚未完成,它也可能返回。因此,调用glFlush后直接依赖结果是不安全的。依赖于glFinish后的结果是。问题是:您真的依赖于已经执行的命令吗?我真的不明白你为什么会出现在你的例子中。