PUN Classic (v1)、PUN 2、Boltはメンテナンスモードとなっております。Unity2022についてはPUN 2でサポートいたしますが、新機能が追加されることはありません。お客様のPUNプロジェクトおよびBoltプロジェクトが停止することはなく、将来にわたってパフォーマンス性能が落ちることはありません。 今後の新しいプロジェクトについては、Photon FusionまたはQuantumへ切り替えていただくようよろしくお願いいたします。

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: このタイプで作成されたチャネルではサイズに関わらずデータブロックを送信することができ、インテグリティや必要に応じた再送信、送信先に情報が確実に到着したことなどが保証されます。
  • 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