有没有办法提高glReadPixels的速度?目前,我正在:

Gdx.gl.glReadPixels(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), GL20.GL_RGBA, GL20.GL_UNSIGNED_BYTE, pixels);

问题在于它阻止了渲染并且速度很慢。

我听说过像素缓冲区对象,但是我不确定如何连接它以及它是否更快。

glReadPixels以外,还有其他解决方案吗?

基本上,我想尽可能快地截取屏幕截图,而又不影响下一个场景的绘制。

最佳答案

有没有办法提高glReadPixels的速度?


好吧,该操作的速度实际上不是主要问题。它必须将一定数量的字节从帧缓冲区传输到系统内存。在典型的带有离散GPU的台式机系统中,这涉及通过PCI-Express发送数据,而没有办法解决。

但是正如您所说的那样,隐式同步是一个大问题。如果您尽快需要该像素数据,那么您真的无法比同步回读做得更好。但是,如果您可以忍受以后再获取该数据,则可以通过像素缓冲区对象(PBO)进行异步回读。

伪代码是:


创建PBO
将PBO绑定为GL_PIXEL_PACK_BUFFER
glReadPixels
做其他事情。两者都可以在CPU上工作,并且为GPU发出新命令都是理想的选择。
通过使用glGetBufferSubData或映射PBO进行读取以从PBO读取数据。


关键点是步骤5的时间安排。我要尽早这样做,但仍会阻塞客户端,因为它将等待数据可用。对于某些屏幕截图,不难将这一步延迟一两帧。这样,它只会对整体渲染性能产生轻微影响,并且不会使GPU和CPU停顿。

10-08 01:03