【问题标题】:Is it possible to do GPU accelerated 3D rendering faster than screen refresh rate?是否可以比屏幕刷新率更快地进行 GPU 加速 3D 渲染?
【发布时间】:2012-12-27 12:33:25
【问题描述】:
  • 能否以比屏幕刷新率更快的速度进行 GPU 加速 3D 渲染?

  • 是否可以使用 OpenGL 来实现?如果是,如何使用,如果不是,使用什么工具?

注意

因为我希望渲染速度快于屏幕刷新率,所以我不介意没有输出到屏幕。事实上,没有输出窗口会是一个优势。

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

我为什么要这样做

我想做计算机视觉机器人的计算机模拟。模拟机器人将有一个虚拟摄像头来观察这个世界,并将根据摄像头输入采取行动。因此,我希望模拟尽可能快地运行,而不考虑屏幕刷新率。

【问题讨论】:

  • 这当然是可能的,但我不知道具体情况。看看所有的 3D 基准测试——其中许多发布的帧速率远远超出屏幕实际显示的范围。
  • Actual code 了解如何操作。

标签: opengl render gpu


【解决方案1】:

是的,OpenGL 绝对可以做到这一点。渲染速率与屏幕刷新率无关(这就是为什么您可以看到以 500 FPS 等速度运行的演示)。

至于机制,您可以渲染到屏幕外帧缓冲区并将生成的图像读回主内存。然后,您可以随意处理/分析它。见:

【讨论】:

    【解决方案2】:

    要使用 OpenGL 来实现,我必须简单地将 display 回调函数末尾的 glutSwapBuffers 替换为 glFlush,这使我在一个非常简单的场景中从 60FPS 提高到 600FPS。

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

    另一方面,glFlush 仅确保已计算场景并使用新场景更新后台缓冲区(在屏幕上看不到)。因此,新场景计算仅在新场景被渲染之前停止。 glutSwapBuffers 来电 glFlush 在交换缓冲区之前确保已计算场景。

    注意

    在我的应用程序中,glReadPixels 允许我在没有 glutSwapBuffers 的情况下正确读取像素,因此它是从后台缓冲区读取的。

    但是,仅调用glReadPixels 来检索 700 像素会带来很大的性能损失:FPS 降至 200FPS。我猜这是因为后备缓冲区必须位于 GPU 内存上的某个位置(请更正/确认这一点),而 glReadPixels 正在做 GPU -> CPU 通信,这非常昂贵。

    这意味着无论渲染的计算速度有多快,我的应用程序在 200FPS 时仍会遇到瓶颈,除非我长大并学习如何在 GPGPU 上进行处理并从那里访问后备缓冲区。

    【讨论】:

      猜你喜欢
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      • 2010-09-17
      • 2020-11-23
      • 1970-01-01
      • 2015-04-06
      相关资源
      最近更新 更多