我在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 StackOverflow和thread on Google Groups。
StackOverflow上的问题答案没有帮助。根据问题的作者:
使用glClear清除vs不清除帧不会影响我的fps。启用/禁用混合也不会。
和
[...]只是想看看是否使用压缩纹理可以提高填充率。它似乎没有[...]
Google网上论坛帖子与我的问题非常相似,但在作者放弃时就结束了:
所以基本上,没有办法绘制480x854 由于texel读取,OpenGL在60fps的屏幕上的图像 瓶颈。
说真的,没办法?为什么同时调用glFlush()
和SDL_GL_SwapWindow()
需要这么长时间?为什么它如此不规则?我不能做任何事吗?
我快速搜索了SDL2的源代码和found,SDL_GL_SwapWindow()
使用Java Native Interface调用Java方法来完成工作。它可能是不规则的原因吗?我该怎么办?
答案 0 :(得分:0)
我不知道你是否仍在这样做,但试图就这件事咨询谷歌。您无法从网络上的任何其他地方获得理性的答案。 20ms基本上是50FPS。你大多数时候会像250FPS一样做你提出的那些简单的任务。如果,如果它有意放弃,那该怎么办?
我们习惯于在简单的拦截呼叫中编码并使用整个VGA卡。但是现在即使在智能手机中,它也会像虚拟模式一样运行。你需要在汇编或c级别的视频芯片上获得这些直接访问。询问并咨询谷歌。