2012-04-29 10 views
10

ゲームサーバー用のErlangの可能性を考えています。 (ああ、アーランのエキスパートではなく、ステージを考えているだけです)これは、アクターモデルをゲームシミュレーションに使用することを意味します。もちろん、最も大きな魅力は、並行性が複数のノードに分散していることです。アクターモデルと衝突検出

私の現在の大きな疑問は、衝突検出のようなマルチアクター間のやりとりをどうやって行うべきかということです。 (これは単なる例です)

アクシデントモデルの性質上、衝突検出は基本的には必要ですが、アクターモデルの性質上、衝突が検出されると効率的ではなく、意味をなさないこともあります。すべてのターゲットアクターを更新します。同期を使用すると、Erlangのアクターモデルのすべての利点が無効になります。

もちろん、スペースパーティショニングを正しく使用すると、一度にアクタを対象にすることはできますが、それは単なる最適化であり、主要な答えではありません。または、これはこの質問の正しい答えですか?対話するアクターの数を減らして同期の範囲を狭める?

答えて

9

マップを小さな部分に分割し、それぞれの部分を独自のプロセスにします(各タイルが独自のプロセスであるほど分割することさえできます)。移動しようとするプレイヤーは、そこに行くことを示すメッセージをタイル/サブマップに送り、タイルは大丈夫かどうかを答えます。これは、一度に1つのメッセージのみがタイル/サブマップによって処理されるので、衝突を回避する。複数のサブマップ/タイルが同時にメッセージを処理する可能性があるため、それでもコンカレントプログラムです。

+0

唯一の方法として、インタラクションの範囲を狭くします。ありがとう。 – Eonil

7

私はErlangでサーバーをやっている空間ベースのゲームを持っています。トリックは、各場所/ノード/ etcもアクターであることです。物理を連続的に実行し、定期的に各ゲームエンティティのアクタに情報を送信します。

俳優/エンティティが何であるかをより抽象的に考え始めると、全体的にははるかにクリーンになります。たとえば、衝突は本格的なアクターになることができます。これにより、クライアント側がより簡単になります。グラフィックとサウンドエフェクトを衝突に結びつけます。サーバ側では、2つのエンティティ間の複数の衝突の影響を、指定された時間に複数回防止します。

+0

すべての物理は単一のアクターで行われますか?どのようにして物理学を完成させましたか? – Eonil

+2

はい。私はBulletを使って物理学を走らせています。エンティティアクターは、自分のゲーム状態を追跡し、お互いを撃ったり、動きを決定したりします。彼らは、シミュレーションを実行する場所にコマンドを送信します。場所は継続的に実行され、定期的にエンティティに「あなたはここにいる」と「Xと衝突しました」が送信されます。エンティティは、その場所にもクエリを送信します。 – Nialscorva