我正在开发一款Android Unity插件,允许用户记录他/她的游戏过程
我的解决方案概述如下:
- 使用OpenGL FrameBufferObject(FBO)使Unity呈现屏幕外到这个FBO
- 获取此FBO的屏幕外纹理,然后用于两个目的:
- 渲染到视频表面
- 重新绘制到设备屏幕上
- 每帧执行以下流程:
- 绑定我的FBO
- 将场景渲染到FBO中(Unity代码)
- 取消绑定我的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毫秒
交换缓冲区操作的执行时间为4~14毫秒
其他操作通常为0~1毫秒
如何提高这些操作的性能?
任何帮助都将不胜感激!
doFrame
回调函数来绘制一帧。我不知道在Unity3D中绘制动作发生在哪里。 - peacepassion