フレームフォーマット
TSMP は、エンコードされたテクスチャに 1 つのバイナリ フレームを書き込みます。コーデックはバイトがどのようにピクセルになるかを決定します。フレーム形式によって、それらのバイトが何を意味するかが決まります。
通常、フレーム形式を編集する必要はありません。レイアウトを理解すると、CRC エラー、ペイロード容量、メッセージ数、カスタム コーデックの作業をデバッグするときに役立ちます。
フレーム全体
+----------------------+-------------------------------+----------------------+
| Frame header | Frame body / payload | Unused texture area |
| 56 bytes | PayloadSize bytes | codec/padding space |
+----------------------+-------------------------------+----------------------+
- ヘッダーは受信者にフレームの読み取り方法を伝えます。
- 本文には同期された値と RPC 呼び出しが含まれます。
- 残りのテクスチャ容量はデコーダによって無視されます。
- 古いデータが現在のペイロードと間違われないように、未使用のテクスチャ領域をクリアまたは無視する必要があります。
フレームヘッダー
byte 0 byte 55
+--------+---------+---------+---------+---------+----------+---------+
| Magic | Version | Layout | Stream | Codec | Payload | CRC32 |
| 0..3 | 4..11 | 12..19 | 20..31 | 32..39 | 40..51 | 52..55 |
+--------+---------+---------+---------+---------+----------+---------+
重要なヘッダーフィールド:
| オフセット | サイズ | 意味 |
|---|---|---|
0 | 4 | TSMP を識別する魔法の値。 |
4 | 2 | プロトコルのメジャー/マイナー バージョン。 |
7 | 1 | コーデックによって使用されるシンボル モード。 |
8 | 2 | ヘッダーのサイズ。現在の値は 56 です。 |
12 | 8 | ブロックおよびアクティブなレイアウト情報。 |
20 | 4 | ストリームID。 |
24 | 4 | フレームインデックス。 |
28 | 4 | ミリ秒単位のタイムスタンプ。 |
32 | 8 | コーデック ID とコーデック オプション。 |
40 | 2 | ペイロードのタイプ。 |
42 | 2 | バイト単位のペイロード サイズ。 |
44 | 6 | 予約済みのペイロード バイト。 |
50 | 1 | デコードサンプルサイズ。 |
51 | 1 | 量子化モード。 |
52 | 4 | ヘッダー CRC32。 |
CRC は、CRC フィールドが 0 のときにバイト 0..51 に対して計算されます。受信側が別の CRC を計算した場合、フレームは破棄され、警告が記録されます。
フレーム本体
通常の同期の場合、ペイロード タイプは TSMP ネットワーク フレームです。
+-----------------------+---------------------------------------------+
| Network frame header | Message 0 | Message 1 | ... | Message N |
| 8 bytes | variable state or RPC call |
+-----------------------+---------------------------------------------+
ネットワークフレームヘッダー:
| オフセット | サイズ | 意味 |
|---|---|---|
0 | 1 | ネットワーク ペイロードのメジャー バージョン。 |
1 | 1 | ネットワーク ペイロードのマイナー バージョン。 |
2 | 2 | メッセージ数。 |
4 | 4 | ネットワークシーケンス。 |
各メッセージは 8 バイトのメッセージ ヘッダーで始まります。
+------------+------+-------+----------+-------------+
| Network ID | Type | Flags | Sequence | Body length |
| 2 bytes | 1 | 1 | 2 bytes | 2 bytes |
+------------+------+-------+----------+-------------+
メッセージ本文は次のいずれかです。
- 変数の状態:
TransSyncフィールドの値。 - RPC 呼び出し:
SendTransRPCによってキューに入れられたメソッド ハッシュとエンコードされた引数。
変数状態本体
変数状態メッセージには、1 つのネットワーク動作に対する 1 つ以上のフィールド値が含まれます。
+----------------+------------------+------------------+
| Variable count | Variable value 0 | Variable value N |
| 2 bytes | 7-byte header + data |
+----------------+------------------+------------------+
各値には以下が格納されます。
- 安定した変数ハッシュ。
- 値のタイプ。
- バイト長。
- エンコードされた値のバイト。
空の変数状態メッセージは書き込まれません。現在のフレームでビヘイビアーに有効なフィールドがない場合、エンコーダーはそのメッセージをロールバックします。
RPC 本体
RPC メッセージには次のものが含まれます。
- 安定したメソッドハッシュ。
- 引数の数。
- エンコードされた引数値。
RPC 専用フレームは有効です。これにより、変数の状態がそのフレームを変更しなかった場合でも、シーンは短いイベントを送信できるようになります。
デバッグ時に確認すること
- フレーム インデックスが変更された場合、送信者はフレームを生成しています。
- ペイロード サイズがゼロの場合、同期されたデータは書き込まれません。
- CRC が失敗した場合は、テクスチャ パスがピクセルを変更しているか、間違った領域を読み取っています。
- メッセージ数が予想よりも少ない場合は、セットアップ バインディングまたはペイロード容量に注意する必要があります。
- TX に RPC メッセージがあるが RX にはない場合は、フレーム損失と重複フレームの処理を確認します。
互換性に関する注意事項
ヘッダー サイズは 56 バイトに固定されたままです。予約バイトは将来の互換性のために保持され、現在のエンコーダではゼロとして書き込まれる必要があります。
ペイロード コピーと FEC は、現在のワイヤ形式の一部ではありません。現在のフレームは 1 つのペイロード本体を運びます。