1

我正在用没有 XNA 的 Farseer Physics 用 C# 开发游戏。我放入world.Step(float dt)了一个单独的线程以使表单保持活动状态(实际上,while 循环会阻塞所有其他操作)。好吧,我认为球,一个动态的物体,运行得更快或更慢取决于 CPU 频率。我考虑过Thread.Sleep()通过读取 CPU 频率并将其乘以某种东西来计算延迟时间,但我很确定我错了。我是个小菜鸟。有什么建议吗?

4

1 回答 1

1

Thread.Sleep这不是一种准确的计时方法。你想使用类似的东西:

Stopwatch timer = new Stopwatch();
timer.Start();

然后您可以使用它来驱动定时更新循环,如下所示:

// Run enough updates to catch up to the current time
private void Idle()
{
    double time = timer.Elapsed.TotalSeconds;
    accumulatedTime += (time - lastTime);
    lastTime = time;

    const double frameTime = 1.0/60.0; // 60 frames per second
    while(accumulatedTime > frameTime)
    {
        world.Step((float)frameTime);
        accumulatedTime -= frameTime;
    }
}

然后,您可以在循环中调用上述Idle方法,然后调用一个短路Sleep

或者您可以直接从事件处理程序调用它Application.Idle- 直接在 UI 线程上,或通过向您的其他线程发出信号。

于 2013-03-06T18:25:30.040 回答