我想要一种非常快速的方法来捕获我的应用程序的openGL帧缓冲区的内容。通常,glReadPixels()用于将帧缓冲区的内容读入缓冲区。但这很慢。
我试图通过创建4个线程来使用glReadPixels()从4个不同的区域读取帧缓冲来并行化读取帧缓冲内容的过程。但由于分段错误,应用程序正在退出。如果我从线程中删除了glReadPixels()调用,那么应用程序正在正常运行。
答案 0 :(得分:7)
线程不起作用,弃用该方法。
正如您所注意到的,创建多个线程失败,因为只有一个线程具有当前的OpenGL上下文。原则上,可以在调用glReadPixels
之前使每个工作线程中的上下文成为当前,但这需要从您的方面进行额外的同步(否则,在创建上下文之间可能会抢占一个线程当前和回读!),(wgl|glx)MakeCurrent
是一个非常慢的功能,将严重阻止OpenGL。最后,你会做更多的工作来获得更多更慢的东西。
没有办法让glReadPixels
更快 1 ,但你可以解耦所花费的时间(即回读以异步方式运行),因此它不会阻止你的应用程序出现以“更快”运行
您想使用Pixel buffer object。确保缓冲标记正确。
请注意,如果完整内容尚未完成传输,映射缓冲区以访问其内容将仍然阻止,因此它仍然不会更快。要考虑到这一点,您必须阅读上一帧,或使用您可以查询的fence对象以确保它已完成。
或者,更简单但不太可靠,您可以在glReadPixels
之间插入“其他工作”并访问数据。这不能保证在您访问数据时传输已完成,因此它仍可能会阻止。但是,它可能正常工作,它可能阻塞的时间更短(因此运行“更快”)。
<小时/> 1 有很多方法可以让它更慢,例如如果你要求OpenGL做一些奇怪的转换或者你使用错误的缓冲区标志。但是,通常情况下,没有办法让它更快,因为它的速度取决于在传输甚至可以启动之前完成的所有先前的绘制命令,并且数据通过PCIe总线传输(具有固定的时间开销加上有限的带宽) 。