android - Nexus 5 上的 GLSurfaceView 帧率问题

标签 android glsurfaceview android-mediacodec

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

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

Systrace screenshot

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

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

  • 使 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);

解除绑定(bind)和重新绑定(bind)会导致驱动程序选择正确的缓冲区。

关于android - Nexus 5 上的 GLSurfaceView 帧率问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20386515/

相关文章:

android - 使用 harism page curl 库的 Page Curl 效果,页面背景显示为黑色边框而不是透明度。

Android 相机预览颜色问题(红色和蓝色交换)

android - 使用 MediaCodec API 编辑 MP4 元数据

android - FirebaseRemoteConfig getString 返回空但远程配置的字节数组不为空

android - 为什么不弃用 SurfaceView?

Android:将 OpenGL 效果应用于相机

PowerVR G6200 上带有 EGLConfigChooser 的 java.lang.RuntimeException

java.lang.RuntimeException : Unable to start activity android. view.InflateException:二进制 XML 文件行 #13

Android - 如何让两个 View 接收并执行相同的触摸事件?

android - MediaRecorder 捕获的音频文件在发送到服务器后损坏