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