c++ - OpenGL 程序中奇怪的 CPU 使用率

标签 c++ opengl mfc cpu-usage

在我自己构建的 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/

相关文章:

c++ - uint8_t vector 的内存地址

c++ - 为什么选择转换运算符的这种重载?

opengl - 如何计算网格表面上一致的切向量?

c++ - WM 5.0 和 WM 6.5.3 上的菜单栏 + 命令栏

c++ - 如何复制 CString 功能

c++ - Windows 命令行历史记录

c++ - 无法从文件中读取

c++ - 烟花opengl

c++ - 带有指针 vector 的 glbufferdata C++

c++ - 如何查找窗口的 SW_SHOW/SW_HIDE 状态