我和我的同事正在研究视频渲染引擎。
整个想法是解析配置文件并将每个帧渲染到屏幕外FBO,然后使用glReadPixel获取帧渲染结果以进行视频编码。
我们尝试通过创建两个线程来优化渲染速度,每个线程都有一个独立的OpenGL上下文。一个线程渲染奇数帧,另一个渲染偶数帧。这两个线程不共享任何gl资源。
结果令人困惑。在我的计算机上,与我们的单线程实现相比,渲染速度提高了,而在我的合作伙伴的计算机上,整个速度都下降了。
我想知道,OpenGL上下文的数量如何影响整体性能。如果他们不共享任何东西,创建多个OpenGL线程真的是个好主意。
答案 0 :(得分:4)
上下文切换肯定不是免费的。几乎总是与性能相关的问题,一般来说无法量化。如果您想知道,您需要在您关心的系统上进行测量。它可能非常昂贵。
因此,您可以使用多个上下文添加一定数量的开销。如果这种回报取决于你的瓶颈在哪里。如果您已经使用单个CPU线程限制GPU,那么您将无法获得任何收益,因为如果GPU已经完全加载,则无法让GPU更快地完成工作。因此,您为上下文切换添加了开销而没有任何增益,并使整个事情变得更慢。
如果您受CPU限制,使用多个CPU线程可以减少总耗用时间。如果CPU工作的并行化与增加的同步和上下文切换开销一起导致净总增益再次取决于您的用例和特定系统。尝试两者并进行测量是唯一的好处。
根据您的问题描述,您可能还可以使用多线程,同时仍然坚持使用单个OpenGL上下文,并将所有OpenGL调用保留在单个线程中。您可以将其读入PBO(像素缓冲区对象),而不是同步使用glReadPixels()
,这允许您使用异步读取。这使GPU和CPU的工作分离得更好。如果你还没有这样做,你也可以在一个单独的线程上进行视频编码。这种方法需要一些线程间同步,但它避免使用多个上下文,同时仍然使用并行处理来完成工作。