8.1. PiaSync の概念

PiaSync はマルチプレイゲームでよく使用されるユーザー入力同期(キー同期)通信を実現するためのモジュールです。

次の 3 点が成り立つ場合、ユーザー入力データを通信させるだけで各ステーションの状態を一致させることができ、これを入力同期通信と呼びます。

  1. 同期通信開始時の状態が揃っている
  2. 同期通信を開始するタイミングが揃っている
  3. ゲーム処理で使用するユーザー入力データの内容と順番が全ステーションの間で一致している

PiaSync の主な機能となる、ゲームフレームを同期するための機能とユーザー入力データを共有するための機能について説明します。

ゲームフレームの同期

PiaSync が行っているゲームフレーム同期の概要図を 図 8-1. ゲームフレーム同期の概要図 に示します。

図 8-1. ゲームフレーム同期の概要図

各ステーションは全員分の入力データがまだ揃っていない間はゲームフレームを止めて入力データを待ち、揃っていればゲームフレームを進めていきます。ある時刻においてゲームフレームが進んでいるステーションと遅れているステーション間で時間差(最大で、入力遅延として設定したフレーム時間 - 片道通信遅延)が発生することになります。ただし、進んでいるステーションは入力データが揃いにくくなり、ゲームフレームを進められない回数が増えるため、時間差が生じてもその後は徐々に縮まることになります。

ユーザー入力データの共有

PiaSync が行っているユーザー入力データの共有の概念図を 図 8-2. ユーザー入力データの同期 に示します。

図 8-2. ユーザー入力データの同期

※ イメージしやすいようにステーション 1 のみに注目した図になっています。実際には上図の処理は全てのステーション間で同様の処理を行います。

PiaSync 内部では自ステーションの入力データを複数フレーム分(アプリケーションから指定可能、図では 3 フレーム)保持しています。これらのデータ全てを他のステーションに定期的に送信しています。全てのステーションが全員分の「n フレーム目の入力データ」を保持している状態を作ります。アプリケーションは現在のフレーム用の入力データを全ステーション分、取得することができます。

PiaSync で送受信するデータとしては、コントローラ入力(キー入力やタッチパネル、モーションなど)が基本になりますが、それ以外の任意のデータを同期通信することも可能です。以降、このデータを「同期データ」と呼びます。

送信する同期データの種類

同期データは複数の種類に分けることができます。この場合、同期データの各種類ごとに異なるデータ ID を割り振ります。例えば、データ ID 0 には「キーデータ」、データ ID 1 には「モーションデータ」を割り振ることができます。

フレームドロップ

全てのステーションから n フレーム目の同期データを受信すると、n フレーム目に進むことができます。しかし、まだ受信できていない場合は進むことができません。全てのステーションから n フレーム目の同期データが受信できるまで、ゲームの進行に関する処理は行ってはいけません。これをフレームドロップと呼びます。フレームドロップが頻繁に起きると、プレイヤーからは、処理がカクついているように見える可能性があります。フレームドロップさせずにゲームを進行させた場合、同期ずれが起こることになりますので注意してください。

入力遅延

最適な入力遅延の値は通信相手との通信遅延によって異なります。PiaSync では、同期通信開始時だけでなく、同期通信中にも入力遅延の値を変更することができます。例えば、通信状況に応じて入力遅延を動的に調節することができます。ただし、プレイヤーがプレイする度に入力遅延の程度が変化するというデメリットもあります。したがって、入力遅延の値は通信遅延と操作感などを考慮して決定してください。フレームドロップが頻繁に起きる場合は、入力遅延を大きくすることで改善することがあります。

送信間隔

PiaSync では、同期通信開始時に同期データの送信間隔を設定できます。送信間隔が小さい方が頻繁に送信処理が行われ、フレームドロップが起きにくくなりますが、その分、単位時間当たりの送信パケット数が多くなります。通信を安定させたいときは送信間隔を大きくしてください。