我有一个模拟,我试图将其转换为“实时”。我说“实时”是因为如果需要可以降低性能(也可以减慢观察者/客户的时间)。但是,如果对象数量很少,我想限制性能,使其以稳定的帧速率(在这种情况下约为 100 FPS)运行。
我分别尝试了 linuxsleep()
和Sleep()
windows,但它似乎不够准确,因为 FPS确实下降到我目标的一小部分。我想这种情况在游戏中很常见,尤其是在线游戏,但我找不到任何关于这个主题的有用材料。帧限制的最佳方式是什么?是否有一种睡眠方法可以保证它不会放弃比指定更多的时间?
注意:我在 2 个不同的集群(linux 和 windows)上运行它,所有节点都只有内置视频。所以我必须在两个平台上实现限制,它不应该是基于视频卡的(如果有的话)。我还需要仅对一个线程/节点实施限制,因为节点之间已经存在同步,如果一个线程受到适当限制,其他节点将自动受到限制。
编辑:一些伪代码显示了我如何实现限流器:
while (ProcessControlMessages())
{
uint64 tStart;
SimulateFrame();
uint64 newT =_context.GetTimeMs64();
if (newT - tStart < DESIRED_FRAME_RATE_DURATION)
this_thread::sleep_for(chrono::milliseconds(DESIRED_FRAME_RATE_DURATION - (newT - tStart)));
}
我还在考虑是否可以每 N 帧进行一次限制,其中 N 是所需帧速率的一小部分。我会试一试并报告。