Boltにおける信頼性
Boltでの様々な転送の仕組の信頼性は、若干理解が難しいかもしれません。
ここでは、Bolt内で送信できるデータの全ての異なるタイプでそれがどのように動作するかを見ていきましょう。
状態
最も複雑な、状態に関するプロパティから始めましょう。
状態に関するプロパティの値( state.health = 50;
など)を変更すると、Boltはこれを検知し、複製用のプロパティ(ゲームに接続されている他の全員にそれを送信するなど)をマークします。
プロパティの変更を含むパケットが失われた場合、Boltはこれを検知し、再送信のための値をマークします。
しかし、Boltは毎Nフレームごとにしかパケットを送信しないため、同じプロパティに間隔を空けずに2つの変更を加えた場合、最新の値が遠隔側で見られることとなります(つまり、ゲームに接続している他のプレイヤーなど)。
プロパティが送信されるとき、Boltは順序について保証を行いません。例えば、以下のようにあるプロパティに変更を加えたあとですぐ2つ目のプロパティに変更を加える場合:
C#
state.health = 50;
state.ammo = 10;
health
がammo
の前に届くという保証はありません。同じパケットで届くかどうかも分かりません。
状態プロパティの扱いに関してBoltが唯一保証するのは、 あるプロパティの最新の値は全ての接続している遠隔地に最終的に到着するということだけです。
イベント
Boltにおけるイベントの送信には、Unreliable と Reliable Ordered の2種類があります。
Unreliable として送信されるイベントは、届くかどうかが全く保証されませんが、届く際には多くの場合(99.9%の確率で)それは送信された順番と同じ順序となります。Reliable Ordered として送信されたイベントは到着が保証され、常に同じ順序で届きます。
グローバルイベントは Reliable Ordered と Unreliable のどちらでもあり得ますが、エンティティイベントは Unreliable でのみ送信されます。
コマンド
コマンドの送信はベストエフォート型で行われます。コマンドは完全に低信頼性ですが、冗長性を伴って送信されます。つまり、それぞれのコマンドは、到着の可能性を高めるため、いくつかのパケット内で送信されるということです。
しかし、コマンドの順序づけは高信頼性です。コマンドが失われる場合も在りますが、到着したものは常にQueueInput()
コールで待ち行列を作成された順序通りとなります。
エンティティのオーナーがコントローラーからコマンドを受信していない場合、これを検知するためにMissingCommand()
コールバックを用いて、デフォルトのアクションを潜在的に作成することができます。
プロトコルトークン
IProtocolTokenから継承されるクラスはBolt内でいくつかの異なるメソッドに渡されることがあります(例:BoltNetwork.Instantiate
、BoltNetwork.Connect
、BoltEntity.AssignControl
など)。
このようにして渡されるプロトコルトークンは、遠隔で発生するように引数を渡されたアクションのとき、必ず他の接続しているプレイヤーに到達することが保証されます。
状態 上にProtocolTokenプロパティを作成すると、このプロパティは他のプロパティタイプと同様の条件下となります。
Back to top