当GLFW / OpenGL窗口不可见时,CPU使用率很高

时间:2014-05-08 19:03:31

标签: c opengl 3d glfw

我正在使用GLFW,因此请使用OpenGL设置一个Window。由于我刚刚开始学习OpenGL及其周围的所有内容,这可能听起来像一个愚蠢的问题,但为什么GLFW的示例程序在Window未被主动显示时使用接近100%的CPU(最小化或隐藏另一个窗口)?

以下是GLFW的例子,我在Mac OS上使用Xcode运行它:

#include <GLFW/glfw3.h>
int main(void)
{
    GLFWwindow* window;

    if (!glfwInit())  /* Initialize the library */
        return -1;

/* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    if (!window)
    {
       glfwTerminate();
        return -1;
    }

/* Make the window's context current */
    glfwMakeContextCurrent(window);

/* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window))
    {
        /* Render here */

        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

3 个答案:

答案 0 :(得分:10)

无论窗口的最小化状态是什么,都会执行渲染循环。

如果要停止渲染,则需要稍微调整应用程序逻辑以跟踪窗口所处的状态.GLFW支持用户定义的回调,用于glfwSetWindowIconifyCallback() 因此,当窗口最小化或恢复时,您的应用程序会被注意到。您可以决定停止渲染循环,并且可以使用glfwWaitEvents()等待某些事情发生(例如正在恢复的窗口),而不使用所有可用的CPU时间。

答案 1 :(得分:2)

也许开始做点什么?

或者使用&#34; glfwWaitEvents();&#34;而不是&#34; glfwPollEvents();&#34;在没有新事件时阻止。

文档在第一步说明:http://www.glfw.org/docs/latest/quick.html

答案 2 :(得分:2)

如果窗口对用户不可见(例如,前面有另一个窗口),则NSOpenGLContext :: flushBuffer是非阻塞的。 由于glfwSwapBuffers只调用此函数,因此在这种情况下它变为非阻塞。 在这种情况下,除了使用Core Video display link之外,我不确定我们有什么选择可以避免消耗100%的CPU。

从这里开始:https://github.com/glfw/glfw/issues/680

  

当窗口被遮挡时,OS X忽略NSOpenGL交换间隔。没有其他操作系统这样做。   我将在某个时候用显示链接来解决这个问题。如果这不起作用,我认为GLFW无法做任何事情。