|
|
実際に測ってみた
スループット(単位:Byte) | CPU使用率 | |
1台 | 20M(最大速度) | 55% |
48台 | 4M | 100% |
クライアントを木構造で接続させるTreeVNC
通常のVNC | TreeVNC |
通常のVNC | TreeVNC |
通常のVNC | TreeVNC | |
最大負荷 | N*データ量 (クライアントの数に比例) | (M+1) * データ量 |
クライアントの数をN、木構造の子供の数をMとする
|
□ で囲まれている矩形のデータだけが送られてくる。
|
|
x-position | 336 |
y-position | 388 |
width | 724 |
height | 449 |
encoding-type | 16(ZRLE) |
ZRLE | ... |
矩形の大きさと描画に必要なデータ量(単位:Byte)
矩形の大きさ \ エンコード | RAW | ZRLE |
724 * 449 | 1.3M | 0.8M |
1920 * 64 | 0.5M | 0.15M |
1920 * 1080 | 8.2M | 3.4M |
RAW、ZRLE、ZRLEEエンコードのデータ量の比較
通常のVNC | TreeVNC | |
最大負荷 | N * データ量(クライアントの数に比例) | (M+1) * データ量 |
クライアントの数をN、木構造の子供の数をMとする
理論値
通常のVNC | TreeVNC | |
最大負荷 | 48M | 2.4M |
通常のVNC | TreeVNC |
クライアント:60台 TreeVNCは2分木でTreeを構成
バイト数 | 型 |
説明 |
4 | U32 | length |
length | U8 array | ZlibData |
Deflater nDeflater = deflater; // new Deflater(); LinkedListout = new LinkedList (); unzip(inflater, inputs, 0 , out, INFLATE_BUFSIZE); // dump32(inputs); int len2 = zip(nDeflater, out, 0, bufs);
if (rfb.updateRectEncoding==RfbProto.EncodingZRLEE) zrleInStream = null; if (zrleInStream == null) zrleInStream = new ZlibInStream();
1920*1080の描画にかかったデータ量
|
次のデータがなければwaitする | データがputされ次第読み込みを再開する |
MulticastQueueは、java.util.CountDownnLatchにより実装されている。
|
|
|
実際のソースでみてみる
|
requestHostName();
プロキシに対してホストのアドレスを要求する関数。 |
|
transferParentAddress();
クライアントに接続先を教える関数。 実際にクライアントにおくっているデータは parentAddress -> 親のアドレス parentNum -> 親の番号 treeNum -> 自分の木の番号 leaderFlag -> リーダフラグ の4つである。 リーダーは子供の中で一番若い番号の人がなる。 リーダーフラグは木の再構成の際に使用する。 |
|
connectAndAuthenticate();
プロキシから受け取ったデータをもとに接続を開始する関数。 |
|
新しいクライアントが来るたびに今まで説明した3つの関数を呼び出す。 |
|
|
|
|
|
ここで接続先がクライアント1になっているがこれはプロキシ側で
親の番号 = (自分の番号 - 1) / 親に対する子どもの数 を計算してどの親に接続させれば良いかを決めてクライアントに報告している。 このように番号で木を管理している。 |
|
クライアント1が落ちた時の再接続の処理についての説明。 |
|
lostHost();
木を構成する際にリーダを決めたが、そのリーダだけが呼び出す関数。 プロキシに対し落ちた親(クライアント1)の情報を報告する。 |
|
reportLastNode();
ラストノードに対し落ちたクライアントの代わりをするように命令を出す。 |
|
connectAndAuthenticate();
プロキシから受け取ったデータをもとに接続を開始する関数。 |
|
transferParentAddress();
落ちた親の子供たちに対し新しい親のアドレスを報告する関数。 |
|
connectAndAuthenticate();
プロキシから受け取ったデータをもとに接続を開始する関数。 |