我正在开发一个 Android Unity 插件,允许用户记录他/她的游戏玩法
我的解决方案概述:
- 使用 OpenGl FrameBufferObject (FBO) 使 Unity 离屏渲染到此 FBO
- Get the offscreen texture of this FBO then using for 2 purposes:
- Execute flow per frame:
- 绑定我的FBO
- 将场景渲染到 FBO(Unity 代码)
- 解绑我的 FBO
- set up video surface
- 配置表面尺寸(仅第一次执行)
- 保存egl状态
- 使视频表面成为当前
- 使用 FBO 的屏幕外纹理绘制到视频表面
- restore to default surface
- 将演示时间设置为视频帧
- 将缓冲区从视频表面交换到默认窗口
- 恢复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);
}
make current 操作的执行时间为 1 ~ 18 ms
交换缓冲区操作的执行时间为 4 ~ 14 ms
其他操作的执行时间通常为0~1ms
如何提高这些操作的性能?
任何帮助将不胜感激!
许多 OpenGL 调用是异步的,某些调用可能会导致 OpenGL 等待排队的操作执行。因此,您看到的时间是因为在您正在进行的实际调用之前执行了其他调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)