EGL/OpenGL ES/切换上下文速度慢

5
我正在开发一个OpenGL ES 2.0应用程序(在Windows上使用angleproject进行开发),由多个“帧”组成。
每个帧都是一个独立的应用程序,不应干扰周围的帧。这些帧使用OpenGL ES 2.0绘制,由在该帧内运行的代码完成。
我的第一次尝试是为每个帧分配一个帧缓冲区。但存在问题——当一个帧正在绘制时,OpenGL的内部状态会改变,如果接下来的帧没有全面重置已知的所有OpenGL状态,可能会产生副作用。这违反了我每个帧都应该隔离并且不相互影响的要求。
我的下一步尝试是为每个帧使用一个上下文。我为每个帧创建了一个唯一的上下文。我使用共享资源,以便我可以eglMakeCurrent到每个帧,将每个帧渲染到它们自己的帧缓冲区/纹理中,然后eglMakeCurrent返回到全局,将每个纹理合成到最终屏幕中。
这很好地隔离了实例,但是eglMakeCurrent非常慢。只需要4个以上就可能需要一秒钟或更长时间才能渲染屏幕。
我可以采取什么方法?有办法可以加快上下文切换的速度,或者通过某种方式保存每个帧的OpenGL状态以避免上下文切换吗?
2个回答

0

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

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


-1
这里的问题在于尝试以通用平台和独立于操作系统的方式来实现。如果选择特定的平台,就有好的解决方案。在Windows上,有wgl和glut库,可以同时运行具有完全独立OpenGL上下文的多个窗口。它们被称为Windows,而不是Frames。您也可以使用DirectX而不是OpenGL。Angle使用DirectX。在Linux上,OpenGL的解决方案是X11。在任何情况下,拥有高质量的OpenGL驱动程序至关重要。没有英特尔极限芯片组驱动程序。如果您想在Android或iOS上执行此操作,则需要不同的解决方案。最近在Khronos.org OpenGL ES论坛上有一个关于Android案例的讨论。

即使直接使用平台提供的EGL和OpenGL ES库,绕过ANGLE,eglMakeCurrent在许多平台上存在问题。根本问题是eglMakeCurrent通常是一次昂贵的调用,因为EGL规范实际上要求驱动程序在eglMakeCurrent返回之前内部调用glFlush。glFlush可能会消耗大量CPU。EGLContext交换也会对驱动程序的内部GL状态机验证造成影响。 - Chadversary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接