title: 100% CPU utilization when using vsync (OpenGL)
body: <p>Here is a very simple test program. When vsync is disabled this program runs at 100FPS and uses up virtually 0% of the CPU. When I enable vsync, I get 60FPS and 25% (100% of one core on a 4 core system) CPU utilization. This is using a Nvidia GPU. Searching online lead me to the suggestion to disable "multithreaded optimization" inside of Nvidia control panel. This does decrease the CPU utilization, but only to 10%. Furthermore, if I remove the call to sleep after SwapBuffers, I get 25% utilization again even with multithreaded optimization disabled. Can anyone shed some light on this? Am I doing something wrong? Is Nvidia's OpenGL implementation just hopelessly flawed?</p>
  
  <pre><code>#include &lt;GLFW/glfw3.h&gt;
  #include &lt;thread&gt;
  #include &lt;cstdlib&gt;
  #include &lt;cstdio&gt;
  
  int main(int argc, char *argv[])
  {
      if(!glfwInit())
          exit(EXIT_FAILURE);
  
      glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
  
      GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL Vsync Test", nullptr, nullptr);
  
      if(!window)
      {
          glfwTerminate();
          exit(EXIT_FAILURE);
      }
  
      glfwMakeContextCurrent(window);
  
  #ifdef USE_VSYNC
      glfwSwapInterval(1);
  #else
      glfwSwapInterval(0);
  #endif
  
      glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
  
      double lastTime = glfwGetTime();
      double nbFrames = 0;
  
      while(!glfwWindowShouldClose(window))
      {
          double currentTime = glfwGetTime();
          nbFrames++;
          if (currentTime - lastTime &gt;= 1.0)
          {
              char cbuffer[50];
              snprintf(cbuffer, sizeof(cbuffer), "OpenGL Vsync Test [%.1f fps, %.3f ms]", nbFrames, 1000.0 / nbFrames);
              glfwSetWindowTitle(window, cbuffer);
              nbFrames = 0;
              lastTime++;
          }
          glClear(GL_COLOR_BUFFER_BIT);
          glfwSwapBuffers(window);
          glfwPollEvents();
              //limit to 100FPS for when vsync is disabled
          std::chrono::milliseconds dura(10);
          std::this_thread::sleep_for(dura);
      }
  
      glfwDestroyWindow(window);
      glfwTerminate();
      exit(EXIT_SUCCESS);
  }
  </code></pre>