質問

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

渡したいメッセージの例を挙げると役立つ場合があります。ユニットはこの呼び出しを行って、モデルをメモリにロードできます。

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

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

私が知ることができるものから、2つのかなり明確な選択肢があります。 1つは、メモリ内のメッセージを渡すことであり、外部マシンと通信する必要がある場合にのみネットワークを通過します。オーバーヘッドが低いように見えるのでこのアイデアが好きですが、ここでの大きな問題は、メッセージキューで相互排他ロックを広範囲に使用する必要があるようです。可能であれば、過剰なロックを避けたいと思います。 (アトミックな int 操作に依存することにより)ロックせずに単純なキューを実装するいくつかの方法を読みましたが、これらはキューに対して1つのリーダーと1つのライターのみが存在することを前提としています。オブジェクトのキューには多数のライターと1人のリーダーが含まれるため、これは特定のケースには有用ではないようです。

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

MPIはメッセージの受け渡しで人気があるように見えますが、私たちが望むものはやり過ぎのように感じます。このコードは決してクラスターに触れたり、重い計算を行う必要はありません。

これを達成するために私たちが持っているオプションについての洞察は大歓迎です。

役に立ちましたか?

解決

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

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

将来的に実行する可能性のあるいくつかの可能な実装を確認し、それらの用語で実装することにした場合にすべてを効率的に処理できるようにAPIを設計します。

本当に効率的なメッセージの受け渡しが必要な場合は、オープンソースのL4マイクロカーネルの一部をご覧ください。それらの人は、高速のメッセージパッシングに多くの時間を費やしました。

他のヒント

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

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

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

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

1つの理由は、複雑なオブジェクトをマーシャリングおよびアンマーシャリング(シリアライズおよびデシリアライズ)する必要なくC ++に渡すことができることです。

セマフォでメッセージキューを保護するコストは、ほとんどの場合、ネットワークコード呼び出しを行うコストよりも低くなります。

何らかのロックフリーアルゴリズムを使用してメッセージキューを保護すると(あなたが暗示しているようにアトミック操作を使用して)、カーネルへのコンテキストの切り替えを回避できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top