1

私の質問は、openglのゲームループ設計についてです。

ゲームループは3つの主要なステップで吐き出すことができると私は信じています

  1. 入力を受け入れる-ユーザーが画面やシステムアラートなどをクリックした場合に発生する可能性があります。
  2. ロジックを実行する
  3. ビューを更新

簡単にするために、ステップ2と3に焦点を当てましょう。

並行して実行したり、1つのステップに混ぜたりするのは間違っていると思います。例を挙げます。

Latsは、ウォーゲームを作成していて、画面上で戦う100人の兵士を描画する必要があると言います。ロジックは、位置を更新し、背景領域を更新してから、結果を描画する必要があります。別の兵士の位置を更新する前に、1人の兵士の描画を開始することはできません。

したがって、この簡単な手順によれば、手順2と3を何らかの方法で同期する必要があり、手順2は手順3の前に実行する必要があることは明らかです。

では、複数のスレッドと複数のプロセスでゲームループを実行する方法を教えてください。opneglはマルチコアを使用していますか?どのように?

編集:マルチスレッドを使用する1つの方法は、ゲームロジックを事前に計算すること、つまりベクトルを使用することです。ただし、ベクトルには2つの大きな欠点があり、使用することはほとんどお勧めできません。

  1. ベクトルを変更したくない場合もあるので、多くの計算を行い、それらを使用しません。
  2. ほとんどの場合、ゲームループで60 + FPS witch平均16ミリ秒に到達しようとしています。スレッドの切り替えには何らかの同期が必要です。私が見たところ、単純なHandler.post()でさえ、同期はパフォーマンスに悪影響を及ぼします。 android(他のスレッドで実行するためにキューにタスクを追加するだけ)では、最大3ミリ秒(フレームレート時間の18%)かかる場合があるため、計算にそれより長くかかる場合を除いて、実行しないでください。今のところ、それほど時間がかかるものは見つかりませんでした。
4

2 に答える 2

3

次に、複数のスレッドでゲームループを実行する方法を教えてください

マルチコアコンピューティングの考え方は並列化です。つまり、計算量の多いタスクを、並列処理可能な独立したワーキングセットに分割します。あなたが自分自身を知ったように、ゲームには驚くほど並列化の余地がほとんどありません。

ゲームで複数のコアを使用する通常の方法は、I/Oを論理演算と並列化することです。つまり、あるスレッドですべてのネットワーキングとユーザーインタラクションを実行し、別のスレッドでAIとシーン管理を実行します。通常、サウンドも並列化されます。

OpenGLはマルチコアを使用していますか?どのように?

OpenGL仕様はこれを指定していません。ただし、一部の実装では、複数のコアを利用することを選択する場合があります。それは非常にありそうもないですが。なんで?不必要なキャッシュ管理のオーバーヘッドが発生するためです。

于 2012-05-04T09:14:50.427 に答える
2

レンダリング用とロジック用の2つのスレッドがはるかに優れており、不整合が発生しない理由をグラフィカルに説明しようと思います。

提案したシングルスレッド設計は、次のように実行されます。

logic    |-----|     |-----|
graphics       |-----|     |-----| and so forth.

ただし、複数のCPUがあるため、それらを利用する必要があります。つまり、ロジックが最初に終了した後、グラフィックはそのゲームの状態をレンダリングできます。その間、次の論理ステップを計算できます。

logic    |-----||-----||-----|
graphics       |-----||-----|    and so forth.

ご覧のとおり、この方法でパフォーマンスをほぼ2倍にすることができます。もちろん、いくらかのオーバーヘッドがありますが、とにかくシングルスレッドバージョンよりも高速になります。

また、ゲームロジックはレンダースレッドよりも計算にかかる時間が短いと想定できます。これにより、ロジックスレッドでレンダースレッドからのコールバックを待機して、レンダースレッドに新しい命令を与えることができるため、スレッド化が非常に簡単になります。次に、次の論理ステップを計算します。

于 2012-05-04T09:44:40.657 に答える