EGL / OpenGL ES /切换上下文很慢

时间:2013-08-07 16:39:14

标签: opengl-es egl

我正在开发一个OpenGL ES 2.0应用程序(在Windows上使用angleproject进行开发),它由多个“框架”组成。

每个帧都是一个独立的应用程序,不应干扰周围的帧。框架是使用OpenGL ES 2.0绘制的,由该框架内部运行的代码绘制。

我的第一次尝试是为每个帧分配一个帧缓冲区。但是存在一个问题 - 当一帧正在绘制时,OpenGL的内部状态会发生变化,如果下一帧没有全面重置每个已知的OpenGL状态,则可能会出现副作用。这违背了我的要求,即每一帧都应该被隔离,而不是相互影响。

我的下一次尝试是每帧使用一个上下文。我为每个帧创建了一个独特的上下文。我正在使用共享资源,因此我可以对每个帧进行eglMakeCurrent,将每个帧渲染到自己的帧缓冲区/纹理,然后将eglMakeCurrent返回到全局,将每个纹理组合到最终屏幕。

这在隔离实例方面做得很好,但是.. eglMakeCurrent 非常慢。只需4个就可以花费一秒或更长时间来渲染屏幕。

我可以采取什么方法?有没有办法可以加速上下文切换,或者通过某种方式保存每帧的OpenGL状态来避免上下文切换?

2 个答案:

答案 0 :(得分:0)

我有一个建议可以消除eglMakeCurrent的开销,同时允许你使用当前的方法。

当前EGLContext的概念是线程本地的。我建议在进程的主线程中创建所有上下文,然后为每个上下文创建一个线程,将一个上下文传递给每个线程。在每个线程的初始化期间,它将在它拥有的上下文中调用eglMakeCurrent,并且永远不再调用eglMakeCurrent。希望在ANGLE的实现中,上下文的线程本地存储能够高效地实现,并且没有不必要的同步开销。

答案 1 :(得分:-1)

这里的问题是尝试以通用平台和操作系统独立的方式执行此操作。如果您选择特定平台,那么就有很好的解决方案。在Windows上,有wgl和glut库可以为您提供多个窗口,这些窗口具有完全独立的OpenGL上下文并行运行。它们被称为Windows,而不是帧。您也可以使用DirectX而不是OpenGL。 Angle使用DirectX。在linux上,解决方案是X11 for OpenGL。在任何一种情况下,拥有高质量的OpenGL驱动程序至关重要。没有Intel Extreme芯片组驱动程序。如果您想在Android或iOS上执行此操作,则需要使用不同的解决方案。最近关于Android案例的Khronos.org OpenGL ES论坛上有一个帖子。