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

我试图强迫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,而不是仅仅在while循环中烘烤轮胎?我无法想象它完全缺少该功能.

解决方法:

一般来说,您不需要.通常,您的程序实际上在那段时间做了一些事情.如果您无事可做,那么您会花一些时间进行其他流程.如果没有其他进程可运行,则只需吞下它,直到准备就绪即可.

渲染器通常会尝试尽可能快地渲染,因为它们通常将无法超越GPU.大多数游戏就是这样工作的.他们试图尽快执行.如果CPU的速度比预期的要快得多,则它们可能具有计时器来产生一些产量,但通常,它们只是让渲染器运行.

同样,期望sleep_for实际上以毫秒(16-frameTime.count())时间返回也是不合理的.这只是一个最低的估计,而不是要求.

最好改用yield.

上一篇:OpenGL配置GLFW与GLEW的问题


下一篇:OpenGL学习之路(1)——安装