2016-03-19 2 views
2

私はこのパターンを "スマートビルディング"システム設計(STLライブラリを使用)で実装しようとしています。部屋、床などに配置された様々な「センサー」、「コントローラ」(異なる部屋、床などに配置される)によって処理される信号を送出する。私が直面している問題は、イベントへのコントローラのサブスクリプションはイベントベースではなく、ロケーションベースでもあるということです。C++オブザーバパターン:別の次元を追加する

たとえば、コントローラAは、フロア#4の部屋#1からフロア#5のモーション信号に加入できます。フロアベースのサブスクリプションとは、コントローラAが購読しているフロア内のすべての部屋について、適切なセンサが配置されていると仮定して、モーションイベントを取得することを意味します。そのことについては、建物全体での契約もあります。

システムのトポロジは、起動時に構成ファイルから読み込まれるため、建物全体をマップする必要はなく、センサとコントローラを含む関連する場所だけにマップします。

オプション1:地域の名前(Building1、フロア2、ルーム3)とベクトルのインデックスが列挙され、ベクターを含み MonitoredAreaクラスを私は考えることができた何

イベント・タイプベクトルの各メンバーには、このイベントにサブスクライブしているコントローラーのリストが入っています。クラスには親のMonitoredAreaへのポインタも含まれます(フロア内の部屋、建物内のフロアの場合)。

センサークラスはセンサーの名前と共にイベントをセンターハブにディスパッチします。ハブは、センサー名から位置へのマップを介してハブを実行し、一致するMonitoredAreaを取得し、ベクトル内のすべてのコントローラーに警告します。短所

  • イベントが列挙され、ハードMonitoredAreaクラスで符号化されたコントローラに位置の

    • カップリングは、将来のイベントを追加することは困難です。 enter image description here

    オプション2: コントローラクラス内のすべてのサブスクリプションを維持します。短所

    • 非常に効率が悪いです。すべてのイベントは、コントロールセンターがすべてのコントローラを反復して、この特定のイベントに登録されているコントローラを見つけるようにします。

    オプション3: イベントベースの機能。イベントクラス(すなわち、FireEvent)には、(センサーの設定に従って)起こり得るすべての場所と、すべての場所について、その場所に登録されているコントローラのリストが含まれます。短所

    enter image description here

    • マップのマップ
    • 強力なデータ重複
    • 様々なお部屋でのイベントについて、床ベースのサブスクリプションを警告する方法はありません。

    ご覧のとおり、上記の解決策に満足できません。私は、考え過ぎた段階に達したと確信しており、私がこれにどのようにアプローチするかについてのフィードバックや代替提案に満足しています。ありがとう。

  • 答えて

    0

    "Message Bus"と呼ばれるゲーム開発には、デザインパターン(発言の種類)が多用されています。イベントベースの操作を置き換えるために使用されることもあります。

    "メッセージバスは、1つまたは複数の送信者または受信者間の接続です。バストポロジ内のコンピュータ間の接続のように考える:すべてのノードは、バスに渡すことによってメッセージを送信できます。ノードは、そのメッセージを受信するノードが処理され、応答が送信される場合、完全に各受信機自体に任されている場合

    をメッセージ・バスに接続されたモジュールを有する私たちにいくつかの利点を与える:。

    すべてのモジュールが分離されています、 すべてのモジュールがバスに送信されているメッセージに反応する可能性があります。つまり、依存関係をまったく生み出す。 YAGNIワークフローに従う方がはるかに簡単です。たとえば、武器を追加するなどです。最初に物理を実装してから、レンダラにビジュアルを追加してサウンドを再生します。これらの機能はすべて、互いに中断することなく、いつでも独立して実装できます。 あなたは、特定のモジュールを互いにどのように接続するかについて、多くのことを考える必要がありません。時にはそれが図/依存関係のグラフを描画するなど、時間の膨大な量を、かかる「

    出典:。。詳細について http://gameprogrammingpatterns.com/event-queue.html

    http://www.optank.org/2013/04/02/game-development-design-3-message-bus/

    +0

    感謝の質問:どのようにメッセージバスは単純なイベントと異なっていますループ? – susdu

    +0

    あなたの質問を正しく理解しているかどうか分かりませんが、これは型指定された言語のメソッドディスパッチを実装する別の方法です。別のクラスがその特定のIDに興味がある場合(これについてはいくつかの実装があります)、iを処理できますt。通常のメソッド呼び出しメッセージのディスパッチと同じように、オブジェクト間で直接関数呼び出しはありません。 – tritron