2012-05-11 13 views
2

レンダリングシステム、物理シミュレーション、UIの3つのコンポーネントがあります。 UIコードはスクリプトで書かれており、信頼できません。今私は物理シミュレーションの結果をレンダリングシステムに伝える必要があり、正しい設計が不明です。たとえば、新しいシム・データをレンダラーにコピーするだけです。しかし、これは少し浪費のようです。シムのデータを直接操作するレンダラを設定できますが、これはカプセル化に違反するようです。2つのカプセル化されたコンポーネント間の通信

私はこのシステムを何千もの移動ユニットで動作させる予定ですので、パフォーマンスを念頭に置いておくことが重要です。

どのようにカプセル化に違反することなく、あるコンポーネントから別のコンポーネントにデータをすばやく移動できますか?

+0

あなたはconstとしてデータを提示できませんでしたか? 'sim.cdata()'かそれとも何か? – 111111

+0

以下を実行してみませんか:simデータに安定したインターフェイスを定義して、レンダラーにインターフェイスのみを取得させますか?シムの実装の詳細は、このように隠されるでしょう。 – Vlad

+0

@Vlad:もちろん。それは全体ではなく、部分的なカプセル化に過ぎません...しかし、私はそれが生きるだろうと思います。それを回答として投稿することを検討してください。 – Puppy

答えて

0

おそらく、レンダリング担当者が、レンダリングに必要なデータを保持するためにオブジェクトを割り当てるようにします。これらのオブジェクトは、レンダラーがジョブを実行するのに十分な可視インターフェースを定義しますが、そうでなければ不透明です。オブジェクト自体はレンダラーによって割り当てられ/所有されていても、オブジェクト自体はほとんど不透明な型です。

シミュレータは、少なくともパブリックインターフェイスで示されるより多くの知識が必要な場合は、それらのオブジェクトの内部の知識を所有します。レンダラが基本的にそれらからデータを読み込む場合、シミュレータはそのステート/ライトデータを変更できます。

これを実装する1つの方法は、「go-between」オブジェクトに複数の継承を使用することです。親の1つは、レンダラーが使用するための限定された公開インターフェースを提供し、もう1つは、シミュレーターで使用するためのより包括的なインターフェースを提供します。

もちろん、C++自体によって提供される保護機能を備えた本質的なものと同じように、これは基本的に意図的な破壊ではなく、事故からの保護です。私は、レンダラに対するあなたの信頼の欠如が、基本的にセキュリティを破壊しようとするかもしれないレンダラではなく、起こりうるバグからの保護であると仮定しています。後者から保護する必要がある場合は、シミュレータやレンダラなどのOSレベルのメカニズムを少なくとも別々のプロセスに使用する必要があります。それらの間にある種のIPCがあります(もちろん、ほとんど必然的にかなりのオーバーヘッドが追加されます)。

関連する問題