0

如何在不访问垂直回扫中断的情况下在我的游戏中实现平均 60(或 30)FPS ?(某些驱动程序不提供 vblank 中断。)

我不想浪费 CPU 时间以比显示器显示的速度更快的速度传送帧,但同时我不想让平均帧速率下降到比显示器显示速率低得多,因为这会剥夺玩家的及时反馈。

我正在使用 OpenGL,但是对于 GDI 或几乎任何东西,原理应该是相同的。我主要不关心避免撕裂,而是保持实时控制的错觉,即组合输入和输出滞后低。

我相信这必须有某种标准模式。(定期计时器?睡觉?)我使用的是 Windows(地铁前),但也非常欢迎更通用的想法。

4

1 回答 1

2

您添加的评论更明确地表明您担心撕裂:显然您应该使用在调用时激活的双缓冲,ChoosePixelFormat()但您仍然必须获得正确的时机才能没有撕裂:

  • 在您调用SwapBuffers(). 这给了你 1/60 秒;如果您需要更多,您必须暂时降低到例如 30fps。

  • 您可以立即调用下一个 SwapBuffers,但如果这样做,您将消耗 100% 的 cpu,因为从第 1 点开始,您应该在它之后立即重绘后台缓冲区。为避免这种情况,如果剩余时间足够,您应该尝试睡眠,例如QueryPerformanceCounter/Frequency,用于确定距离下一个 1/60 秒还剩多少时间:如果超过例如 8 毫秒Sleep(1),则忙等待不使帧速率发生变化太多了。

于 2012-10-21T20:49:51.600 回答