view chapter4.tex @ 4:14e96778c600

update
author oc
date Mon, 16 Feb 2015 01:03:14 +0900
parents 63ae5aaa2a7a
children f6b14e3b72e0
line wrap: on
line source

\chapter{TreeVNC の新機能}


\section{表示画面サイズ調整機能}
TreeVNC は、配信側の解像度を配信するので画質が荒くなることはない。
しかし、配信側とクライアントで画面サイズに差がある場合、
画面に入らない、或いは表示画面が小さすぎる等の問題が生じる。

今までは、ユーザが viewer に用意されている拡大・縮小ボタンを使用し調整していた。

今回、ビューワに HD ボタンと fit screen ボタンを追加した。
HD ボタンを押すと、画面サイズが 1920x1080 サイズに拡大・縮小される。
fit screen ボタンを押すと、クライアントの画面サイズに合わせてフルサイズで拡大・縮小される。

更に、rootとして起動し viewer も表示される -d オプションを使用した場合は、
表示される画面が常にフルサイズに調整されるよう実装した。


\section{配信画面サイズ指定機能}

配信する画面サイズを指定できるオプションを追加した。
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{マルチディスプレイ対応}

画面配信側がマルチディスプレイの場合でも、
VNCServer からは全画面データが送信されるので、
配信側の保持している画面全てが共有される。
しかし、プレゼンテーションを行う際、複数枚の画面表示が要らない場合がある。

そこで、一画面のみをフィルタリングし表示するためのオプション機能(${\mathchar`-}$${\mathchar`-}$filterSingleDisplay)を追加した。
オプションを追加した起動方法をソースコード\ref{filtersingledisplay}に記述する。

% あとでコメントアウトはずす
\begin{lstlisting}[caption=オプション--filterSingleDisplay,label=filtersingledisplay]
  $ java -jar TreeVNC.java -d --filterSingleDisplay
\end{lstlisting}

root は全画面データから一画面のみをフィルタリングする必要がある。
シングルディスプレイサイズは、個々のクライアントでしか取得できない。
配信側は画面切り替えを行う際に、シングルディスプレイサイズを取得する。
そして、画面切り替えを行う際に root へ送信する serverChangeRequset message に
シングルディスプレイサイズを付加する。

root はメッセージを受け取り initData を変更する。
本来 initData は、RFB プロトコルで行われる通信中に VNCServer から受信する ServerInit message から生成される。
マルチディスプレイの場合、ServerInit message をそのまま使用すると、複数画面全体を描画してしまう。
それを避けるため、initData をシングルディスプレイサイズ用に生成し直す(oritinalInitData)。
そして、接続されている node へも originalInitData を送信する(図\ref{fig:initdata})。

\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倍の画像データを表示している。
TreeVNC でシングルディスプレイサイズを取得すると 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}