まあ、私はこの投稿がかなり古いことを知っていますが、私は抵抗できませんでした。
私は最近、ゲームエンジンを構築しました。レンダリングと物理演算に3dパーティライブラリを使用しますが、エンティティとゲームロジックを定義および処理するコア部分を作成しました。
エンジンは確実に従来のアプローチに従います。すべてのエンティティに対して更新関数を呼び出すメイン更新ループがあります。衝突は、エンティティのコールバックによって直接報告されます。エンティティ間の通信は、エンティティ間で交換されるスマートポインターを使用して行われます。
原始的なメッセージシステムがあります。それは、エンティティの小さなグループのみを処理してメッセージをエンジン化します。これらのメッセージは、更新リストを混乱させる可能性があるため、ゲームインタラクションの終了時に処理することが望ましいです(例:エンティティの作成または破棄)。そのため、各ゲームループの終わりに、メッセージの小さなリストが消費されます。
原始的なメッセージシステムにもかかわらず、私はシステムの大部分が「更新ループベース」であると言います。
まあ。このシステムを使用した後、私はそれが非常にシンプルで、高速で、よく組織されていると思います。ゲームロジックは表示され、エンティティ内に自己完結しています。メッセージキューのような動的ではありません。私の意見では、イベントシステムはゲームロジックに不必要な複雑さをもたらし、ゲームコードの理解とデバッグを非常に難しくするので、イベントドリブンにしたくありません。
しかし、私のような純粋な「更新ループベース」システムにもいくつかの問題があると思います。
たとえば、ある瞬間に、あるエンティティが「何もしない」状態になり、プレーヤーが近づいているなどの状況を待っている場合があります。これらのほとんどの場合、エンティティはプロセッサ時間を無駄に消費しないため、エンティティをオフにし、特定のイベントが発生したときにオンにすることをお勧めします。
そのため、次のゲームエンジンでは、別のアプローチを採用します。エンティティは、更新、描画、衝突検出などのエンジン操作のために自身を登録します。これらの各イベントには、実際のエンティティのエンティティインターフェイスのリストが分離されています。