【问题标题】:Do you have to call glfwSwapInterval(1) in an OpenGL program?你必须在 OpenGL 程序中调用 glfwSwapInterval(1) 吗?
【发布时间】:2020-05-26 13:37:53
【问题描述】:

我运行了我的程序两次。第一次使用 glfwSwapInterval(1) 一切都很好。 第二次没有 glfwSwapInterval(1),它占用了我 100% 的 CPU。

我的问题:这正常吗?我真的必须调用 glfwSwapInterval(1) 才能让我的程序正常运行吗?

代码:

glfwInit();

long window = glfwCreateWindow(1200, 800, "OpenGL", 0, 0);
glfwShowWindow(window);

glfwMakeContextCurrent(window);
GL.createCapabilities();

glClearColor(1, 0, 0, 1);

while (!glfwWindowShouldClose(window)) {
    glfwPollEvents();
    glClear(GL_COLOR_BUFFER_BIT);
    glfwSwapBuffers(window);
}
glfwTerminate();

【问题讨论】:

  • 好吧,您是希望while 循环尽可能快地运行并生成用户永远看不到的帧,还是要确保您生成的每一帧都发送到屏幕上?

标签: c++ opengl glfw


【解决方案1】:

如果您想将渲染循环与显示器的刷新率同步,您必须调用它。默认行为是渲染尽可能多的帧。

【讨论】:

  • 但每当我决定不调用它时。 CPU 使用率跃升至 100%。这正常吗?
  • @TymoTymo 因为你的程序做的很少,而且与刷新率不同步,所以它基本上处于一个硬循环中,不会产生明显的效果。
  • @TymoTymo:“CPU 使用率跃升至 100%。这正常吗?”是的。如果您运行代码,该代码将始终在运行时使用 100% 的某个 CPU 内核,而使用尽可能多的 CPU 时间的唯一方法是调用某个内核函数这最终会导致告诉操作系统调度程序不要调度你的线程——无论是一些显式的睡眠函数,还是其他一些让你的线程进入睡眠状态并在稍后发生某种事件时唤醒它的内核函数。
  • @TymoTymo 如果您不想要垂直同步,但限制 CPU 使用率,您可以在渲染循环中添加 std::this_thread::sleep_for(std::chrono::milliseconds(1000/fps)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多