GLSurfaceView在Nexus 5上出现帧率问题

时间:2013-12-04 21:36:08

标签: android glsurfaceview mediacodec

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

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

Systrace screenshot

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

简而言之,我的编码& display loop执行以下操作:

  • 使MediaCodec Surface输入EGL上下文当前
  • 将相机框架绘制到MediaCodec EGL表面
  • 使GLSurfaceView EGL上下文最新
  • 将相同的相框绘制到GLSurfaceView

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

我祈祷我不是疯了。

1 个答案:

答案 0 :(得分: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);

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