10.1. PiaReckoning の概念

はじめに

PiaReckoning は、ゲームオブジェクトの状態を推測航法を用いて推測することで、通信量を低減するためのモジュールです。

ゲームオブジェクトの位置や向きなどは、各ステーション間で常に同期されなければなりませんが、これらの値を毎フレーム送信すると通信帯域を大きく消費してしまいます。推測航法を用いることで、送信側は送信する値を間引きつつ、受信側は受信した値と値の間を推測することができ、通信の頻度を減らし、通信帯域を抑えることができます。

参考:

PiaReckoning により削減できる通信量はゲームの仕様に依存します。一般的なアクションゲームの場合、移動のための通信量についてはおおよそ 1/5 から 1/10 程度に削減できます。

 

 
推測航法とは

推測航法とは、対象物の位置や向きなどを過去の値から推測する技術です。

送信側は、過去の標本値を元に推測した現在の値と、現在の実際の値を比べ、その差が一定の閾値(推測閾値)以上であった場合、新たに標本値を追加し、送信を行います。

受信側は、標本値が更新される度に、送信側と同様の推測を行い、推測から計算される現在の値を使用します。

図 10-1. パスの推測例 は、3 つの標本値から、2 次関数による推測アルゴリズムを用いて推測した例となります。この例において、時刻 t1 、t2 、t3 のときに標本値の更新及び送信が行われていることになります。

図 10-1. パスの推測例

送信、受信、推測の流れ

ReckoningCloneElement::SetValue() で設定された値のうち一部の値を標本値として採用します。標本値はその値がセットされた時刻とともに、最新のものから一定個数保存され、受信側に送信されます。受信側では、受信した標本値が同様に一定個数保存されており、ReckoningCloneElement::GetValue() により標本値から現在の値を推測して返します。

図 10-2. 推測の概要 は、2 個の標本値から線形で推測する例を表しています。そして、値の増え方が変わるタイミングから 2 個を標本値に加えるようにしています。最初は時刻 1 に値 10 が、時刻 2 に値 20 が標本値として採用され、それぞれ送信されます。それらが届く時刻 4 では、これらの値から線形に推測し、 正しい値 40 が推測されます。

時刻 5 以降は、値の増え方が変化して値が増えなくなります。そのため、時刻 5 と 6 で新たな標本値が採用され、それぞれ送信されます。しかし、受信側の時刻 6 ではまだ新しい標本値は届いていないので、古い標本値から 60 と間違った推測をしてしまいます。このように推測航法では一時的に実際の値とは異なる推測値が使用される可能性があります。

時刻 8 には新たな標本値が届き、再び正しい値 50 が推測できるようになります。

図 10-2. 推測の概要