Mercurial > hg > Papers > 2015 > oc-thesis
view chapter4.tex @ 10:1f8842e3de0e
update chapter4, chapter6
author | oc |
---|---|
date | Tue, 17 Feb 2015 05:09:43 +0900 |
parents | 034ad3cd49df |
children |
line wrap: on
line source
\chapter{TreeVNC の新機能} \section{QUALITY モードと SPEED モード} 高解像度のまま拡大・縮小の処理を行うと、 PC のスペックによって描画処理に時間がかかってしまうことがある。 配信者の画面をリアルタイムに取得するため、 描画処理に時間のかからないモードを追加する。 画像描画処理には、 高画質優先の QUALITY モードと描画速度優先の SPEED モードがある。 今まで TreeVNC は QUALITY モードで使用していた。 しかし、授業中に TreeVNC を使用する際、 拡大・縮小をしてしまうと描画処理が重くなり遅延が生じていた。 今回、どちらのモードを使用するかをビューワから変更出来るようにした。 これにより、描画処理の遅延を解決することができた。 \section{表示画面サイズ調整機能} 配信側PCによって、配信される画面サイズが変わる。 配信側とクライアントで画面サイズに差がある場合、 画面に入らない、或いは表示画面が小さすぎる等の問題が生じる。 ユーザ毎に適切な画面サイズがあり、 手軽に表示画面を適切な大きさに変更できるようにしたい。 今回、ビューワに HD ボタンと fit screen ボタンを追加した。 HD ボタンを押すと、画面サイズが 1920x1080 サイズに拡大・縮小される。 fit screen ボタンを押すと、クライアントの画面サイズに合わせてフルサイズで拡大・縮小される。 更に、rootとして起動し viewer も表示される -d オプションを使用した場合は、 表示される画面が常にフルサイズに調整されるよう実装した。 %\section{配信画面サイズ指定機能} % %TreeVNC は、配信する側の % %配信する画面サイズを指定できるオプションを追加した。 %TreeVNC 起動時にオプション(${\mathchar`-}$${\mathchar`-}$fixSize)を追加することによって、 %指定した幅・高さの画面サイズのみを配信することができる。 %起動方法をソースコード\ref{fixsize}に記述する。 % %\begin{lstlisting}[caption=オプション--fixSize,label=fixsize] % java -jar TreeVNC.java -d --fixSize 1920 1080 %\end{lstlisting} % %VNCServer からは、配信する側の画面全体のデータが送信される。 %root は指定したサイズ領域のデータのみを表示するため、 %領域内の更新のみを node に送信し、領域内のみを描画している。 %そして、VNCServer へ更新データを要求する際は、 %領域内のみの画像データを要求する。 %これにより、node に指定された領域以外は表示されない。 % \newpage \section{マルチディスプレイ対応} 画面配信側のPCがマルチディスプレイの場合、 VNCServer からは複数の画面全体の画像データが送信され、 図\ref{fig:multidisplay}の様に画面が配信される。 \begin{figure}[htpd] \begin{center} \includegraphics[scale=0.8]{./images/chapter4/multidisplay.pdf} \end{center} \caption{マルチディスプレイの描画} \label{fig:multidisplay} \end{figure} 授業やゼミ等でTreeVNCを使用する場合、複数画面の表示は必要ない。 そこで、一画面のみをフィルタリングし表示するためのオプション機能(${\mathchar`-}$${\mathchar`-}$filterSingleDisplay)を追加した。 オプションを追加した起動方法をソースコード\ref{filtersingledisplay}に記述する。 \begin{lstlisting}[caption=オプション--filterSingleDisplay,label=filtersingledisplay] java -jar TreeVNC.java -d --filterSingleDisplay \end{lstlisting} root は全画面データから一画面のみをフィルタリングする必要がある。 シングルディスプレイサイズは、個々のクライアントでしか取得できない。 配信側は画面の切り替えを行う際に、シングルディスプレイサイズを取得する。 そして、root へ送信する画面切り替えの要求メッセージ SERVER\_CHANGE\_REQUEST に シングルディスプレイサイズを付加する。 root はメッセージを受け取り initData を変更する。 本来 initData は、RFB プロトコルで行われる通信中に VNCServer から受信する ServerInit message から生成される。 マルチディスプレイの場合、ServerInit message は全画面サイズ様に生成されている。 なので、そのままの initData を使用すると複数画面全体を描画してしまう。 それを避けるため、initData をシングルディスプレイサイズ用の originalInitData に生成し直す。 図\ref{fig:initdata}の様に、root は接続されている node へ originalInitData を送信する。 \begin{figure}[htpd] \begin{center} \includegraphics[scale=0.8]{./images/chapter4/sendInitData.pdf} \end{center} \caption{シングルディスプレイサイズ用の initData} \label{fig:initdata} \end{figure} さらに VNCServer から送信されてきた全画面データをそのまま node に流すのではなく、 シングルディスプレイサイズの領域の更新部分のみを root 側でフィルタリングし流す。 これにより、一画面のみの表示が可能となる。 \section{Retina のマルチディスプレイ対応} Retina ディスプレイ等の高解像度ディスプレイには、 より画素密度を高く表示する HiDPI (High-dot per inch) モードがある。 HiDPI モードの場合、 PC で設定する解像度に対して縦横2倍の画像データを表示している。 HiDPIモードを使用しているPCが配信者の場合、 シングルディスプレイのフィルタリングに失敗してしまう問題が発生した。 % ここらへん怪しいような気がするけど頭が働かない % 「2倍のサイズになると何が問題なの」という問いにちゃんと答えられてる?? シングルディスプレイ対応のため、originalInitDataを生成するが、 今までのシングルディスプレイサイズの取得方法では正しいサイズを取得できないことが原因となっていた。 シングルディスプレイサイズを取得すると PC で設定する解像度のサイズになるが、 VNCServer から送信される画像データサイズは解像度の2倍のサイズになっており、ズレが生じたためである。 マルチディスプレイ対応のためには、 シングルディスプレイサイズを VNCServer から送信される画像データサイズに合わせなければならない。 そこで、HiDPI モードであるかどうかを検知する必要がある。 VNCServer は、接続されているディスプレイサイズを合わせて画像データを送信してくる。 HiDPI モードであるかどうかを検知には、1枚目以降のディスプレイサイズが必要となる。 以下に、HiDPI モードの取得方法を記述する。 \begin{itemize} \item VNCServer から送信される width は図\ref{fig:singledisplaywidth}の VNCServer Single width である \item VncServer Single width から、図\ref{fig:singledisplaywidth}の 2nd Single width を引く \item 余りのサイズが取得してきた図\ref{fig:singledisplaywidth} Single width の2倍であれば、HiDPI モードである \end{itemize} HiDPI モードの場合、originaiInitData を取得してきたシングルディスプレイの2倍サイズで生成する。 この方法を用いて、HiDPI モードでもマルチディスプレイ対応ができた。 \begin{figure}[htpd] \begin{center} \includegraphics[scale=0.6]{./images/chapter4/singleDisplayWidth.pdf} \end{center} \caption{Single Display Width} \label{fig:singledisplaywidth} \end{figure} \newpage \section{遠隔地からの接続} 遠隔地からでもゼミや授業に参加できるよう、 異なるネットワークインタフェースから TreeVNC への接続を可能にした。 遠隔地からの接続を実現した TreeVNC を図\ref{fig:remotetreevnc}に示す。 図\ref{fig:remotetreevnc}では、 ネットワーク A で立ち上げた TreeVNC に対し、 遠隔地のネットワーク B, C, D から接続している状態である。 図の様に、各ネットワーク毎に TreeManager を持つ root node が存在する。 TreeManager を持つ node は、そのネットワーク上での接続の木構造を管理する root となる。 遠隔地ネットワークから直接 TreeVNC に接続した node は root となる。 \begin{figure}[htpd] \begin{center} \includegraphics[scale=0.6]{./images/chapter4/remoteTreeVnc.pdf} \end{center} \caption{Remote Network Tree} \label{fig:remotetreevnc} \end{figure} \newpage 以下に、遠隔地からの接続の手順を記述する。 \begin{itemize} \item 遠隔地 node から接続したい root に対して接続を要求する WHERE\_TO\_CONNECT message を送信する(図\ref{fig:remotevncconnect}中, 1:) \item root は、遠隔地 node に対して接続先を含む CONNECT\_TO message を送信する(図\ref{fig:remotevncconnect}中, 2:) \item 遠隔地 node は指定された接続先に対して接続しに行く(図\ref{fig:remotevncconnect}中, 3:) \end{itemize} \begin{figure}[htpd] \begin{center} \includegraphics[scale=0.7]{./images/chapter4/remoteVncConnect.pdf} \end{center} \caption{遠隔地 node からの接続} \label{fig:remotevncconnect} \end{figure} ネットワーク毎に TreeVNC の木構造は管理される。 図\ref{fig:remotenetworktree1}の TreeVNC の木構造はバイナリツリーを形成している。 しかし、遠隔地 node が接続している node には合計3つ node が接続している。 遠隔地 node は、root の管理する nodeList に追加されない。 これは、node の接続・切断・切り替えに遠隔地 node を関与させないためである。 ネットワーク毎に root が存在する。 root は同じネットワーク上の新しい node からの 接続を受け付ける(図\ref{fig:remotenetworktree1}中, 1,2,1',2':)。 \newpage \begin{figure}[htpd] \begin{center} \includegraphics[scale=0.7]{./images/chapter4/remotenetwork.pdf} \end{center} \caption{Remote Network Tree} \label{fig:remotenetworktree1} \end{figure} 遠隔地 node からでも、画面を配信できるようにする。 遠隔地 node から画面配信を行う場合の画面の切り替えを図\ref{fig:remotenetworktree2}、図\ref{fig:remotenetworktree5}に示す。 以下に、画面切り替えの説明を記述する。 \begin{itemize} \item 遠隔地 node が親 node へと SERVER\_CHANGE\_REQUEST を送信する(図\ref{fig:remotenetworktree2}中, 1:) \item SERVER\_CHANGE\_REQUEST には、id が付いており、遠隔地 node からであれば -1 が付加されている \item SERVER\_CHANGE\_REQUEST は root へと送信される(図\ref{fig:remotenetworktree2}中, 2:) \item root は SERVER\_CHANGE\_REQUEST の id を確認し、id = -1 の場合、遠隔地 root に対して WHERE\_TO\_CONNECT を送信する(図\ref{fig:remotenetworktree2}中, 3:) \item 遠隔地 root は WHERE\_TO\_CONNECT の返信として、接続先を含む CONNECT\_TO を送信する(図\ref{fig:remotenetworktree5}中, 4:) \item root は指定された接続先へと接続しに行く(図\ref{fig:remotenetworktree5}中, 5:) \end{itemize} \begin{figure}[htpd] \begin{center} \includegraphics[scale=0.7]{./images/chapter4/remotenetwork2.pdf} \end{center} \caption{Remote Network Tree} \label{fig:remotenetworktree2} \end{figure} \begin{figure}[htpd] \begin{center} \includegraphics[scale=0.7]{./images/chapter4/remotenetwork5.pdf} \end{center} \caption{Remote Network Tree} \label{fig:remotenetworktree5} \end{figure}