我有一个示例应用程序(full source),它使用MediaCodec对相机帧进行编码,同时在GLSurfaceView上显示它们。
Systrace确认每秒进行30次绘图调用:
然而,屏幕记录录制(.mp4,YouTube)显示明显的帧速率要低得多。
简而言之,我的编码& display loop执行以下操作:
在Galaxy Nexus LTE和Nexus 7(均采用AOSP 4.4)上,应用程序按预期执行。到目前为止,只有Nexus 5在屏幕上绘制的帧数与明显的帧数之间存在差异......
我祈祷我不是疯了。
答案 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);
取消绑定并重新绑定会导致驱动程序选择正确的缓冲区。