0

ハンドヘルド ハードウェア (Pandora) を対象とした C++ の RTS ゲームに取り組んでいます。参考までに、Pandora には ~600Mhz の単一の ARM プロセッサがあり、Linux を実行します。私たちは優れたメッセージ パッシング システム (内部と外部の両方) に落ち着こうとしていますが、これは私にとって新しい領域です。

私たちが伝えたいメッセージの例を挙げると役立つかもしれません。ユニットは、モデルをメモリにロードするために次の呼び出しを行うことがあります。

sendMessage("model-loader", "load-model", my_model.path, model_id );

その見返りに、ユニットは、特定の model_id のモデル オブジェクトを含むある種のメッセージを期待し、それをグラフィックス システムに渡すことができます。この sendMessage 関数は決して最終的なものではないことに注意してください。メッセージパッシングシステムに関する私の現在の理解を反映しているだけで、おそらく正しくありません:)

私が言えることは、かなり異なる 2 つの選択肢があるということです。1 つは、メッセージをメモリに渡し、外部マシンと対話する必要がある場合にのみネットワークを通過することです。オーバーヘッドが少ないように見えるため、このアイデアは気に入っていますが、ここでの大きな問題は、メッセージ キューでミューテックス ロックを多用する必要があるように思われることです。可能であれば、過剰なロックを避けたいと思います。(アトミック操作に依存してint) ロックせずに単純なキューを実装するいくつかの方法を読みましたが、これらはキューに対して 1 つのリーダーと 1 つのライターしかないことを前提としています。オブジェクトのキューには多くのライターと 1 つのリーダーがあるため、これは特定のケースでは役に立たないようです。

もう 1 つの選択肢は、ネットワーク層を完全に通過することです。これには、非同期メッセージ パッシングをほとんど無料で取得できるなど、いくつかの楽しい利点があります。また、ローカルで渡すのとまったく同じ呼び出しを使用して、メッセージを他のマシンに渡すことができます。ただし、このソリューションは、おそらく私が完全に理解していないため、間違った方法でこすります:)メッセージを送受信するすべてのオブジェクトにソケットが必要ですか? もしそうなら、これは過剰に思えます。特定のゲームには、何千ものオブジェクトがあります。Pandora のようなややパワー不足のデバイスの場合、そのようなネットワークの悪用がボトルネックになるのではないかと心配しています。しかし、私はまだテストを実行していないので、これは単なる憶測です。

MPI はメッセージ パッシングで人気があるようですが、私たちが求めているものにはやり過ぎのように感じます。このコードは、クラスターに触れたり、重い計算を行う必要はありません。

これを達成するためにどのようなオプションがあるかについての洞察をいただければ幸いです。

4

3 に答える 3

2

ネットワークもロックを使用します。OSカーネル内で、見えない場所になります。

私なら、必要に応じて書き換えることができる独自のメッセージ キュー オブジェクトを作成します。シンプルに始めて、必要に応じて改善してください。そうすれば、残りのコードを変更することなく、舞台裏で好きな実装を使用できるようになります。

将来的に実装する可能性のあるいくつかの実装を検討し、それらの条件で実装することにした場合にそれらすべてを効率的に処理できるように API を設計してください。

本当に効率的なメッセージ パッシングが必要な場合は、オープン ソースの L4 マイクロカーネルのいくつかを参照してください。それらの人は、高速なメッセージ パッシングに多くの時間を費やしています。

于 2009-06-16T13:55:40.550 に答える
1

これは小さなプラットフォームなので、両方のアプローチのタイミングを計る価値があるかもしれません。

ただし、なんらかの大きな速度の問題がなければ、コードが簡単なアプローチを常に採用します。受信者がどこにいても同じコードになるため、ネットワークスタックを使用する可能性が高く、相互排除、メッセージバッファリング、割り当てなどを手動でコーディングしてデバッグする必要はありません.

遅すぎることがわかった場合は、後でメモリを使用してローカルのものをいつでも再コーディングできます。しかし、その必要がないのに、前もってそれを行う時間を無駄にする必要はありません。

于 2009-06-16T14:23:58.650 に答える
0

可能な限りメッセージをメモリに渡すという Zan の推奨事項に同意します。

理由の 1 つは、複雑なオブジェクトを C++ にマーシャリングおよびアンマーシャリング (シリアル化および逆シリアル化) しなくても渡すことができることです。

セマフォを使用してメッセージ キューを保護するコストは、ネットワーク コード呼び出しを行うコストよりも低くなる可能性が高くなります。

メッセージキューをロックフリーアルゴリズムで保護すると(自分でほのめかしたようにアトミック操作を使用して)、カーネルに出入りする多くのコンテキストスイッチを回避できます。

于 2009-06-16T14:07:31.120 に答える