gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:21:06 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com