Bolt Stream System
大量のデータまたはBoltのプロパティと共に送信ができないデータのタイプ(画像や辞書など)、もしくはその両方をネットワーク上で送信する必要がある場合、ストリーミングが有効です。
Photon Boltには、ビルトインでストリーミング機能があり、大量のデータを送信したり通常のステート転送プロセスと合わせて使用したりすることができます。
シリアライズ化したデータ(画像や辞書、地図情報、在庫リストなど)を送信する場合は、通常のBolt Statプロパティは最適なオプションではありません。このようなとき、ストリーミングが有効です。
詳細
Bolt Stream Systemには重要な点がいくつかあり、使用時やそこからのデータ消費時にに気を付けておく必要があります。
後でストリーミングストラクチャをセットアップする引数に返還される設定についてここで説明します。
- Stream Channel: ストリームシステムはストリームチャネルというものをベースにしています。これは他のチャンネルと並行してデータブロックを送受信するのに使用できるストラクチャです。様々な種類のデータが特定のチャンネルを送信に使用できる万能かつ強力なシステムとなります。
- Channel Name: 各ストリームチャネルは、デバッギングするのに便利な一意の名前で識別されます。
- Channel Mode: 新しいチャンネルを作成する場合、以下の2種類からモードを選択できます。
- Unreliable: このタイプのチャネルはデータブロック送信にone-fire behaviorを使用します。つまり、送信先に到着したかどうかの保証はされません。また、
Bolt Packet Size
以上のデータは送信できないので、限定的なモードです。 - Reliable: このタイプで作成されたチャネルではサイズに関わらずデータブロックを送信することができ、インテグリティや必要に応じた再送信、送信先に情報が確実に到着したことなどが保証されます。
- Unreliable: このタイプのチャネルはデータブロック送信にone-fire behaviorを使用します。つまり、送信先に到着したかどうかの保証はされません。また、
- Channel Priority: 各チャネルにはそれぞれの優先順位をつけることができます。つまり、特定のチャネルで他のチャネルよりもデータを優先的に送信させることができます。送信レートが低い場合や他の重要なチャネルで同時に情報送信を行っている場合などに便利です。番号が大きいほど、優先度が高くなります。
- Connection Bandwidth:
データストリーミングにかけたい帯域幅も大事な点です。接続ごとに簡単に変更することができ、基本的には一秒ごとに送信される最大バイト数を設定します。
Stream System API
Bolt Stream SystemはいくつかのAPIから構成されており、主にBoltNetwork
クラスからアクセスされますが、一緒に動作する他のオブジェクトのコールバックやメソッドもあります。
APIに意識を向けておくとストリーミングのメリットを最大限に生かすことができます。
Streamパケットサイズを変更する
Bolt SDK v1.3から、デフォルトのStreamパケットサイズをデフォルトの4096から好きなサイズに変更できるようになりました。
BoltRuntimeSettings
にあるBoltConfig
リファレンスで、以下の様にデフォルトの値を変更することで実現できます。:
C#
public BoltConfig GetConfig
{
get
{
var config = BoltRuntimeSettings.instance.GetConfigCopy();
config.packetStreamSize = 1024; // your desired size in bytes
return config;
}
}
Stream帯域幅
ピア間でのデータ送信における重要な点の1つは、ユニット時間ごとに送信できるデータの量です。最大帯域幅というものです。現在ピアに接続している各BoltConnection
(ゲームサーバの場合は全てのクライアントのリストとなり、クライアントの場合はゲームサーバとの接続となります)で、データ送信を行いたい最大ストリーム帯域幅を指定できます。
デフォルトの値は、80kb/s
程度で設定されています。
以下の通り、BoltConnection.SetStreamBandwidth
を使用して簡単に設定できます。
C#
public class CustomStreamManager : Bolt.GlobalEventListener
{
public override void Connected(BoltConnection connection)
{
// Configure this connection to send at max 20kb/s
connection.SetStreamBandwidth(1024 * 20);
}
}
Stream Channelの作成
ストリーミングシステムのコアの部分は、Stream Channel
です。
新しくチャネルを作成するには、BoltNetwork.CreateStreamChannel
メソッドを使用し、上のセクションで説明した全ての引数をパスします。
後のわかりやすさのため、UdpKit.UdpChannelName
リファレンスを保管する必要があります。これは、特定の情報を送りたいチャネルをBoltに知らせるものです。
クライアントとゲームサーバーでのストリーミングチャネル作成方法です。
C#
public class CustomStreamManager : Bolt.GlobalEventListener
{
private const string VoiceChannelName = "Voice";
private const string RandomChannelName = "RandomChannelName";
private static UdpKit.UdpChannelName Voice;
private static UdpKit.UdpChannelName RandomChannel;
public override void BoltStartBegin()
{
// Creating a Unreliable channel with priority 1
Voice = BoltNetwork.CreateStreamChannel(VoiceChannelName, UdpKit.UdpChannelMode.Unreliable, 1);
// Creating a Reliable channel with priority 4
RandomChannel = BoltNetwork.CreateStreamChannel(RandomChannelName, UdpKit.UdpChannelMode.Reliable, 4);
}
}
BoltNetwork.CreateStreamChannel
には3つのパラメータが届きます。(i) チャネル名、(ii)チャネルのリライアビリティモード、(iii)チャネルの優先度の3つです。
UdpKit.UdpChannelName
タイプのチャネルリファレンスも返されます。アクセス可能な変数に保管して後から使えるようにしておいてください。
チャネルを作成できるのは、BoltStartBeginコールバックの中でのみ という制限があるので、注意してください。
Boltがすべてのチャネルを把握しておく必要があるためです。
Stream Channel使用法
チャネルを定義したら、今度は使用方法と他のBoltConnection
刃の情報送信方法についてご紹介します。
これを行うAPIはBoltConnection.StreamBytes
で、以下の様にパラメータが2つ必要となります。:
- UdpKit.UdpChannelName: Stream Channel作成時に保管されるリファレンス;
- Byte[] data: 送信するバイト配列
CustomStreamManager
クラス内で作成したRandomChannel
チャネルへのリファレンスを使用したゲームサーバへのバイナリデータ送信の例。
C#
public class CustomStreamManager : Bolt.GlobalEventListener
{
//...
public void SendRandomData()
{
byte[] data = CreateData(5);
// Streaming bytes
BoltNetwork.Server.StreamBytes(RandomChannel, data);
}
private byte[] CreateData(int size)
{
var data = new byte[1024 * size];
var rand = new System.Random();
rand.NextBytes(data);
return data;
}
}
ここまで来たら、他にすることはもうありません。Boltが必要に応じて情報のフラグメント化を行い、送信します。
Stream Systemコールバック
Boltストリーミングシステムには、モニタリングと主に離れた接続先から送信されたデータブロックの受信に使用する一連のコールバックが用意されています。それらのコールバックの紹介と、コールバック間での連動作用について説明を行います。
以下のメソッドはいつも通り、関数のオーバーライドを通して、Bolt.GlobalEventListener
クラスから使用できます。
- StreamDataStarted(BoltConnection connection, UdpChannelName channel, ulong streamID): 新しいデータのストリームが開始されると呼び出されます。接続元、送信されているストリームチャネル、一意の送信IDについての情報を受け取ります。
C#
public override void StreamDataStarted(BoltConnection connection, UdpChannelName channel, ulong streamID)
{
BoltLog.Warn("Connection {0} is transfering data on channel {1} :: Transfer {2}...", connection, channel, streamID);
}
- StreamDataProgress(BoltConnection connection, UdpChannelName channel, ulong streamID, float progress): 新しいデータを受信するたびに呼び出されます。
0
から0.99
までの間で表示される送信ステータスのプログレスパラメータへのアクセスも受け取ります。
C#
public override void StreamDataProgress(BoltConnection connection, UdpChannelName channel, ulong streamID, float progress)
{
BoltLog.Info("[{3}%] Connection {0} is transfering data on channel {1} :: Transfer ID {2}", connection, channel, streamID, (int)(progress * 100));
}
- StreamDataAborted(BoltConnection connection, UdpChannelName channel, ulong streamID): 送信が中断されると呼び出されます。リモートのピアが切断されたり、送信が無効の場合に発生します。
C#
public override void StreamDataAborted(BoltConnection connection, UdpChannelName channel, ulong streamID)
{
BoltLog.Error("Stream {0} on channel {1} from connection {2} has been aborted.", streamID, channel, connection);
}
- StreamDataReceived(BoltConnection connnection, UdpStreamData data): 完全なデータブロックを受信するたびに呼び出されます。接続元(
BoltConnection
)、データパラメータ(UdpStreamData
)、バイト配列
の取得元(data
フィールド)、情報送信に使用したストリームチャネル (UdpKit.UdpChannelName
)を示します。
C#
public override void StreamDataReceived(BoltConnection connection, UdpStreamData data)
{
BoltLog.Info("Received data from {0} on channel {1}: {2} bytes", connection, data.Channel, data.Data.Length);
}
Back to top