1

XNAを使用せずにFarseerPhysicsを使用してC#でゲームを開発しています。world.Step(float dt)フォームを存続させるために、別のスレッドを配置しました(実際、whileループは他のすべての操作をブロックします)。そうですね、ダイナミックなボディであるボールは、CPUの周波数に応じて速くなったり遅くなったりします。CPU周波数を読み取って何かを掛け合わせて計算した遅延時間を考えましThread.Sleep()たが、間違いだと思います。私は少し初心者です。なにか提案を?

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;
    }
}

次に、上記のメソッドを呼び出してから、ループ内でIdleshortを呼び出すことができます。Sleep

Application.Idleまたは、UIスレッドで直接、または他のスレッドにシグナルを送信することにより、イベントハンドラーから呼び出すこともできます。

于 2013-03-06T18:25:30.040 に答える