执行eglSwapBuffer和eglMakeCurrent时性能低下

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

  • 使用OpenGl FrameBufferObject(FBO)使Unity渲染离开FBO
  • 获取此FBO的屏幕外纹理,然后用于2个目的:
  • 渲染到视频表面
  • 重新绘制到设备屏幕
  • 每帧执行流程:
  • 绑定我的FBO
  • 渲染场景给FBO(统一码)
  • 解开我的FBO
  • 设置视频表面
  • 配置表面尺寸(仅限第一次执行)
  • 保存egl状态
  • 使视频表面电流
  • 使用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
    如何提高这些操作的性能?
    任何帮助将不胜感激!


    许多OpenGL调用都是assync,有些调用可能会导致OpenGL等待排队的操作执行。 所以你看到的时间是因为你正在做的实际呼叫之前执行的其他呼叫。

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

    上一篇: Low performance when execute eglSwapBuffer and eglMakeCurrent

    下一篇: Android ADB device offline, can't issue commands