Mercurial > hg > Papers > 2015 > oc-thesis
view paper/chapter4.tex @ 30:c5af1e0a283a
update presen
author | oc |
---|---|
date | Thu, 19 Feb 2015 02:26:47 +0900 |
parents | 16c5f065f7e7 |
children | 97acef4f6207 |
line wrap: on
line source
\chapter{TreeVNC の新機能} \section{QUALITY モードと SPEED モード} 高解像度のまま拡大・縮小の処理を行うと、 PC のスペックによっては描画処理に時間がかかってしまうことがある。 配信者の画面をリアルタイムに取得するため、 描画処理に時間のかからないモードを追加する。 画像描画処理には、 高画質優先の QUALITY モードと描画速度優先の SPEED モードがある。 今まで TreeVNC は QUALITY モードで使用していた。 今回、どちらのモードを使用するかをビューワから変更出来るようにした。 これにより、描画処理の遅延を解決することができた。 \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 はVNCServerから送られてくる全画面データから一画面のみをフィルタリングする必要がある。 シングルディスプレイサイズは、個々のクライアントでしか取得できない。 なので、配信側は画面の切り替えを行う際に、シングルディスプレイサイズを取得し、 root へ送信する画面切り替えを要求する SERVER\_CHANGE\_REQUEST message に シングルディスプレイサイズを付加する様にした。 % もっと詳しく % initDataとはなんなのか root はメッセージを受け取り initData を変更する。 initData は、RFB プロトコルで行われる通信中に VNCServer が送信するServerInit message から生成される。 画像データが送られてくる前段階で、これから送信されるデータの情報を取得し、描画の準備をする。 ServerInit messageに含まれているデータは、 配信先の画面サイズ、pixel format、配信先のPCの名前である。 マルチディスプレイの場合、VNCServerは複数画面全体のサイズを送信する。 そのまま 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} これにより、一画面のみの表示が可能となる。 \section{Retina のマルチディスプレイ対応} Retina ディスプレイでシングルディスプレイを配信しようとした場合、 originalInitDataが正しく生成されない問題が発生した。 Retina ディスプレイ等の高解像度ディスプレイには、 より画素密度を高く表示する HiDPI (High-dot per inch) モードがある。 HiDPI モードの場合、 PC で設定する解像度に対して縦横2倍の画像データを表示している。 今までのシングルディスプレイサイズの取得方法では正しいサイズを取得できないことが原因となっていた。 シングルディスプレイサイズとしてPCで設定している解像度のサイズを取得していた。 しかし、HiDPIモードの場合、VNCServer から送信される画像データサイズは、 解像度の2倍のサイズになっており、ズレが生じたためである。 問題を解決するために、HiDPI モードであるかどうかを検知する必要がある。 以下に、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}