【问题标题】:CPU Usage during glFinish()glFinish() 期间的 CPU 使用率
【发布时间】:2014-11-11 16:52:03
【问题描述】:

上下文:我正在测量 Qt 测试应用程序图形渲染期间的 CPU 使用率。渲染是通过 Qt Quick 模块完成的,该模块使用基于 OpenGL 的专用场景图。

环境:我在运行 Windows CE 的移动面板上运行测试,并使用 Celog Event Tracker 跟踪 CPU 活动。

问题:当 QQuickWindow 发出信号 afterRendering() 和 frameSwapped() 时,我调用 glFinish() 函数。 由于 glFinish() 的工作是等待所有以前的 opengl 命令完成,我知道 CPU 应该只是等待 GPU 完成任务。因此,我希望在那次通话期间 CPU 使用率非常低。 但是,这不是我使用 celog 跟踪器观察到的。我可以观察到,在 glFinish() 时间范围内,属于测试应用程序的一些线程仍在使用 CPU。最后,CPU 使用率与渲染循环的其余部分在同一范围内。

所以我想知道,glFinish() 运行时使用的 CPU 是否有解释?

【问题讨论】:

  • 我不能代表 Windows CE,但我知道使用 AMD 或 nVidia 等 GPU 的普通旧 Windows 上运行的驱动程序是多线程的。它们将在您的进程中生成多个 usermode 线程来处理 OpenGL 的各种事情,例如数据转换、命令调度等。当您不使用线程时,您迟早会在 Windows 上开发时发现这一点。与导致某些 AMD 或 nVidia DLL 崩溃无关:P 你有什么办法知道是哪个 DLL 创建了这些线程吗?
  • 是的,我有关于 Celog 文件的非常详细的信息,我可以看出有问题的线程是在测试应用程序的进程中创建的。更具体地说,测试应用程序创建了 3 个线程,其中只有一个真正处于活动状态。该线程在渲染循环的每一步都使用 cpu,包括这个 glFinish 函数。

标签: c++ qt opengl


【解决方案1】:

OpenGL 采用异步执行模型。 OpenGL 命令在渲染命令管道中排队,并且管道可能根本不会执行,排队的命令处于休眠状态,直到管道执行被glFlush 强制刷新管道或进行同步 OpenGL 调用,这会导致像 glFinish(或 …SwapBuffers)一样的隐式刷新和等待。

因此,如果在调用 glFlush 后 CPU 和 GPU 上的事情变得繁忙,这并不奇怪。

【讨论】:

  • 好的,我知道 GPU 上的事情很忙,因为它必须处理所有排队的 OpenGL 命令。但是CPU在等待GPU时不应该处于空闲状态吗?我的意思是,我认为 OpenGL 命令主要在 GPU 上运行,我错了吗?
猜你喜欢
  • 2013-06-18
  • 2020-08-01
  • 1970-01-01
  • 2020-08-09
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多