执行eglSwapBuffer和eglMakeCurrent时性能低下

时间:2014-08-27 03:16:51

标签: android opengl-es unity3d opengl-es-2.0 android-mediarecorder

我开发了一个Android Unity插件,允许用户记录他/她的游戏玩法 我的解决方案概述:

  • 使用OpenGl FrameBufferObject(FBO)使Unity渲染到此FBO的屏幕外
  • 获取此FBO的屏幕外纹理然后用于以下目的:
    • 渲染到视频表面
    • 重绘到设备屏幕
  • 每帧执行流量:
    • 绑定我的FBO
    • 将场景渲染到FBO(Unity代码)
    • 取消绑定我的FBO
    • 设置视频表面
      • 配置表面尺寸(仅限第一次执行)
      • save egl state
      • 制作视频表面电流
    • 使用我的FBO的屏幕外纹理绘制到视频表面
    • 恢复默认曲面
      • 将演示时间设置为视频帧
      • 从视频表面交换缓冲区到默认窗口
      • 恢复egl状态
      • 制作默认表面电流
    • 通知编码器线程数据已准备好写入

我的问题是录音效果不佳。三星Galaxy S4的FPS从60降至40。我试图记录渲染操作的执行时间,并认识到影响最大的性能操作是使视频表面当前操作和交换缓冲区从视频表面到默认窗口操作。以下是他们的代码

public void makeCurrent()
{
 if (!EGL14.eglMakeCurrent(this.mEGLDisplay, this.mEGLSurface, this.mEGLSurface, this.mEGLContext))
  throw new RuntimeException("eglMakeCurrent failed");
}

public boolean swapBuffers()
{
 return EGL14.eglSwapBuffers(this.mEGLDisplay, this.mEGLSurface);
}

当前操作的执行时间为1~18 ms
   交换缓冲区操作的执行时间为4~14 ms
   其他操作的执行时间通常为0~1 ms
   如何提高这些操作的性能?
   任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

许多OpenGL调用都是assync,有些调用可能导致OpenGL等待排队操作执行。因此,您看到的时间是因为在您正在进行的实际通话之前执行的其他调用。