我正在使用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;
}
答案 0 :(得分:10)
无论窗口的最小化状态是什么,都会执行渲染循环。
如果要停止渲染,则需要稍微调整应用程序逻辑以跟踪窗口所处的状态.GLFW支持用户定义的回调,用于glfwSetWindowIconifyCallback()
因此,当窗口最小化或恢复时,您的应用程序会被注意到。您可以决定停止渲染循环,并且可以使用glfwWaitEvents()
等待某些事情发生(例如正在恢复的窗口),而不使用所有可用的CPU时间。
答案 1 :(得分:2)
也许开始做点什么?
或者使用&#34; glfwWaitEvents();&#34;而不是&#34; glfwPollEvents();&#34;在没有新事件时阻止。
答案 2 :(得分:2)
如果窗口对用户不可见(例如,前面有另一个窗口),则NSOpenGLContext :: flushBuffer是非阻塞的。 由于glfwSwapBuffers只调用此函数,因此在这种情况下它变为非阻塞。 在这种情况下,除了使用Core Video display link之外,我不确定我们有什么选择可以避免消耗100%的CPU。
从这里开始:https://github.com/glfw/glfw/issues/680
当窗口被遮挡时,OS X忽略NSOpenGL交换间隔。没有其他操作系统这样做。 我将在某个时候用显示链接来解决这个问题。如果这不起作用,我认为GLFW无法做任何事情。