为什么简单的glfw程序会占用所有可用的cpu,即使progam处于空闲状态(根据进程资源管理器)?

ski*_*mon 6 c++ glfw

我有一个非常简单的游戏循环使用GLFW如下(Windows x64发布模式)

我希望程序执行得非常快,但是看起来下面计算的delta总是16.667ms,这似乎是glfw以某种方式限制了我的主循环的速度.这不是问题,因为我不关心超过60hz.但是,进程资源管理器和Windows任务管理器报告我的程序正在使用大部分cpu核心.

特别是吃似乎glfwSwapBuffers()吃了很多cpu,即使我什么也没画.删除该调用会将cpu使用率降低到0.5%.

顺便说一下,我的睡眠功能几乎从未被调用,因为增量总是接近16.6ms.

main ()
{
    double prevTime = glfwGetTime();
    //init glfw ..
    while(!glfwWindowShouldClose(window)) 
    {
        double time0=glfwGetTime();
        double delta = time0- prevTime;

        if (delta >= g_FrameInterval)
        {
            glfwPollEvents();
            prevTime= time0;
            glfwSwapBuffers(window);
        }
        else 
        {
            Sleep(10);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*con 4

glfwSwapBuffers正在等待显示器垂直同步。这就是为什么循环以 60 Hz(即显示器刷新率的频率)运行的原因。至于高 CPU,操作系统可能不会让您的进程进入睡眠状态。这可能会导致它错过垂直同步,因为它无法足够快地唤醒。相反,CPU 会进入繁忙循环,直到垂直同步。这是对该问题的更完整的解释。