changeset 32:77951f2269aa

fix TileLoop explain
author riono <e165729@ie.u-ryukyu.ac.jp>
date Sun, 16 Feb 2020 05:27:40 +0900
parents 37ad9420dc84
children f93a34243a0b
files FinalThesis/appendix.tex FinalThesis/chapter2.tex FinalThesis/chapter3.tex FinalThesis/fig/Blocking.graffle FinalThesis/fig/Blocking.pdf FinalThesis/fig/TileLoopFlow.graffle FinalThesis/fig/TileLoopFlow.pdf FinalThesis/main.pdf FinalThesis/main.tex
diffstat 9 files changed, 87 insertions(+), 38 deletions(-) [+]
line wrap: on
line diff
--- a/FinalThesis/appendix.tex	Sun Feb 16 01:21:40 2020 +0900
+++ b/FinalThesis/appendix.tex	Sun Feb 16 05:27:40 2020 +0900
@@ -1,13 +1,13 @@
 \chapter*{付録}
 \thispagestyle{empty}
-\newgeometry{top=-5mm,left=3mm,bottom=1mm}
+\newgeometry{top=-5mm,left=15mm,bottom=1mm}
 
 
 
 %\thispagestyle{empty}
 \begin{figure}[h] %PDF
 \begin{center}
-\includegraphics[scale=1, page=1]{riono-sigos.pdf}
+\includegraphics[scale=0.9, page=1]{riono-sigos.pdf}
 \end{center}
 \end{figure}
 
@@ -15,29 +15,30 @@
 
 \begin{figure}[h] %PDF
 \begin{center}
-\includegraphics[scale=1, page=3]{riono-sigos.pdf}
+\includegraphics[scale=0.9, page=3]{riono-sigos.pdf}
+\end{center}
+\end{figure}
+
+\thispagestyle{empty}
+\begin{figure}[p] %PDF
+\begin{center}
+\includegraphics[scale=0.9, page=4]{riono-sigos.pdf}
 \end{center}
 \end{figure}
 
 \thispagestyle{empty}
 \begin{figure}[p] %PDF
 \begin{center}
-\includegraphics[scale=1, page=4]{riono-sigos.pdf}
+\includegraphics[scale=0.9, page=5]{riono-sigos.pdf}
 \end{center}
 \end{figure}
 
 \thispagestyle{empty}
 \begin{figure}[p] %PDF
 \begin{center}
-\includegraphics[scale=1, page=5]{riono-sigos.pdf}
+\includegraphics[scale=0.9, page=6]{riono-sigos.pdf}
 \end{center}
 \end{figure}
 
-\thispagestyle{empty}
-\begin{figure}[p] %PDF
-\begin{center}
-\includegraphics[scale=1, page=6]{riono-sigos.pdf}
-\end{center}
-\end{figure}
+\restoregeometry
 
-
--- a/FinalThesis/chapter2.tex	Sun Feb 16 01:21:40 2020 +0900
+++ b/FinalThesis/chapter2.tex	Sun Feb 16 05:27:40 2020 +0900
@@ -134,7 +134,7 @@
 
 ZLRE(Zlib Run-Length Encoding)とは可逆圧縮可能なZlib形式\cite{zlib}とRun-Length Encoding方式を組み合わせたエンコードタイプである。
 
-ZLREはZlibで圧縮されたデータとそのデータのバイト数がヘッダーとして付与され送信される。Zlibはjava.util.zip.deflaterとjava.util.zip.inflaterで圧縮と解凍が行える。しかしjava\.util.zip.deflaterは解凍に必要な辞書を書きだす(flush)ことが出来ない。従って、圧縮されたデータを途中から受け取ってもデータを正しく解凍することが出来ない(図\ref{fig:ZRLE})。
+ZLREはZlibで圧縮されたデータとそのデータのバイト数がヘッダーとして付与され送信される。Zlibはjava.util.zip.deflaterとjava.util.zip.inflaterで圧縮と解凍が行える。しかしjava.util.zip.deflaterは解凍に必要な辞書を書きだす(flush)ことが出来ない。従って、圧縮されたデータを途中から受け取ってもデータを正しく解凍することが出来ない(図\ref{fig:ZRLE})。
 
 \begin{figure}[htb] %PDF
 \begin{center}
--- a/FinalThesis/chapter3.tex	Sun Feb 16 01:21:40 2020 +0900
+++ b/FinalThesis/chapter3.tex	Sun Feb 16 05:27:40 2020 +0900
@@ -16,16 +16,15 @@
 \end{center}
 \end{figure}
 
-\newpage
 
 WifiのMulticast Packetのサイズは64KByteが最大となっている。4Kディスプレイを例にとると、4Kディスプレイの大きさの画面更新には8MByte(画素数) \* 8Byte(色情報)で圧縮前で、64MByte程度となる。
 
 
 \section{Update Rectangleの構成}
-RFBのUpdate Rectangleは以下の表\ref{tb:updateRectangle}の構成となっている。
+RFBのUpdate Rectangleによって送られてくるPacketは以下の表\ref{tb:updateRectangle}の構成となっている。
 
 \begin{table}[htp]
-    \caption{UpdateRectangleの構成}
+    \caption{UpdateRectangleによるPacketの構成}
     \begin{center}
     \begin{tabular}{|rrr|l|} \hline
         1 byte & & & messageID    \\
@@ -44,12 +43,12 @@
     \label{tb:updateRectangle}
 \end{table}
 
-1つのUpdate Rectangleには複数のRectangleが入っており、さらに1つ1つのRectangleにはx,y座標や縦横幅、encoding type が含まれているRectangle Headerを持っている。ここではZRLEで圧縮されたRectangleが1つ、VNCサーバから送られてくる。RectangleにはZlib圧縮されたデータが、datelengthsと呼ばれる指定された長さだけ付いてくる。このデータは、さらに64x64のtileに分割されている(図\ref{fig:BlockingUpdateRectangle}中 Tile)。
+1つのUpdate Rectangleには複数のRectangleが入っており、さらに1つ1つのRectangleにはx,y座標や縦横幅、encoding type が含まれているRectangle Headerを持っている。ここではZRLEで圧縮されたRectangleが1つ、VNCサーバから送られてくる。RectangleにはZlib圧縮されたデータが、datelengthsと呼ばれる指定された長さだけ付いてくる。このデータは、さらに64x64のTileに分割されている(図\ref{fig:BlockingUpdateRectangle}中 Tile)。
 
 \newpage
 
-tile内はパレットなどがある場合があるが、通常はRun Length encodeされたRGBデータである。
-これまでのTreeVNCではVNCサーバから受け取ったRectangleを分割せずにZRLEEへ再構成を行なっていた。これをMluticastのためにデータを64KByteに収まる最大3つのRectangleに再構成する(図\ref{fig:BlockingUpdateRectangle})。この時にtile内部は変更する必要はないが、Rectangleの構成は変わる。ZLREを展開しつつ、Packetを構成する必要がある。
+Tile内はパレットなどがある場合があるが、通常はRun Length encodeされたRGBデータである。
+これまでのTreeVNCではVNCサーバから受け取ったRectangleを分割せずにZRLEEへ再構成を行なっていた。これをMluticastのためにデータを64KByteに収まる最大3つのRectangleに再構成する(図\ref{fig:BlockingUpdateRectangle})。この時にTile内部は変更する必要はないが、Rectangleの構成は変わる。ZLREを展開しつつ、Packetを構成する必要がある。
 
 
 \begin{figure}[htb] %PDF
@@ -60,10 +59,7 @@
 \end{center}
 \end{figure}
 
-
-Zlibは丁度良い所で圧縮をflushする必要がある。このためには、ZlibのAPIを用いて、適当なタイミングでflushを呼ぶ。この時に1tileずつflushしてしまうと圧縮率を下げる可能性がある。
-
-64KByteのPacketの中には複数のtileが存在するが、連続してRectangleを構成する必要がある。3つの
+64KByteのPacketの中には複数のTileが存在するが、連続してRectangleを構成する必要がある。3つの
 Rectangleの構成を下記に示す。
 
 \begin{itemize}
@@ -75,11 +71,44 @@
 \newpage
 
 \section{TileLoop}
-Rectangleの再構成、Multicast Packetの構築にはTileLoopというループ内で行なっている。TileRoopは64x64の大きさであるtileを1つずつ処理していく。以下の図\ref{fig:TileLoopFlow}にTileRoopのフローチャートを示す。
+TileLoopはVNCサーバから受け取ったZRLEを図\ref{fig:BlockingUpdateRectangle}のようにRectangleを分割し、ZRLEEに再圧縮を行ったPacketを生成する。
+
+以下の図\ref{fig:Packet}にTileLoopで生成されるPacket全体と、分割される各PhaseのRectangleを示した。
+
+\begin{figure}[htb] %PDF
+\begin{center}
+\includegraphics[scale=0.45]{fig/Blocking.pdf}
+\figcaption{ZRLEEのPacketの構成と分割されたRectangle}
+\label{fig:Packet}
+\end{center}
+\end{figure}
+
+
+Packet Headerには表\ref{tb:updateRectangle}に示したmessageID、padding、n of rectanglesが格納されている。また、分割されたRectangleにはそれぞれ表\ref{tb:rectangleheader}に示したRectangle Headerを持っている。
+
+\begin{table}[htp]
+    \caption{Rectangle Headerの構成}
+    \begin{center}
+    \begin{tabular}{|rr|l|} \hline
+         2 byte &  & U16 - x-position  \\
+         2 byte &  & U16 - y-position  \\
+         2 byte &  & U16 - width  \\
+         2 byte &  & U16 - height  \\
+         4 byte &  & S32 - encoding-type  \\
+         4 byte &  & U32 datalengths   \\ \hline
+        &   1 byte & subencoding of tile     \\
+        &   n byte & Run Length Encoded Tile \\ \hline
+    \end{tabular}
+    \end{center}
+    \label{tb:rectangleheader}
+\end{table}
 
 \newpage
 
-\begin{figure}[tp] %PDF
+次にTileLoopの処理について説明する。以下の図\ref{fig:TileLoopFlow}はTileRoopのフローチャートである。
+
+
+\begin{figure}[hp] %PDF
 \begin{center}
 \includegraphics[scale=0.5]{fig/TileLoopFlow.pdf}
 \figcaption{TileLoopのフローチャート}
@@ -87,23 +116,42 @@
 \end{center}
 \end{figure}
 
-TileLoopにはc1Rectと呼ばれるRectangleを持っている。これは読み込んだTile分だけ拡張していくことでRectangleの再構成を行うことができる。Phaseが変わるとこれまでに構成されたc1RectをHeaderに書き出し、c1Rectを初期化する。
+
+図\ref{fig:TileLoopFlow} 中1にて、TileLoopの初期化でBlockingと構築するPacketの準備を行う。Loop本体ではZRLEで受け取ったRecganleを1Tile 64x64に分割し、1Tileずつ処理を行う。そして受け取ったZRLEより処理を行うTileのデータを取得し、圧縮段階に入る。
+
+
+TileLoopにはc1Rectと呼ばれるRectangleを持っている。これは読み込んだTile分だけ縦横を拡張していくことによってRectangleの再構成を行なっている。図\ref{fig:TileLoopFlow} 中2の圧縮段階では、読み込んだTileのデータを圧縮用のStreamに格納し、java.util.zip.deflaterを利用して圧縮を行っている。Packetのサイズは60KByteとしているが、一旦の制限として42KByteまでを格納可能としている。
+
+java.util.zip.deflaterには下記の3種類の圧縮方法がある。
+
+\begin{itemize}
+\item NO\_FLUSH : Streamに格納されたデータを最高率で圧縮を行う。Streamにある入力データが規定量に満たない場合は圧縮されない
+\item SYNC\_FLUSH : これまでにStreamに格納されたデータの圧縮を行う。ただし圧縮率が低下する可能性がある
+\item FULL\_FLUSH : SYNC\_FLUSH同様、これまでにStreamに格納されたデータの圧縮を行う。異なる点はこれまでの辞書情報がリセットされるため、圧縮率が極端に低くなる可能性がある
+\end{itemize}
+
+ZRLEとjava.util.zip.deflaterを使用した圧縮では、圧縮後のデータ長を予測することができない。Packetが満杯になってしまうと、圧縮書き込みの途中であっても圧縮書き込みが中断する。そのため、Packetのサイズを余分に確保する必要がある。したがって最初から最大の60KByteではなく、42KByteに制限を行っている。TileLoopではデータの圧縮にNO\_FLUSHを利用していたが、圧縮後のデータがPacketの上限である60KByteを超えてしまうことが多発した。
+
+これは圧縮されるための入力データの規定量が想定以上に多く、圧縮後のデータ長がMulticast Packetの上限を越えてしまったためである。
+
+そこで圧縮率は悪くなるが、確実にPacketに書き込まれるSYNC\_FLUSHを利用し、ZRLEEの生成を行う。
 
 \newpage
 
-次に、Packetの構成と各Phaseとの関係性を下記の図\ref{fig:Packet}に示す。
+
+図\ref{fig:TileLoopFlow} 中3ではPacketの上限まで行かなかった場合の分岐である。
 
-\begin{figure}[htb] %PDF
-\begin{center}
-\includegraphics[scale=0.5]{fig/Blocking.pdf}
-\figcaption{RectangleとPacketの構成}
-\label{fig:Packet}
-\end{center}
-\end{figure}
+
+Phaseが変わるとそれまでに構成されたc1RectをRectangle Headerに書き出している。
+
 
 \newpage
 
-PacketにはMassage IDなどが入っているPacket Headerの他に、各RectangleのHeaderであるRectangle Headerが付いている。
+
+
+
+
+PacketにはMessage IDなどが入っているPacket Headerの他に、各RectangleのHeaderであるRectangle Headerが付いている。
 
 また、Phaseが変わるごとにRectangle を構成し直す必要があるため、各Phaseの終了時には確実にflushをする必要がある。
 
Binary file FinalThesis/fig/Blocking.graffle has changed
Binary file FinalThesis/fig/Blocking.pdf has changed
Binary file FinalThesis/fig/TileLoopFlow.graffle has changed
Binary file FinalThesis/fig/TileLoopFlow.pdf has changed
Binary file FinalThesis/main.pdf has changed
--- a/FinalThesis/main.tex	Sun Feb 16 01:21:40 2020 +0900
+++ b/FinalThesis/main.tex	Sun Feb 16 05:27:40 2020 +0900
@@ -1,6 +1,7 @@
 \documentclass[a4j,12pt]{jreport}
 %\usepackage[dvips]{graphicx}
 \usepackage[dvipdfmx]{hyperref,graphicx}
+\usepackage{geometry}
 \usepackage{mythesis}
 \usepackage{multirow}
 \usepackage{here}
@@ -10,8 +11,7 @@
 \usepackage{scalefnt}
 \usepackage{listings}
 \usepackage{caption}
-\usepackage{layout}
-\usepackage{geometry}
+
 
 
 
@@ -111,7 +111,7 @@
 \addcontentsline{toc}{chapter}{参考文献}
 
 % 謝辞
-\input{thanks.tex}
+%\input{thanks.tex}
 
 % 付録
 \input{appendix.tex}