3

我正试图强制 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 循环上烤它的轮胎?我无法想象它完全没有这个功能。

4

1 回答 1

3

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

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

此外,期望sleep_for真正milliseconds(16 - frameTime.count())及时返回是不合理的。这只是最低估计,不是要求。

最好改为使用yield它。

于 2013-06-16T23:20:25.133 回答