有没有办法提高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停顿。