# HG changeset patch # User riono # Date 1581798460 -32400 # Node ID 77951f2269aa97a22a89e0f6b99586c5491ef256 # Parent 37ad9420dc840b2908a65ff6094c32a4c518e2a0 fix TileLoop explain diff -r 37ad9420dc84 -r 77951f2269aa FinalThesis/appendix.tex --- 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 - diff -r 37ad9420dc84 -r 77951f2269aa FinalThesis/chapter2.tex --- 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} diff -r 37ad9420dc84 -r 77951f2269aa FinalThesis/chapter3.tex --- 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をする必要がある。 diff -r 37ad9420dc84 -r 77951f2269aa FinalThesis/fig/Blocking.graffle Binary file FinalThesis/fig/Blocking.graffle has changed diff -r 37ad9420dc84 -r 77951f2269aa FinalThesis/fig/Blocking.pdf Binary file FinalThesis/fig/Blocking.pdf has changed diff -r 37ad9420dc84 -r 77951f2269aa FinalThesis/fig/TileLoopFlow.graffle Binary file FinalThesis/fig/TileLoopFlow.graffle has changed diff -r 37ad9420dc84 -r 77951f2269aa FinalThesis/fig/TileLoopFlow.pdf Binary file FinalThesis/fig/TileLoopFlow.pdf has changed diff -r 37ad9420dc84 -r 77951f2269aa FinalThesis/main.pdf Binary file FinalThesis/main.pdf has changed diff -r 37ad9420dc84 -r 77951f2269aa FinalThesis/main.tex --- 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}