是否可能进行GPU加速的3D渲染,以超过屏幕刷新率的速度运行?

3
  • 有没有可能进行GPU加速的3D渲染,使其比屏幕刷新率更快?

  • 是否可以使用OpenGL进行此操作?如果可以,如何操作?如果不行,应该使用什么工具?

注意

由于我希望渲染速度比屏幕刷新率更快,因此即使没有输出到屏幕也无妨。事实上,没有输出窗口会更加优越。

我将通过编程方式使用渲染输出(例如通过glReadPixels),或将其输出为视频文件以供人们稍后观看。

为什么我要这样做

我想对机器人进行计算机视觉的仿真。模拟机器人将拥有一个虚拟相机来观察这个世界,并根据相机输入进行操作。因此,我希望模拟尽可能快地运行,而不考虑屏幕刷新率。


这是完全可能的,但我不知道具体情况。只需看看所有的3D基准测试 - 其中许多发布的帧速率远远超出屏幕实际显示的范围。 - tucuxi
如何实现此功能的实际代码 - Ciro Santilli OurBigBook.com
2个回答

7

可以使用OpenGL实现这一点。渲染速率与屏幕刷新率无关(这就是为什么你可以看到以500FPS为单位运行的演示)。

至于具体操作,您可以将渲染结果存储在离屏缓冲区中,并将结果图像读回主内存。然后,您可以按照自己的需求进行处理/分析。请参见:


1

要使用OpenGL,我只需要在我的display回调函数的末尾用glFlush替换glutSwapBuffers,这使得一个非常简单的场景从60FPS提高到了600FPS。

glutSwapBuffers确保每个计算出来的帧都被显示出来,因此会停止你的程序直到屏幕刷新,在此时它将后备缓冲区放入前置缓冲区,这可以在屏幕上看到。

另一方面,glFlush仅确保场景已经被计算并更新后备缓冲区(无法在屏幕上看到)中的新场景。因此,新场景的计算仅在渲染完成后才会停止。glutSwapBuffers在交换缓冲区之前调用glFlush以确保场景已经被计算。

注意

在我的应用程序中,即使没有glutSwapBuffersglReadPixels也能正确读取像素,因此它是从后备缓冲区读取的。

然而,仅仅调用glReadPixels来检索700个像素存在很大的性能惩罚:FPS降至200FPS。我猜测这是因为后备缓冲区必须在GPU内存中(请纠正/确认此点),而glReadPixels正在进行GPU -> CPU通信,这非常昂贵。

这意味着,无论渲染速度有多快,我的应用程序仍将受到200FPS的瓶颈限制,除非我成长并学会如何在GPGPU上处理并从那里访问后备缓冲区。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接