c++ - GLFW - 在不使用循环的情况下保持窗口

标签 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();
   }
}

最佳答案

典型的 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 .

关于c++ - GLFW - 在不使用循环的情况下保持窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21561334/

相关文章:

c++ - 是否保证 union 与 boost::hana::Structure 一起工作?

opengl - 如何从 OpenGL 顶点缓冲区对象中的坐标中分割值

C++ OpenGL - 叠加示例

c++ - 当前版本的 mingw64 是否与 SDL 库不兼容?以前没有的编译器错误

audio - 音频卷积输出比输入长,当将数据反馈到固定长度的流时,如何解决此问题?

c++ - ActiveMQ-CPP 和 Visual Studio 2003

c++ - 可变参数模板,获取函数参数值

c++ - 从 C++ 中的任何类型的文件中读取字节及其十进制值

opengl - OpenCL 或 OpenGL – 使用哪一个?

c++ - 简单地包含 SDL header 会导致链接器错误