2

コンポーネント ベースのゲームのバックエンドとして機能する独自のメッセージ バスを C++ で設計しています。メッセージ バスには次の特徴があります。

  • 最初の要素から始まり、最後の要素で終わるまで、頻繁に繰り返されます。
  • ランダムな場所での要素のまれな削除
  • 理論上無限の要素数
  • 理論的に無制限の数のメッセージ タイプ
  • できるだけ速く走る必要がある
  • すべての要素には、メッセージ ハンドラーへのポインターが含まれます。
  • スレッドセーフ

私の質問は:

そのような情報を保存するのに最適なコンテナは何ですか? これは標準の C++ に限定されないため、コンテナーが Windows と Linux 間のクロス プラットフォームである限り、Boost コンテナーを適用できます。

4

2 に答える 2

1

std::list

  • O(1) 反復
  • O(1) の削除 (イテレータがあると仮定)
  • O(1) 挿入

リストの主な欠点は、ランダム アクセスがないことですが、これはメッセージ キューには関係ありません。

于 2013-10-23T19:21:56.337 に答える
0

メッセージ バスは複雑なものであり、バスに接続されている単一のコンポーネントのメッセージ キューの表現に簡単に要約することはできません。
コメントで述べたように、std::queue<MessageType,std::list<MessageType> >スレッド セーフ以外の主なユース ケースを満たす必要がありますが、考慮すべきことが他にもたくさんあります。

スレッド セーフなキュー実装のサンプルを次に示します: STTCLのEventQueue.h。値として配置する場合は、特定のアイテムの操作を含め、ニーズに適合する必要があります。std::queue<__T__,std::list<__T__> >STTCL_DEFAULT_DEQUEIMPL(__T__)find()

アプリケーションのユース ケースに応じて、特定の種類のメッセージの配信と購読について、さまざまなメッセージング パターンから選択する必要があります。
これらのトピックに取り組もうとしていたとき、メッセージング パターンの EAI カタログが非常に役立つことに気付きました。

これに加えて: 常に (常に!!! はい! 3 つの感嘆符)は、トランスポートからメッセージ ペイロードを出発します!!

メッセージング パターンの注目すべきトランスポート システムは0MQで、さまざまな言語のバインディングを提供します。ただし、C++ 実装 (生のソケット ベースの実装または s.th. like を含むboost::asio) で使用できるものもあります。

メッセージ ペイロードの設計に関しては、Google プロトコル バッファが最も便利で、移植性があり、分散システム (組み込みを含む) のすべての要件に対して柔軟であることがわかりました。

于 2013-10-23T20:21:14.753 に答える