2007 年 2 月 12 日 23 時 55 分

FramebufferUpdate メッセージ


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


最後にして最大にややこしいのが、
FramebufferUpdateMessage メッセージだ。
これは種類 0 番のサーバメッセージで、
サーバが画面データをクライアントに送る際に使用される。

単に画面データを送るだけならば大したことはないのだが、
このメッセージは、他のメッセージと比較して、
サイズが非常に大きくなるため、
通信量削減のために特別な配慮がなされている。

このメッセージでは、データの転送量を削減するため、
メッセージの一部に対して圧縮や変換を行うことができる。
これらは符号化と呼ばれており、いくつもの方式が存在する。

とりあえず、メッセージの形式を調べてみよう。
このメッセージは可変長で、以下のような構造を持つ。

    U8 messageType; // 常に 0
    U8 reserved; // 1 バイトの詰め物
    U16 count; // メッセージに含まれる矩形の数
    UpdateRectangle rectangles[]; // カラーテーブル

count には、1 つのメッセージで送る矩形の数が格納される。
FramebufferUpdate メッセージでは、
更新された領域を、複数の矩形に分割して送信する。
各矩形では、異なる符号化方式を使うことができる。

これは、不定形の更新領域や、画面データの偏りを利用して、
最小限の転送量でデータを送るための配慮である。

UpdateRectangle は、矩形領域を表すデータ構造だが、
これまた可変長となっているのでややこしい。

    U16 x; // 矩形の左上の X 座標
    U16 y; // 矩形の左上の Y 座標
    U16 width; // 矩形の幅
    U16 height; // 矩形の高さ
    S32 encodingType; // 矩形の符号化方式
    byte[] data; // 符号化された画素データ

最初の 5 つは、符号化方式によらず共通である。
data は、画素データを符号化したもので、
encodingType によってその表現方法がまったく異なる。

さて、どうしたものか。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.