我有一个视频特效应用程序,在其中使用OpenGL绘制到帧缓冲对象,然后将生成的纹理绘制到显示器上,以及如果应用程序正在编码,则绘制到MediaCodec输入表面。
我最初在API 18中按照同步模式(基于大flake示例)编写了编码器。我最近将其切换到API 21和异步模式。
它可以正常记录视频,我相信我已经正确设置了所有内容。但是,调用eglSwapBuffers似乎会导致帧速率显着下降。
如果我删除所有其他OpenGL调用,它运行得更好,但是我渲染的内容并不那么昂贵(它可以在每帧内多次良好渲染)。更改编码器设置(即从640x360@2Mbps到1920x1080@16Mbps)几乎没有任何区别。
唯一可以加快运行速度的方法是删除对eglSwapBuffers的调用(这将缓冲区数据发送到编码器)。
我的理解是,在异步模式下输出缓冲区不会像之前那样阻塞调用。我的理解是否正确?还有一种首选的调用渲染器的方式,或者在单独的线程上异步进行渲染的方法吗?
如有任何帮助或想法,请不吝赐教,感谢!
我最初在API 18中按照同步模式(基于大flake示例)编写了编码器。我最近将其切换到API 21和异步模式。
它可以正常记录视频,我相信我已经正确设置了所有内容。但是,调用eglSwapBuffers似乎会导致帧速率显着下降。
如果我删除所有其他OpenGL调用,它运行得更好,但是我渲染的内容并不那么昂贵(它可以在每帧内多次良好渲染)。更改编码器设置(即从640x360@2Mbps到1920x1080@16Mbps)几乎没有任何区别。
唯一可以加快运行速度的方法是删除对eglSwapBuffers的调用(这将缓冲区数据发送到编码器)。
我的理解是,在异步模式下输出缓冲区不会像之前那样阻塞调用。我的理解是否正确?还有一种首选的调用渲染器的方式,或者在单独的线程上异步进行渲染的方法吗?
如有任何帮助或想法,请不吝赐教,感谢!