如何在不影响帧速率的情况下获取opengl截图

时间:2014-02-28 07:11:30

标签: ios opengl-es

我正在努力实现在iOS上由Open GL绘制的简历截图。 当然,我知道可以使用GLReadPixels阅读。

这在下面的苹果文章中有所描述。 https://developer.apple.com/library/ios/qa/qa1704/_index.html

但是GLReadPixel很慢,它会阻止主循环。

有没有更好的替代方法来保存屏幕截图???

如果帧很忙,可以将一些帧丢弃到已恢复的屏幕,但我不想影响帧速率显示。

谢谢!

1 个答案:

答案 0 :(得分:0)

在iOS上引入了更快的方法,请尝试this帖子。

在任何情况下,从GPU检索的数据总是很慢但是在很多情况下你可以将这个操作分解为许多较小的操作,甚至将它放到一些后台线程中,但这取决于你正在处理的项目:如果你需要实时获取帧,比如制作截图视频,你可以做的不多(除非丢弃视频FPS或分辨率...),另一方面,如果你只是制作一个复杂的截图,你想要你的场景为了继续不间断,可能会有一些方法。

在屏幕截图上,你可以创建另一个帧缓冲区并继续渲染新的帧缓冲区(场景不间断),然后在每个绘制帧结束时绑定原始缓冲区并使用读取像素但只复制一部分数据:例如copy每帧的原始缓冲区的第4个,您将获得4帧的整个图像数据,并且每帧减少此操作4次。这也可以用于制作视频(每帧复制一半缓冲区将视频FPS减半)。

另一种方法是使用POT(2的幂)维度创建自定义帧缓冲区并为其附加纹理。这样您可以绘制到纹理而不是直接将其绘制到缓冲区。这样您就可以创建另一个线程,另一个共享上下文,您可以在主线程上使用此纹理创建屏幕截图,并将其绘制到屏幕上。通过这种方式,您可以控制应用程序花在制作屏幕截图上的时间,但请注意,将其用于像视频这样的内容看起来不太可能。