3

ゲーム内のオブジェクトの動きが途切れるという問題が発生しています。

フレーム レートが制限されていない場合、ゲームはスムーズに実行されます。

フレーム レートを 60 fps に制限すると、動きが途切れ途切れになります。

オブジェクトの動きはこんな感じ…

m_distance += m_speed * GetFrameTime()

速度は 1 秒あたりのピクセル数で、GetFrameTime() は最後のフレームからの経過時間を返します。オブジェクトは x 方向と y 方向にのみ移動することに注意してください。

私はSFMLを使用しており、関数SetFramerateLimit(60)UseVerticalSync(true). 途切れ途切れの動きの問題に対処しようとしているときに、XNA 開発者からの記事を読みました。1 回更新して 1 回レンダリングし、ゲーム ループの残り時間がフレーム レート (つまり 1/60) 未満の場合は、残りの期間は寝ます。これらの機能を無効にしてその動作を記述したところ、同じ症状が発生したため、これが SFML の動作だと思います。

今、私は上記のアプローチが悪いことだと言っているのではありません。実際、アプリケーションが不必要な作業を行っていない点が気に入っています (フレーム制限を設定してアプリケーションを実行する場合とフレーム制限を設定しないでアプリケーションを実行する場合では、リソースの使用量に顕著な違いがあります)。しかし、なぜ動きが途切れ途切れなのか、私にはよくわかりません。gafferongames の記事を読みましたが、ここには当てはまらないようです。

任意の支援をいただければ幸いです。

編集:問題を特定しましたが、解決方法がわかりません。

オブジェクトが「ジャンプ」するフレームでは、m_distance は他のフレームの距離よりも大幅に大きくなります。よく調べてみると、GetFrameTime() もフレーム間の以前の時間よりも大幅に大きくなっています (有意差は 2 ~ 3 ミリ秒のようです)。

Edit2: http://gafferongames.com/game-physics/fix-your-timestep/のおかげで解決策を思いついたと思います。GetFrameTime を使用する代わりに、固定のデルタ時間を設定します。

4

1 に答える 1

1

これまでに使用する唯一の理由:

m_distance += m_speed * GetFrameTime();

フレームに依存しない動きを取得しようとしている場合です。この場合、FPS を制限する理由はありません。

SFML が実装するような FPS キャップがある場合、フレームごとの動きを一定に保つことをお勧めします。つまり、次のようなものです。

m_distance += m_speed;
于 2011-03-18T21:33:42.577 に答える