有没有办法提高glReadPixels
的速度?目前我这样做:
Gdx.gl.glReadPixels(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), GL20.GL_RGBA, GL20.GL_UNSIGNED_BYTE, pixels);
问题在于它会阻止渲染并且速度很慢。
我听说过Pixel Buffer Objects,但我不确定如何连接它以及它是否更快。
还有除glReadPixels
以外的任何其他解释吗?
基本上,我想尽快拍摄截图,而不会阻挡下一个场景的绘制。
答案 0 :(得分:17)
有没有办法提高glReadPixels的速度?
嗯,该操作的速度实际上不是主要问题。它必须将一定量的字节从帧缓冲区传输到系统内存。在具有独立GPU的典型桌面系统中,通过PCI-Express发送数据,并且无法解决这个问题。
但正如您所说,隐式同步是一个大问题。如果您需要尽快获得像素数据,那么您实际上并不比同步回读更好。但是,如果您可以在以后获取该数据,那么通过像素缓冲对象(PBO)进行异步回读就可以了。
伪代码是:
GL_PIXEL_PACK_BUFFER
glReadPixels
glGetBufferSubData
或通过映射PBO进行阅读,从PBO回读数据。关键点是第5步的时间安排。我这样做到了早,你仍然阻止了客户端,因为它会等待数据变得可用。对于某些屏幕截图,即使是一帧或两帧也不难延迟该步骤。这样,它只会对整体渲染性能产生轻微影响,并且不会使GPU和CPU停滞不前。