我正在开发一个支持多个操作系统和图形后端的图形应用程序。该窗口是使用GLFW创建的,并且在运行时选择了图形API。在Windows上运行该程序并使用OpenGL时,Vsync似乎已损坏。帧速率锁定为60 fps,但是会出现屏幕撕裂现象。根据GLFW文档,glfwSwapInterval(0);
应该从使用VSync的默认值解锁帧速率。那按预期工作。使用glfwSwapInterval(1);
应该将帧速率锁定为与监视器的刷新速率匹配。默认情况下,完全不调用glfwSwapInterval();
应该使用VSync。在使用这些调用正确锁定/解锁帧频的同时,我经历了非常有趣的行为。
完全不调用glfwSwapInterval();
时,将VSync设置为默认值。但是等待下一个帧发生在第一个抽奖电话中!有人会认为下一帧的延迟会发生在glfwSwapBuffers()
。没有屏幕伪像可见。
调用glfwSwapInterval(1);
时,将设置Vsync,下一帧的延迟发生在glfwSwapBuffers()
!很好,但是,当明确设置VSync时,会出现屏幕撕裂痕迹。
现在,不通过使用VSync调用glfwSwapInterval()
似乎是一个棘手的解决方案,但是:
- 如果没有窗口重构,用户将无法禁用VSync,
- 由于VSync等待时间在那里发生,探查器识别出第一次绘制调用的时间太长。
我尝试摆弄GPU驱动程序设置并在多台机器上测试代码。如果使用Windows和OpenGL,该问题将在整个计算机上持续存在。
如果任何人都可以理解这一点,请分享,或者如果我误解了一些东西,我将不胜感激一些朝着正确方向提出的指示。
编辑: 其他一些细节:撕裂发生在特定的水平线上。框架的其余部分似乎正常工作。
经过更多测试之后,似乎一切都在集成图形上按预期工作。如果我错了,请纠正我,但看起来像是图形驱动程序问题。