Visual C++ 2008 Express と Ogre3D SDK を使用してゲームをプログラミングしています。
私のコア ゲームプレイ ロジックは、1 秒あたり 100 回実行するように設計されています。簡単にするために、'gamelogic()' というメソッドとします。これは時間ベースではないため、ゲーム時間を 1 秒「進める」には、「gamelogic()」を 100 回呼び出す必要があります。「gamelogic()」は、ゲームの画面レンダリングに比べて軽量です。
Ogre には、フレームを描画しようとしているときとフレームの描画を終了したときにコードに通知する「リスナー」ロジックがあります。フレーム レンダリングの直前に「gamelogic()」を呼び出すと、ゲームプレイは画面のレンダリング速度に大きく影響され、5 fps から 120 fps まで変化する可能性があります。
頭に浮かぶ簡単な解決策は次のとおりです。最後にレンダリングされたフレームからの経過時間を計算し、次のフレームの前に「gamelogic()」をこの回数だけ呼び出します: 100 * timeElapsedInSeconds
ただし、それを行う「正しい」方法はマルチスレッドを使用することだと私は主張します。「gamelogic()」を毎秒 100 回実行する別のスレッドがあります。
問題は、これをどのように達成するか、および 2 つの別々のスレッド間で競合が発生した場合に何ができるかです。Ogre が同時に画面をレンダリングしている間にゲームロジックが画面コンテンツ (3D オブジェクト座標) を変更します。
よろしくお願いします。