Visual C++ 2008 ExpressとOgre3D SDKを使用してゲームをプログラミングしています。ゲームプレイロジックへの非同期画面更新、C++
私のコアゲームプレイロジックは100回/秒で動作するように設計されています。簡単にするために、私はそれを 'gamelogic()'と呼ばれる方法と言います。時間ベースではありません。つまり、ゲーム時間を1秒進めるには、gamelogic()を100回呼び出す必要があります。 'gamelogic()'は、ゲームのスクリーンレンダリングと比較して軽量です。
Ogreには、フレームを描画しようとしているときと、フレームの描画が終了したときにコードに通知する「リスナー」ロジックがあります。フレームレンダリングの直前に 'gamelogic()'を呼び出すと、ゲームプレイは画面のレンダリング速度に大きく影響されますが、これは5fpsから120fpsまで変化する可能性があります。
頭に浮かぶ簡単な解決策は以下のとおりです。「)gamelogic(」最後にレンダリングされたフレームからの経過時間を計算し、呼び出して、次のフレームの前に、この何倍:100 * timeElapsedInSeconds
はしかし、私は "というpressumeそれを行うための正しい方法はマルチスレッドです。 gamelogic()を100回/秒実行する別のスレッドがあります。
2つの別々のスレッド間で競合が発生した場合、これをどのように達成できますか:オーガが画面を同時にレンダリングしている間にガメロジックな画面コンテンツ(3Dオブジェクト座標)を変更します。
事前に感謝します。
ゲームは固定レンダリング率の前提から、しばらく前にフレームを追跡することに切り替えられました。以前はプロセッサが8 Hzで動作していることに頼っていました。彼らは16Hzマシンが出てくると、16Hzから8Hzにプロセッサーを切り替えるための「ターボボタン」が含まれているので、ゲームはまだ正しい速度で動いていました。楽しい事実。 – Kieveli
本当に!古いゲームが新しいマシンで許容できるフレームレートで動作するように、あなたのプロセッサを「減速」するよう書かれた小さなアプリもありました。一つは "MOslo"と呼ばれていたと思います。私が持っていた古いコンピュータのすべてで私の古いUltimaゲームが速すぎることを覚えています。 – Mark
ターボ・パスカル・ランタイムでは、高速なマシンで実行しているときに整数オーバーフローが発生し、すべてがクラッシュすることがあります。 – tstenner