Android MediaCodec eglSwapBuffer 在异步模式下阻塞 GPU

Android MediaCodec eglSwapBuffer blocking GPU in asynchronous mode

我有一个视频效果应用程序,我在其中使用 OpenGL 绘制到帧缓冲区对象,然后将生成的纹理绘制到显示器,然后是 MediaCodec 输入表面(如果该应用程序正在编码)。

我最初在同步模式下为 API 18 编写了编码器(基于大片状示例)。我最近将其切换为 API 21 和异步模式。

它可以很好地录制视频,而且我相信我已经正确设置了所有内容。然而,调用 eglSwapBuffers 似乎导致帧速率显着下降。

如果我删除所有其他 OpenGL 调用,它 运行 会更好,但我渲染的内容并不那么昂贵(它可以每帧渲染多次)。更改编码器设置(即从 640x360 @ 2Mbps 到 1920x1080 @ 16Mbps)几乎没有区别。

唯一使它 运行 更快的是删除了对 eglSwapBuffers 的调用(它将缓冲区数据发送到编码器)。

我的理解是输出缓冲区不会像以前那样阻塞异步模式下的调用。我错了吗?有没有更好的方法来调用渲染器,或者在单独的线程上异步渲染的方法?

任何帮助或关于从哪里开始的想法将不胜感激,谢谢!

即使在异步模式下,输出缓冲区仍然阻塞编码器 - 您需要快速处理输出,并在调用异步编码器输出回调后 return 将输出缓冲区发送到编码器,否则您将结束像以前一样阻止输入。

同步和异步模式之间的唯一区别是您不需要轮询这些事件,而是获得回调。