【问题标题】:Doing the least amount of GPU work做最少的 GPU 工作
【发布时间】:2017-03-25 09:47:40
【问题描述】:

应用程序是否有可能从实时(例如 60fps)图形应用程序“降低”总是呈现为简单地显示“位图”(例如 3D 世界内容的简单位块而不是完整的重新-计算)。然后,当给出用户输入(或某些应用程序特定条件发生)时,它会快速恢复到实时模式。

使用某种主管代码,我想可能可以抓取帧缓冲区的内容,暂停 3d 图形,然后在之前抓取的帧缓冲区上进行 blit,而不是重新渲染未更改的场景。

这是为了节省电力/风扇吹弱的显卡,而不是在不需要时持续渲染。

以上是实现这一目标的合适策略吗 - 即。甚至可以“暂停”3D 渲染吗?

【问题讨论】:

  • "是否可以“暂停”3D 渲染?"当然:除非您的场景发生变化,否则请停止发出绘图命令。此外,任何体面的 GUI 工具包也能够告诉您,您的 OpenGL 表面需要重绘(因为操作系统损坏了窗口),因此在这些情况下也要重绘。

标签: performance opengl graphics game-engine


【解决方案1】:

您的应用应该对用户输入或其他特定事件做出反应。仅在数据更改时更改缓冲区。仅当用户移动相机时才更新矩阵。

您可以绘制到 FBO 中,然后将其 blit 到“正常”帧缓冲区。这样,如果没有发生变化,则只需要 blitting。

您也可以避免 GPU blitting。使用glReadPixels 从该 FBO 获取位图,并使用 OS API(即使用设备上下文)通过 CPU 使用率而不是 GPU 使用率将位图传送到窗口中。

【讨论】:

  • "你也可以避免 GPU blitting。" 我无法想象它会比 GPU blit 消耗更少的能量。执行 2 次 DMA 比执行 1 次需要更多的功率。一般来说,您不能使用原生 GUI API 来影响 OpenGL 拥有的窗口。
  • 我不知道操作系统的内部结构。嗯...当您点击“打印屏幕”键时,操作系统会向 GPU 询问位图还是将存储的位图传递给 GPU?我可以想象这两种情况,然后 GPU 和 CPU 都参与其中。我确实知道 CPU 的能源浪费比 GPU 少。因此,如果 GPU 80% + CPU 20% 可以反转为 20% + 80%,我们可以节省。
  • @Ripi2 这是关于 FBO 的好主意,会尝试一下,谢谢。
  • @Ripi2 再想一想,在正常操作期间(每次扫描主动生成一帧),这种方案是否不会从所述屏幕外缓冲区吸引额外的副本到真实屏幕上?干杯
  • 是的 FBO 不同于“正常”帧缓冲区。实际屏幕需要一个 blit。但它是如此之快......顺便说一句,“附加副本”是什么意思?
猜你喜欢
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 2016-05-21
相关资源
最近更新 更多