ハンドヘルド ハードウェア (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 はメッセージ パッシングで人気があるようですが、私たちが求めているものにはやり過ぎのように感じます。このコードは、クラスターに触れたり、重い計算を行う必要はありません。
これを達成するためにどのようなオプションがあるかについての洞察をいただければ幸いです。