comparison paper/chapter4.tex @ 30:c5af1e0a283a

update presen
author oc
date Thu, 19 Feb 2015 02:26:47 +0900
parents 16c5f065f7e7
children 97acef4f6207
comparison
equal deleted inserted replaced
29:ad8beccc487b 30:c5af1e0a283a
1 \chapter{TreeVNC の新機能} 1 \chapter{TreeVNC の新機能}
2 2
3 \section{QUALITY モードと SPEED モード} 3 \section{QUALITY モードと SPEED モード}
4 4
5 高解像度のまま拡大・縮小の処理を行うと、 5 高解像度のまま拡大・縮小の処理を行うと、
6 PC のスペックによって描画処理に時間がかかってしまうことがある。 6 PC のスペックによっては描画処理に時間がかかってしまうことがある。
7 配信者の画面をリアルタイムに取得するため、 7 配信者の画面をリアルタイムに取得するため、
8 描画処理に時間のかからないモードを追加する。 8 描画処理に時間のかからないモードを追加する。
9 9
10 画像描画処理には、 10 画像描画処理には、
11 高画質優先の QUALITY モードと描画速度優先の SPEED モードがある。 11 高画質優先の QUALITY モードと描画速度優先の SPEED モードがある。
12 今まで TreeVNC は QUALITY モードで使用していた。 12 今まで TreeVNC は QUALITY モードで使用していた。
13 13
14 しかし、授業中に TreeVNC を使用する際、
15 拡大・縮小をしてしまうと描画処理が重くなり遅延が生じていた。
16
17 今回、どちらのモードを使用するかをビューワから変更出来るようにした。 14 今回、どちらのモードを使用するかをビューワから変更出来るようにした。
18 これにより、描画処理の遅延を解決することができた。 15 これにより、描画処理の遅延を解決することができた。
19 16
20 17
21 18
22 \section{表示画面サイズ調整機能} 19 \section{表示画面サイズ調整機能}
23 20
24 配信側PCによって、配信される画面サイズが変わる。 21 配信側PCによって、配信される画面サイズが変わる。
25 配信側とクライアントで画面サイズに差がある場合、 22 配信側とクライアントで画面サイズに差がある場合、
26 画面に入らない、或いは表示画面が小さすぎる等の問題が生じる。 23 画面に入りきらない、或いは表示画面が小さすぎる等の問題が生じる。
27 24
28 ユーザ毎に適切な画面サイズがあり、 25 ユーザ毎に適切な画面サイズがあり、
29 手軽に表示画面を適切な大きさに変更できるようにしたい。 26 簡単に表示画面を適切な大きさに変更できるようにしたい。
30 27
31 今回、ビューワに HD ボタンと fit screen ボタンを追加した。 28 今回、ビューワに HD ボタンと fit screen ボタンを追加した。
32 HD ボタンを押すと、画面サイズが 1920x1080 サイズに拡大・縮小される。 29 HD ボタンは、画面サイズを 1920x1080 サイズに拡大・縮小し、
33 fit screen ボタンを押すと、クライアントの画面サイズに合わせてフルサイズで拡大・縮小される。 30 fit screen ボタンは、クライアントの画面サイズに合わせてフルサイズで拡大・縮小する。
34 31
35 更に、rootとして起動し viewer も表示される -d オプションを使用した場合は、 32 更に、rootとして起動し、viewer も表示される -d オプションを使用した場合は、
36 表示される画面が常にフルサイズに調整されるよう実装した。 33 表示される画面を常に画面にフィットする様にした。
37 34
38 35
39 %\section{配信画面サイズ指定機能} 36 %\section{配信画面サイズ指定機能}
40 % 37 %
41 %TreeVNC は、配信する側の 38 %TreeVNC は、配信する側の
81 78
82 \begin{lstlisting}[caption=オプション--filterSingleDisplay,label=filtersingledisplay] 79 \begin{lstlisting}[caption=オプション--filterSingleDisplay,label=filtersingledisplay]
83 java -jar TreeVNC.java -d --filterSingleDisplay 80 java -jar TreeVNC.java -d --filterSingleDisplay
84 \end{lstlisting} 81 \end{lstlisting}
85 82
86 root は全画面データから一画面のみをフィルタリングする必要がある。 83 root はVNCServerから送られてくる全画面データから一画面のみをフィルタリングする必要がある。
87 シングルディスプレイサイズは、個々のクライアントでしか取得できない。 84 シングルディスプレイサイズは、個々のクライアントでしか取得できない。
88 配信側は画面の切り替えを行う際に、シングルディスプレイサイズを取得する。 85 なので、配信側は画面の切り替えを行う際に、シングルディスプレイサイズを取得し、
89 そして、root へ送信する画面切り替えの要求メッセージ SERVER\_CHANGE\_REQUEST に 86 root へ送信する画面切り替えを要求する SERVER\_CHANGE\_REQUEST message に
90 シングルディスプレイサイズを付加する。 87 シングルディスプレイサイズを付加する様にした。
91 88
89 % もっと詳しく
90 % initDataとはなんなのか
92 root はメッセージを受け取り initData を変更する。 91 root はメッセージを受け取り initData を変更する。
93 本来 initData は、RFB プロトコルで行われる通信中に VNCServer から受信する ServerInit message から生成される。 92 initData は、RFB プロトコルで行われる通信中に VNCServer が送信するServerInit message から生成される。
94 マルチディスプレイの場合、ServerInit message は全画面サイズ様に生成されている。 93 画像データが送られてくる前段階で、これから送信されるデータの情報を取得し、描画の準備をする。
95 なので、そのままの initData を使用すると複数画面全体を描画してしまう。 94 ServerInit messageに含まれているデータは、
95 配信先の画面サイズ、pixel format、配信先のPCの名前である。
96
97 マルチディスプレイの場合、VNCServerは複数画面全体のサイズを送信する。
98 そのまま initData を使用すると複数画面全体を描画することになる。
96 それを避けるため、initData をシングルディスプレイサイズ用の originalInitData に生成し直す。 99 それを避けるため、initData をシングルディスプレイサイズ用の originalInitData に生成し直す。
97 図\ref{fig:initdata}の様に、root は接続されている node へ originalInitData を送信する。 100 図\ref{fig:initdata}の様に、root は接続されている node へ originalInitData を送信する。
98 101
99 \begin{figure}[htpd] 102 \begin{figure}[htpd]
100 \begin{center} 103 \begin{center}
102 \end{center} 105 \end{center}
103 \caption{シングルディスプレイサイズ用の initData} 106 \caption{シングルディスプレイサイズ用の initData}
104 \label{fig:initdata} 107 \label{fig:initdata}
105 \end{figure} 108 \end{figure}
106 109
107 さらに VNCServer から送信されてきた全画面データをそのまま node に流すのではなく、
108 シングルディスプレイサイズの領域の更新部分のみを root 側でフィルタリングし流す。
109 これにより、一画面のみの表示が可能となる。 110 これにより、一画面のみの表示が可能となる。
110 111
111 112
112 \section{Retina のマルチディスプレイ対応} 113 \section{Retina のマルチディスプレイ対応}
114 Retina ディスプレイでシングルディスプレイを配信しようとした場合、
115 originalInitDataが正しく生成されない問題が発生した。
116
113 Retina ディスプレイ等の高解像度ディスプレイには、 117 Retina ディスプレイ等の高解像度ディスプレイには、
114 より画素密度を高く表示する HiDPI (High-dot per inch) モードがある。 118 より画素密度を高く表示する HiDPI (High-dot per inch) モードがある。
115 HiDPI モードの場合、 119 HiDPI モードの場合、
116 PC で設定する解像度に対して縦横2倍の画像データを表示している。 120 PC で設定する解像度に対して縦横2倍の画像データを表示している。
117 121
118 HiDPIモードを使用しているPCが配信者の場合、
119 シングルディスプレイのフィルタリングに失敗してしまう問題が発生した。
120
121 % ここらへん怪しいような気がするけど頭が働かない
122 % 「2倍のサイズになると何が問題なの」という問いにちゃんと答えられてる??
123 シングルディスプレイ対応のため、originalInitDataを生成するが、
124 今までのシングルディスプレイサイズの取得方法では正しいサイズを取得できないことが原因となっていた。 122 今までのシングルディスプレイサイズの取得方法では正しいサイズを取得できないことが原因となっていた。
125 シングルディスプレイサイズを取得すると PC で設定する解像度のサイズになるが、 123 シングルディスプレイサイズとしてPCで設定している解像度のサイズを取得していた。
126 VNCServer から送信される画像データサイズは解像度の2倍のサイズになっており、ズレが生じたためである。 124 しかし、HiDPIモードの場合、VNCServer から送信される画像データサイズは、
127 125 解像度の2倍のサイズになっており、ズレが生じたためである。
128 マルチディスプレイ対応のためには、 126
129 シングルディスプレイサイズを VNCServer から送信される画像データサイズに合わせなければならない。 127 問題を解決するために、HiDPI モードであるかどうかを検知する必要がある。
130 そこで、HiDPI モードであるかどうかを検知する必要がある。
131
132 VNCServer は、接続されているディスプレイサイズを合わせて画像データを送信してくる。
133 HiDPI モードであるかどうかを検知には、1枚目以降のディスプレイサイズが必要となる。
134
135 以下に、HiDPI モードの取得方法を記述する。 128 以下に、HiDPI モードの取得方法を記述する。
136 129
137 \begin{itemize} 130 \begin{itemize}
138 \item VNCServer から送信される width は図\ref{fig:singledisplaywidth}の VNCServer Single width である 131 \item VNCServer から送信される width は図\ref{fig:singledisplaywidth}の VNCServer Single width である
139 \item VncServer Single width から、図\ref{fig:singledisplaywidth}の 2nd Single width を引く 132 \item VncServer Single width から、図\ref{fig:singledisplaywidth}の 2nd Single width を引く