Nexus 5上的GLSurfaceView帧速率问题

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

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

Systrace截图

但是,屏幕录制记录(.mp4,YouTube)显示的视频帧率要低得多。

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

  • 使MediaCodec Surface输入EGL上下文成为当前
  • 将相机框架绘制到MediaCodec EGL表面
  • 使GLSurfaceView EGL上下文成为当前
  • 将相同的相机框架绘制到GLSurfaceView
  • 在Galaxy Nexus LTE和Nexus 7上(都使用AOSP 4.4),应用程序按预期运行。 到目前为止,只有Nexus 5在画到屏幕的帧数和明显的帧数之间存在这种差异......

    我祈祷我不疯狂。


    我能够复制这种行为,而我的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);
    

    解除绑定并重新绑定会导致驱动程序拾取正确的缓冲区。

    链接地址: http://www.djcxy.com/p/92535.html

    上一篇: GLSurfaceView framerate issues on Nexus 5

    下一篇: MediaCodec with Surface Input: Recording in background