レンガ構造

 仮にオンラインにおいて、エリアサーバを複数もち、それをシームレスにつなげる場合を検討してみました。シームレスの利点は別途記述します。
 UO (Ultima Online)では原始的ながらそのようなエリア境界がありました。UOのそれは厳しい動作でしたが、最近の同期方法を用いればもっとよくできるものと予想はできます。
 まずシームレスに処理できる可能性を得るためには、エリア同士のオーバーラップ部が必要であると考えられます。ここでエリア移動をするオブジェクトはエンティティと呼ぶことにします。なぜオーバーラップ部が必要かというと、エンティティ同士は相互関係を持つため、相互関係を持ちうる最大距離まではエリアサーバが認知できる範囲内にあり、相互作用を処理する必要があるためです。
 ここでは、同期などの諸問題は補完処理の1つとして処理できるという仮定で検討を進めます。
 オーバーラップ部にいるエンティティの入力は共存している全てのエリアサーバに伝播されます。全てのエリアサーバは補完も加味しつつ、独自に処理されます。
エンティティをメインで管轄している主担当エリアサーバがエリア全体とそのエンティティの最新状態を管轄下のクライアントへ伝達します。なお、エンティティの管轄移譲は、オーバーラップ部で何らかの形でスムースな移譲イベントが行われるものとします。
 オーバーラップ部は重複処理をする非効率部分ですから、必要最小限とするのがベストです。この大きさは、

public const int OverwrapLength = Math.Max( MaxEntityRadius * 2, MaxFarClipDistance );

といったものになるでしょう。
 これでうまくいくと仮定したときに、どのようにエリアを区切れば良いかということになります。
 念のため、エリアの配置はよくある平面配列だけでなく、立体配列にする場合も仮定にいれます。
 まず、非常に規則的に空間分割をすることを考えてみました。オーバーラップをさせつつ立方体をグリッド状に敷き詰める場合です。すると、オーバーラップ部は角にあたる部分で最大の3^3 = 27個の共有を持つことになります。最悪の場所に立つエンティティは27個のエリアサーバによって処理されるというわけです。ちょっと目玉が飛び出そうな数字です。エリアサーバが全てイントラネット内にあるのならまだしも、世界中に分散しているならば、あまりいい見通しではありません。もしこの案でやるならば、最悪の場所に巨石でも置いて封印したくなります。
 それではあんまりなので、もう少し検討してみました。もっと数を減らせないかと検討した結果、少なくとも平面で言えば最悪のオーバーラップ部は三叉路で済む、立体にしても、三叉路の上にエリアの中心を乗せるようにして、4つのエリアサーバとの共有で済むだろうという結論です。
 つまり、規則性を持った形で言えば、レンガを敷き詰めた構造、レンガ構造(Brick Structure)がよいのではないか、ということです。四面体直方体化敷き詰めとでもいいましょうか? なお、直方体(あるいは立方体)とするのは軸並行な空間は、処理しやすいという理由によるものです。
 レンガ構造は、強度や視覚的美しさ以外にもこんな利点があったようです。
 これで、仮に動的にエリア(レンガ)をエリアサーバへ分散処理を割り当てるとことにすると、エリアサーバ境界となるオーバーラップ(セメント部分)の体積が最小になるように、1つのエリアサーバが担当するエリア(レンガ)をなるべく空間的な連続領域になるように取ればよいことになります。
 いくつも仮定を入れたので、果たして諸問題がうまく処理できるのかということと、実際のプロジェクトでこの水準の管理を必要とするのかにはまだ疑問が残ります。

直方体
面が長方形のみで構成される6面体。それらの面が正方形のみの場合は特に立方体と呼ばれる。