言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

NICT デモ実装メモ

先日のデモでは Croquet を大幅に改造した P2P 通信を使ったわけですが、どんな実装になってるかを少しだけ書きます。とはいっても殆ど一日で書き下した物なのでお恥ずかしいくらい単純です。単純じゃないと動かなかったので仕方無いです。

実現された中身はこんな感じ。世界の中に7つの場所があって(直前に6つに減らされました)、それぞれの場所がそれぞれの物理的なホストと対応しています。世界には「ちびロボ」と呼ばれるキャラクタが居て、ユーザはちびロボを呼んだり頼んだり追いかけたりするわけです。ホストは7つあるのにちぼロボは一体なのでたまに取り合いになります。

Croquet 的なプログラミングと言うのは、例えばキャラをある座標に動かすという式を "meta" とマークすると、勝手に全ホストにその操作が配布されるという物です。究極的には meta とマークしなくても勝手に配布すべきメッセージをシステムが判断する事を目標としています。各ホストに遅延があまり無くて、メッセージは必ず配布され、同期が完全に取られている事を前提にしています。が、そんなわけないです。

ホストが6台あるとすると、60分に一度どれかのホストに問題が発生するとすると10分に一度はどれかが再起動になります。そのたびに全ホストを最初からリセットして同期を取るなんてありえない。そこでとった路線は単純で、必要最低限の状態 - ちびロボの現在位置と目的地 - のみを同期するという事です。状態は

イベント発火ホスト - UDP - 各ホストのキュー - 各ホスト状態オブジェクト

経由で更新します。ネットワークは信用できないので、イベントの順番が違ったり抜けたりしますが、とりあえず状態がアトミックである事を保障されます。ここにもう一つそれぞれのホスト独自の状態、ユーザのメニュー選択状態や位置、があって、共有状態 x 各ホスト状態の組を元に何をどこに表示するかを決定します。

とまあ、こんな感じです。フレームワーク作成って大変だなあと思うのは、苦労して便利機能を考えても複雑だと使えないという事です。今回のも、TeaParty (Croquet ネットワーク共有)を使わなくても、生の UDP マルチキャストで事足りた事です。今日本屋で色々調べていたのですが(しかし、P2P の本ってビジネス書ばかりで使えない。。。) JXTA が割と求めていた物に近いかな。難しく書いてましたが、ようは一対多のパイプを実現する物みたいです。