4

我有一个示例应用程序(完整源代码),它使用 MediaCodec 对相机帧进行编码,同时在 GLSurfaceView 上显示它们。

Systrace 确认每秒进行 30 次绘图调用:

系统跟踪截图

但是,屏幕记录(.mp4YouTube)显示明显的帧速率要低得多。

简而言之,我的编码和显示循环执行以下操作:

  • 使 MediaCodec Surface 输入 EGL Context 当前
  • 将相机帧绘制到 MediaCodec EGL 表面
  • 使 GLSurfaceView EGL Context 当前
  • 将相同的相机帧绘制到 GLSurfaceView

在 Galaxy Nexus LTE 和 Nexus 7(均采用 AOSP 4.4)上,应用程序按预期运行。到目前为止,只有 Nexus 5 在绘制到屏幕的帧数和明显的帧数之间存在这种差异......

我祈祷我没有疯。

4

1 回答 1

9

我能够复制这种行为,我的 GL 向导办公室伙伴发现了问题。

基本上,其中一个 EGL 上下文没有注意到纹理内容已更改,因此它会继续渲染较旧的数据。我们认为它会偶尔更新,因为它有一组循环通过的缓冲区,因此最终它会重新使用您正在查看的缓冲区。

我能够通过更新纹理渲染器类来解决我的代码中的问题,改变这个:

GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID);

对此:

GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0);
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID);

取消绑定和重新绑定会导致驱动程序获取正确的缓冲区。

于 2013-12-10T21:07:39.937 回答