Photonでのシリアル化

Photonとクライアントは、非常に最適化されたバイナリプロトコルを通信に使用しています。 このバイナリプロトコルは簡潔で、容易に解析できます。

Photonは送信前に、すべてのデータをこのバイナリプロトコルに変換する必要があります。 この処理は、通常使用されるデータ型について自動的に実行されます。 ほとんどのクライアントAPIでは、必要となる他のクラスに独自のシリアル化手順を登録することも可能です。 以下を参照してください。

Photonでサポートされている型

下記のタイプは通常サポートされていて、Photonのバイナリプロトコルとして知られています。
言語によってはリストにある全ての型を提供していませんので、SDKによっては型のサポートが少ないものもあります。

type (C#) size [bytes] description
byte
2
8 bit unsigned
boolean
2
true or false
short
3
16 bit
int
5
32 bit
long
9
64 bit
float
5
32 bit
double
9
64 bit
string
3 + size( UTF8.GetBytes(string) )
< short.MaxValue length
byte-array
5 + 1 * length
< int.MaxValue length
int-array
5 + 4 * length
< int.MaxValue length
array of <type>
4 + size(entries) - count(entries)
< short.MaxValue length
hashtable
3 + size(keys) + size(values)
< short.MaxValue pairs
dictionary
3 + size(keys) + size(values)
< short.MaxValue pairs
additional size if K- or V-type is object

Photon Unity Networkingで追加された型

(英語版にはありませんでした)

(英語版にはありませんでした)

type (C#) size [bytes] description
Vector2 12 2 floats
Vector3 16 3 floats
Quaternion 20 4 floats
PhotonPlayer 8 integer PhotonPlayer.ID

カスタムタイプ

上記リストに含まれていない型の場合、重要な値をシリアライズ化または非シリアライズ化する必要があります。

基本的には二つのメソッドを書いてクラスをバイト配列に変換してから戻します。その後にそれをPhoton APIに登録します。 登録が完了すれば、メッセージにその型のインスタンスを含むことができます。

Photonが登録された型のシリアライズ化メソッドを呼び、自動的に作成したバイト配列(4byte)と必要なタイプ情報をプリフィックスします。 4 byteのオーバーヘッドがあるので、byteの少ないデータの登録は避けた方が良いかもしれません。

Photon Serverは不明のカスタムタイプをそのまま転送することもできます。このため、Photon Cloudではタイプの登録をする必要がありません。

通信する全てのクライアントにカスタムタイプを登録してください。

C#でのカスタムタイプ

全てのC#ベースのAPIは(.NET, Unity, Xamarin, etc)同じ方法でレジスタークラスへの提供をします。

コールの静的メソッドは:

    PhotonPeer.RegisterType(Type customType, byte code, SerializeMethod serializeMethod, DeserializeMethod constructor)

SerializeMethodとDeserializeMethodは定義されたデリゲートです。

    public delegate byte[] SerializeMethod(object customObject);
    public delegate object DeserializeMethod(byte[] serializedCustomObject);

PUNがどのようにUnityのVector2に対応しているかを説明します。

Vector2にはxとyの二つのfloatがあります。Photonはfloatには対応していますがVector2には対応していません。

SerializeMethodには結果としてバイト配列が必要です。基本的にはC#のどのような方法でfloat型を表す4byteを取得しても問題ありません。PhotonのProtocolクラスには効果的に複数のタイプをバイト配列に書き出すシリアライズ方法がいくつかあります。

    public static readonly byte[] memVector2 = new byte[2 * 4];
    private static short SerializeVector2(StreamBuffer outStream, object customobject)
    {
        Vector2 vo = (Vector2)customobject;
        lock (memVector2)
        {
            byte[] bytes = memVector2;
            int index = 0;
            Protocol.Serialize(vo.x, bytes, ref index);
            Protocol.Serialize(vo.y, bytes, ref index);
            outStream.Write(bytes, 0, 2 * 4);
        }

        return 2 * 4;
    }

注記としてSerializeVector2はオブジェクトを取得し、それを予測されるVector2タイプに投げる必要があります。

あとはDeserializeVector2にオブジェクトを返すのみです:

    private static object DeserializeVector2(StreamBuffer inStream, short length)
    {
        Vector2 vo = new Vector2();
        lock (memVector2)
        {
            inStream.Read(memVector2, 0, 2 * 4);
            int index = 0;
            Protocol.Deserialize(out vo.x, memVector2, ref index);
            Protocol.Deserialize(out vo.y, memVector2, ref index);
        }

        return vo;
    }

そして最後にVector2を登録する必要があります:

    PhotonPeer.RegisterType(typeof(Vector2), (byte)'W', SerializeVector2, DeserializeVector2);

 ドキュメントのトップへ戻る