【发布时间】: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 函数。