0

以下のコードで何が問題なのか誰でも見つけられますか? 前の TIME_STEPS フレーム数のフレーム間隔 (dt) を平均化することになっています。

私は Box2d と cocos2d を使用していますが、cocos2d ビットはあまり関係がないと思います。

-(void) update: (ccTime) dt
{
    float32 timeStep;
    const int32 velocityIterations = 8;
    const int32 positionIterations = 3;

    // Average the previous TIME_STEPS time steps

    for (int i = 0; i < TIME_STEPS; i++)
    {
        timeStep += previous_time_steps[i];
    }

    timeStep = timeStep/TIME_STEPS;

    // step the world
    [GB2Engine sharedInstance].world->Step(timeStep, velocityIterations, positionIterations);

    for (int i = 0; i < TIME_STEPS - 1; i++)
    {
        previous_time_steps[i] = previous_time_steps[i+1];
    }

    previous_time_steps[TIME_STEPS - 1] = dt;
}

previous_time_steps 配列には、アニメーション間隔が設定されているものも最初に入力されます。

これも私が期待することをしません。フレーム レートが低いデバイスではシミュレーションが高速になり、フレーム レートが高いデバイスでは遅くなります。私が見過ごしているのは愚かなことだと確信しています。

box2D が一定時間のステップで動作することを好むことは知っていますが、実際には選択の余地がありません。私のゲームはさまざまなデバイスで非常に変動するフレーム レートで実行されるため、一定の時間停止は機能しません。ゲームは平均 40 fps で実行されますが、第 1 世代の iPad などの一部の粗末なデバイスでは、1 秒あたりわずか 30 フレームで実行されます。第 3 世代の iPad は、毎秒 50/60 フレームで動作します。

この問題に対処する他の方法についても提案を受け付けています。アドバイスをいただければ幸いです。

誰かが何らかの洞察を持っている可能性があることに注意する必要があるその他の珍しいことは、ビルドでデバッグの最適化を実行すると、上記に大きな影響を与えるという事実です。デバッグ最適化が -Os 対 -O0 に設定されている場合、フレーム レートはあまり変化しません。しかし、デビューの最適化が -Os に設定されている場合、上記のコードがアクティブな場合、物理シミュレーションは -O0 よりもはるかに高速に実行されます。上記のコードの代わりに間隔として dt を使用した場合、デバッグの最適化に違いはありません。

私はそれで完全に混乱しています。

4

1 に答える 1

1

フレーム レートが低いデバイスではシミュレーションが高速になり、フレーム レートが高いデバイスでは遅くなります。

それが、可変時間ステップを使用することのすべてです。10 fps しか得られない場合、デルタ時間が大きくなるため、物理エンジンはワールドをより速く反復します。

PS: このようなパフォーマンス テストを行う場合は、リリース ビルドで実行してください。これにより、(ほとんどの) ロギングが無効になり、コードの最適化が有効になります。古いデバイスでコードをデバッグすると、パフォーマンスに大きな影響を与える可能性があります。

また、TIME_STEPS の値は? 10 を超えてはならず、せいぜい 20 です。平均化に代わる方法は、デルタ時間を直接使用することですが、デルタ時間が特定のしきい値 (30 fps) よりも大きい場合は、固定デルタ時間を使用するように切り替えます (上限を設定します)。30 fps 未満の可変時間ステップは非常に見苦しくなる可能性があるため、このような場合はフレームレートに合わせて物理エンジンを遅くできるようにすることをお勧めします。

于 2012-08-09T20:58:29.047 に答える