GLFW - 不使用循环保持窗口

时间:2014-02-04 19:14:45

标签: c++ opengl sdl glfw

为了保持结果打开(窗口屏幕),我必须执行以下操作:

while (glfwGetWindowParam(GLFW_OPENED))
{
    // do some stuff
    glDrawPixels(...);
    glfwSwapBuffers();
}

但是这会循环通过while循环的主体直到我停止它。我不想实时渲染。

GLFW是否具有与SDL_WaitEvent相同的效果:

SDL_Surface* screen;
// do something with screen
SDL_Flip(screen);

SDL_Event event;
while (SDL_WaitEvent(&event))
{
   // handle input
}

如果我尝试做这样的事情,程序会渲染结果但过了一段时间它会停止响应:

//do stuff
glDrawPixels(...);
glfwSwapBuffers();

while (glfwGetWindowParam(GLFW_OPENED))
{
   if (glfwGetKey(GLFW_KEY_ESC) == GLFW_PRESS)
   {
       glfwTerminate();
   }
}

3 个答案:

答案 0 :(得分:2)

GLFW3有一个glfwWaitEvents可能会做你想要的。

http://www.glfw.org/docs/latest/group__window.html#ga554e37d781f0a997656c26b2c56c835e

答案 1 :(得分:2)

典型的GLFW主应用程序循环可能看起来像这样:

while (!glfwWindowShouldClose(window)) {
  glfwPollEvents();
  update();
  draw();
  glfwSwapBuffers(window);
}
glfwDestroyWindow(window);

输入可以通过回调来处理,例如键盘输入回调。我使用包装类来处理我的GLFW内容,所以在创建窗口之后我会做这样的事情:

glfwSetWindowUserPointer(window, this);
glfwSetKeyCallback(window, glfwKeyCallback);

我的键盘回调看起来像这样:

void glfwKeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) {
  GlfwApp * instance = (GlfwApp *) glfwGetWindowUserPointer(window);
  instance->onKey(key, scancode, action, mods);
}

并且onKey方法的基类实现如下所示:

void GlfwApp::onKey(int key, int scancode, int action, int mods) {
  if (GLFW_PRESS != action) {
    return;
  }
  switch (key) {
  case GLFW_KEY_ESCAPE:
    glfwSetWindowShouldClose(window, 1);
    return;
  }
}

您可以看到整个班级herehere

答案 2 :(得分:0)

我认为您可能希望使用glfwWindowShouldClose()来代替使​​用glfwGetWindowParam()。它接收一个指向GLFW窗口的指针。以下是GLFW文档页面的链接,该页面包含glfwWindowShouldClose()http://www.glfw.org/docs/latest/group__window.html