Mercurial > hg > Papers > 2015 > oc-thesis
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 を引く |