在我自己构建的 MFC 程序中,我遇到了一些奇怪的 CPU 使用问题。
我加载了大约 360k 点的点云,一切正常(我使用 VBO 缓冲区,这是我理解的方法吗?)。我可以随心所欲地移动它并且没有发现任何不利影响(CPU 使用率非常低,GPU 完成所有工作)。但是在某些角度和缩放值下,我看到我的一个处理器出现了 CPU 峰值!然后我可以改变角度或稍微缩放,它会再次下降到 0 左右。这在大窗口中比在小窗口中更有可能发生。
我测量了程序的 FPS,它一直保持在 65,但是当 CPU 峰值出现时,它通常下降大约 10 个单位到 55。我还测量了 SwapBuffers 所花费的时间,在正常操作期间它大约为 0-1 毫秒。一旦 CPU 达到峰值,它就会上升到 20 毫秒左右,所以很明显,在该函数中突然变得很难计算(我猜是对于 GPU?)。这个东西不在 DrawScene 函数中(这是人们期望在糟糕的实现中占用 CPU 的函数),所以我有点不知所措。
我知道这不是因为可见点的数量,因为这可能只发生在数据的一个子部分上,也可能发生在整个云上。我试着四处移动它,看看它是否与深度缓冲区、剪裁或类似的东西有关,但似乎完全是随机的角度造成了问题。虽然它看起来确实有点可重复;将模型移动到曾经滞后的位置,再次移动到那里时也会滞后。
我是 OpenGL 的新手,所以我犯了一些非常明显的错误并非不可能。
这是渲染循环的样子(它通过 1 毫秒周期的计时器事件在 MFC 应用程序中运行):
// Clear color and depth buffer bits
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Draw OpenGL scene
OGLDrawScene();
unsigned int time1 = timeGetTime();
// Swap buffers
SwapBuffers(hdc);
// Calculate execution time for SwapBuffers
m_time = timeGetTime() - time1;
// Calculate FPS
++m_cnt;
if (timeGetTime() - m_lastTime > 1000)
{
m_fps = m_cnt;
m_cnt = 0;
m_lastTime = timeGetTime();
}
最佳答案
我注意到(至少在不久前),ATI 驱动程序倾向于过于积极地旋转等待,而 NVidia 驱动程序则倾向于中断驱动。假设您没有更好的事情可做,从技术上讲,自旋等待更快。不幸的是,今天您可能在另一个线程上有更好的事情要做。
我认为 OP 的显示驱动程序可能确实在等待旋转。
关于c++ - OpenGL 程序中奇怪的 CPU 使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5822064/