5

なぜそうなるのかは理解できますが、それを防ぐ方法についてはまったくわかりません。シナリオは、フレームごとに、あらかじめ定義された特定のピクセルだけ車を動かすというものです。低速または高速のコンピューターを使用すると、何が起こるかというと、1 秒あたりのフレーム数が増減するため、車の動きが遅くなったり速くなったりします。どうすればそれを防げるのかと考えていました。

どのライブラリを使用しても同じ問題が発生するのではないかと思います...そのようなリアルタイムの作業を行うのはこれが初めてです。

4

8 に答える 8

12

あなたの現在のコードはどういうわけかこのように見えると思います

 // to be called every frame
 void OnEveryFrame()
 {
     MoveCar();
     DrawCarToScreen();
 }

しかし、それは次のようになります。

 // to be called - for example - 50 times per second:
 void OnEveryTimerEvent()
 {
     MoveCar();
 }

 // to be called every frame
 void OnEveryFrame()
 {
     LockTimerEvents();
     DrawCarToScreen();
     UnlockAndProcessOutstandingTimerEvents();
 }

もちろん、それに応じたタイマーイベントを設定する必要があります。

于 2010-02-04T16:46:20.963 に答える
10

フレームレートではなく、タイマーに従って車を動かします。つまり、車のモデルは表示表現から独立している必要があります。

于 2010-02-04T16:22:13.780 に答える
3

これは、正確なタイマーとベクトル演算を使用して解決できます。

したがって、議論のために、描画コードを任意の時点で呼び出すことができることを提案しましょう。たとえば、1 秒間隔、3 秒間隔、または 0.02 秒間隔です。

車の移動速度を毎秒 40 ピクセルとします。

したがって、移動する必要があるピクセル数は (TIME_NOW - LAST_FRAME_TIME) * 40px です。

于 2010-02-04T16:27:19.337 に答える
2

フレームレートを 1 秒あたり X フレームに制限する必要があります (60 FPS が最も一般的です)。これは、SFML を含むほとんどのマルチメディア フレームワークで共通の機能です。SFML については、Window/RenderWindow メソッドSetFramerateLimit(unsigned int Limit)を調べます。

于 2010-02-04T16:40:58.593 に答える
2

移動は「実際の」時間遅延によって制限される必要があります。つまり、車はタイム スライスごとに x ピクセルの速度で移動します。

于 2010-02-04T16:23:16.537 に答える
2

リアルタイムクロックを読み取り、経過時間に見合った距離だけ車を動かします。これは、コンピュータが遅すぎる場合、多少「ぎくしゃく」するように見えるかもしれませんが、車の速度は CPU の速度とは無関係になります。

于 2010-02-04T16:23:44.437 に答える
1

timestepを修正する必要があります。基本的に、最後の update 呼び出しから実際に経過した時間に基づいて変化する距離だけ、各フレームで車を動かします。これにより、フレームレートに関係なく正しい速度が得られます。

于 2010-02-05T21:08:22.703 に答える
0

車や図面を移動する前に、時間を節約する必要があります。
すべての計算の後に時間を保存します。
Npixels/秒で車を動かします

于 2010-02-04T16:22:52.717 に答える