GLFW 3.0 / C ++中的空闲线程时间

时间:2013-06-16 23:10:06

标签: c++ linux opengl glfw

我正试图强迫GLFW 3.0停止对我的CPU进行核对,然后继续将其作为一个框架来促进学习API。我从http://www.glfw.org/documentation.html中取了示例,开始寻找限制它的方法。

目前,我的工作是:

#include <iostream>
#include <chrono>
#include <thread>
#include <GLFW/glfw3.h>

int main(void)
{
    typedef std::chrono::high_resolution_clock Clock;
    typedef std::chrono::milliseconds milliseconds;

    Clock::time_point currentTime, newTime;
    milliseconds frameTime;

    GLFWwindow* window;

    if (!glfwInit())
        return -1;

    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    glfwMakeContextCurrent(window);

    while (!glfwWindowShouldClose(window))
    {
        currentTime = Clock::now();

        glfwSwapBuffers(window);

        glfwPollEvents();

        newTime = Clock::now();

        frameTime = std::chrono::duration_cast<milliseconds>(newTime - currentTime);

        if(frameTime.count() < 16)
            std::this_thread::sleep_for(milliseconds(16 - frameTime.count()));

        std::cout << "Frame time: " << frameTime.count() << "ms" << std::endl;
}

glfwTerminate();
return 0;

}

由于GLFW已将自己限制在60fps,我认为这可行。实际上,它在主循环运行时将CPU使用量减半。这可能现在已经足够好了,但我真正想知道的是:

如何让GLFW等待信号并释放CPU而不是仅仅在一个循环中烘烤轮胎?我无法想象它完全没有这个功能。

1 个答案:

答案 0 :(得分:3)

一般来说,你没有。通常,你的程序实际上是在那个时候做的。如果您没有要做的事情,那么您可以为其他流程留出一些时间。如果没有其他进程可供运行,您只需将其吞下去,直到您准备好去。

渲染器通常会尝试尽可能快地渲染,因为它们通常无法超越GPU。这就是大多数游戏的运作方式;他们试图尽快执行。如果CPU比他们预期的要快得多,他们可能会有定时器做一些让步,但更多时候,他们只是让渲染器运行。

此外,期望sleep_formilliseconds(16 - frameTime.count())时间内实际返回是不合理的。这只是最低估计,而非要求。

最好使用yield代替。