如何在没有访问垂直回扫中断的情况下在游戏中获得60,(或30)FPS的平均值? (某些驱动程序不提供vblank中断。)
我不想浪费CPU时间比显示器可以显示的帧速度更快,但同时我不想让平均帧速率下降远低于显示器显示速率,因为那样剥夺玩家及时反馈。
我正在使用OpenGL,但GDI的原则应该是相同的,或者几乎任何东西。 我主要不关心避免撕裂,而是保持realtime control的错觉,即输入和输出的组合延迟较低。
我确信必须有某种标准模式。 (定期计时器?睡觉?)我正在使用Windows(pre-Metro),但也非常欢迎更多通用的想法。
答案 0 :(得分:2)
你添加的评论更明确表示你担心撕裂:显然你应该使用双重缓冲,当你拨打ChoosePixelFormat()
时你会激活,但是你仍然必须让时机没有撕裂: / p>
在致电SwapBuffers()
后立即重绘。这给你1/60秒;如果你需要更多,你必须暂时降到例如30fps。
你可以立即调用下一个SwapBuffers,但如果你这样做,你会消耗100%的cpu,因为从第1点起你应该立即重新绘制后备缓冲区。为避免这种情况,如果有足够的时间,你应该尝试进入睡眠状态,例如使用QueryPerformanceCounter/Frequency
来确定在下一个1/60秒之前剩余的时间:如果它超过例如8毫秒然后Sleep(1)
,否则忙 - 等待不要使帧率变化太大。