エンティティ コンポーネント システムのメモリ管理を設計する際に問題が発生し、設計の詳細についていくつかの問題が発生しています。これが私がやろうとしていることです(これらのクラスを除くすべてEntity
は実際には仮想であるため、多くの異なる特定の実装があることに注意してください):
Program
クラスには のコンテナがありますEntity
。はProgram
をループし、Entity
それぞれに対して update を呼び出します。また、いくつかSubSystem
の もあり、ループスルーごとに更新されます。
それぞれEntity
に 2 種類の が含まれますComponent
。それらの寿命はエンティティに直接結び付けられているため、それらはすべてunique_ptr
内部で所有されます。メソッドが呼び出されると、 Entity
1 つのタイプUpdateableComponent
が更新されます。Entity.update()
2 番目のタイプSubSystemComponent
は、それぞれの 内から更新されますSubSystem
。
ここに私の2つの問題があります。1 つ目は、一部のComponent
が親の存続期間を制御することEntity
です。これに対する私の現在の考えは、 内の内部フラグを変更するComponent
関数を呼び出すことができるということです。次に、更新のループが終了した後、2 回目のループを実行し、最後の更新中に削除対象としてマークされたそれぞれを削除します。これが効率的かスマートな方法かはわかりませんが、 が更新されている間に死ぬという問題は回避できるはずです。parent.die()
Entity
Program
Entity
Entity
Component
SubSystemComponent
2 つ目の問題は、 内からを参照する方法がわからないことですSubSystem
。それらはunique_ptr
from insideによって参照されるため、 aまたは aEntity
を使用できません。また、コンポーネントの所有者が死ぬと、標準ポインターがぶら下がってしまいます。これらの の内側に切り替えて、 の中で aを使用することもできます。shared_ptr
weak_ptr
Entity
shared_ptr
Entity
weak_ptr
SubSystem
Entity
Component
だから2つのこと:
- 最初のアイデアを有意義な方法で改善できますか?
weak_ptr
で一種の機能を実装する簡単な方法はありますunique_ptr
か、または単に切り替えてshared_ptr
、に複数作成しないようにする必要がshared_ptr
ありSubSystemComponent
ます