其他分享
首页 > 其他分享> > android – 在Nexus 5上的GLSurfaceView帧率问题

android – 在Nexus 5上的GLSurfaceView帧率问题

作者:互联网

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

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

但是,屏幕记录记录(.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);

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

标签:mediacodec,android,glsurfaceview
来源: https://codeday.me/bug/20190725/1532226.html