为什么Android上的SDL2 OpenGL渲染速度如此之慢?

时间:2013-09-03 08:44:20

标签: android c++ opengl-es sdl

我在NDK和SDL的帮助下将C ++ 2D游戏移植到Android;我使用OpenGL来渲染精灵。表演非常令人失望。

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

实际上,即使我在黑屏中间显示单个364x353 rgba纹理,也会发生渲染需要近20毫秒。程序可以总结如下:

修改以下代码用于调用glFlush()。正如thokra在评论中指出的那样,这不是必要的。然而,删除它并没有改善性能。

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毫秒!

我在网上找到的最佳提示是this question on StackOverflowthread on Google Groups

StackOverflow上的问题答案没有帮助。根据问题的作者:

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

  

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

Google网上论坛帖子与我的问题非常相似,但在作者放弃时就结束了:

  

所以基本上,没有办法绘制480x854   由于texel读取,OpenGL在60fps的屏幕上的图像   瓶颈。

说真的,没办法?为什么同时调用glFlush()SDL_GL_SwapWindow()需要这么长时间?为什么它如此不规则?我不能做任何事吗?

我快速搜索了SDL2的源代码和foundSDL_GL_SwapWindow()使用Java Native Interface调用Java方法来完成工作。它可能是不规则的原因吗?我该怎么办?

1 个答案:

答案 0 :(得分:0)

我不知道你是否仍在这样做,但试图就这件事咨询谷歌。您无法从网络上的任何其他地方获得理性的答案。 20ms基本上是50FPS。你大多数时候会像250FPS一样做你提出的那些简单的任务。如果,如果它有意放弃,那该怎么办?

我们习惯于在简单的拦截呼叫中编码并使用整个VGA卡。但是现在即使在智能手机中,它也会像虚拟模式一样运行。你需要在汇编或c级别的视频芯片上获得这些直接访问。询问并咨询谷歌。