1

フレームモデルとその中にたくさんのコンポーネントがあります。ほぼ各フレームUpdate()で、ほぼ各コンポーネントの関数がフレーム モデル コントローラーによって呼び出されます (たとえば、Unity3d など、発生するすべての処理は 1 つのスレッドで行われます)。一部のプロパティ (位置など) を変更するコンポーネントがあり、その事実について他のコンポーネント (ミサイルなど)"Targets"を高くしたいと考えています。"Consumers"

通常の C# イベント モデルを使用してイベントを「発生させる」"Targets"と、非常に長いUpdate呼び出しが発生します。すべてのフレーム ベースのアプリをフリーズできるもの。そのため、C# イベントを思うように使用することはできません。

何をしたか: コンポーネントごとに、すべての新しいデータを List にプッシュするアクションでイベント"Consumer"をサブスクライブし、 Update 呼び出しで新しいデータのリストを反復処理して更新します。"Targets""Component"

したがって、私の質問は次のとおりです。そのようなアプローチを一般化する方法はありますか (たとえば、ターゲットがミサイルに影響を与えるだけでなく、"winds"独自の着信データ (方向や温度など) も使用する場合など)、コードを見栄えよくする方法はありますか?

フレームモデルでイベントを送信するより正しい方法はありますか?

4

1 に答える 1

1

私の理解が正しければ、あなたは現在、変更されたオブザーバー パターンを使用しています。Targets次に、変更またはパブリッシャーを観察する対象です。通知メソッド、サブスクライバーを宣言するObserverConsumerインターフェースです。オブザーバー機能を別のクラスに抽出すると、他のクラスがそれから恩恵を受けることができます。

// info to send to all active missiles
public class MissileInfoMessage { }

// all missile classes should implement:
public interface MissileInfoSubscriber {
    void Notify (MissileInfoMessage msg);
}

public class MissileInfoBroker {
    List<MissileInfoSubscriber> missileInfoSubscribers;
    // targets, winds, airplanes calls this to get all missiles notified
    public void NotifyMissiles (MissileInfoMessage msg) {
        foreach (MissileInfoSubscriber missile in missileInfoSubscribers) {
            missile.Notify (msg);
        }
    }
    // missiles register when they got fired
    public void Register (MissileInfoSubscriber s) {
        missileInfoSubscribers.Add (s);
    }
    // and deregister if their job is done
    public void Unregister (MissileInfoSubscriber s) {
        missileInfoSubscribers.Remove (s);
    }
}
于 2012-08-17T08:34:06.967 に答える