changeset 2:dcaa3015e0d5

Add bind Description.
author Kazuma Takeda
date Tue, 07 Feb 2017 20:41:22 +0900
parents 1b164c22312b
children 6ff8188a7cfa
files JungleforUnity.xmind memo/memo.md paper/images/GameTree.graffle paper/images/itemTree.graffle paper/images/nonDestractTreeEdit.pdf paper/main.tex
diffstat 6 files changed, 343 insertions(+), 149 deletions(-) [+]
line wrap: on
line diff
Binary file JungleforUnity.xmind has changed
--- a/memo/memo.md	Fri Jan 20 08:22:22 2017 +0900
+++ b/memo/memo.md	Tue Feb 07 20:41:22 2017 +0900
@@ -9,3 +9,18 @@
 やりたいこと
 - 極力手間は省きたい
 - Jungleも作って、ゲームも構築してと言うのは結構無駄
+
+
+1/28
+fmapの作成
+データの格納方法
+Database/Alice/src/DataSegument/ReceviData.javaを見ればOK
+http://www.cr.ie.u-ryukyu.ac.jp/hg/Database/Alice/file/8a9fd716c335/src/main/java/alice/datasegment/ReceiveData.java
+
+objectに入れて、asClassで取り出す
+取り出すときは型を指定する必要ある
+
+1/31
+Haskellのfold(畳み込みを使う)
+Listを投げて処理を実行させるといい
+2つの引数でいいので(Lambda l, List)
Binary file paper/images/GameTree.graffle has changed
Binary file paper/images/itemTree.graffle has changed
Binary file paper/images/nonDestractTreeEdit.pdf has changed
--- a/paper/main.tex	Fri Jan 20 08:22:22 2017 +0900
+++ b/paper/main.tex	Tue Feb 07 20:41:22 2017 +0900
@@ -75,24 +75,181 @@
 
 % はじめに
 
-\chapter{研究目的}
+% 1章では研究目的を書かない(もったいない)
+\chapter{ゲームエンジンにおけるデータベース}
 
-プログラムからデータを分離して扱うデータベースには、プログラム中のデータ構造とRDBの表構造のズレによりインピーダンスミスマッチという問題がある。
+プログラムからデータを分離して扱うデータベースには、
+プログラム中のデータ構造とRDBの表構造のズレによりインピーダンスミスマッチという問題がある。
 
-データベースのレコードをプログラム中のオブジェクトとして扱えるORMapperやデータベース自体も、表に特化したKey Value Storeや、Json、XMLの不定形のデータ構造を格納するように機能拡張されている。
+例えばRPGゲーム中のユーザが持つアイテムという単純なものでも、RDBではユーザとアイテムの組をキーとする巨大な表として管理することになる。
+プログラム中では、ユーザが持つアイテムリストという簡単な構造を持つが、第一正規形を要求するRDBではネスト構造を許さない。
 
-ORMapperではデータベースのレコードをプログラム中のオブジェクトとして扱うことができる。オブジェクトに対する操作を行うとORMapperがSQLを発行し、処理を行ってくれる。
+ORMapperではデータベースのレコードをプログラム中のオブジェクトにマッピングし扱うことができる。
+オブジェクトに対する操作を行うとORMapperがSQLを発行し、処理を行ってくれる。
 
-しかしレコードをプログラム中のオブジェクトを対応させるORMapperの技術でインピーダンスミスマッチを解決することはできない。
+しかしレコードをプログラム中のオブジェクトを対応させるORMapperの技術でインピーダンスミスマッチの本質的な部分を解決することはできない。
 
 JsonやXMLを扱えるデータベースでは通常スキームを必要としないため、特に設計を行わずデータを格納することができる。
 
 しかし、不定形の構造の変更をトランザクションとして、Jsonの一括変更という形で処理されてしまっており、並列アプリケーションには向いていない。
 
-当研究室ではデータの変更の際に過去の木構造を保存する非破壊木構造データベースであるJungleを提案している\cite{1}。
+当研究室ではデータの変更の際に過去の木構造を保存するデータベースのJungleを提案している\cite{1}。
 
 本研究ではJungleをUnityを用いたゲームで使用する方法を提案する。
-データベースとしてJungle DBをC\#で再実装を行い、Unity向けに組み込みを行う。
+データベースとしてJungle DatabaseをC\#で再実装を行い、Unity向けに組み込みを行う。
+
+\chapter{Jungle Database の概念}
+
+当研究室で開発しているJungleは過去の木を保存しつつ、新しい木を構成する手法を採用している。
+これを非破壊的木構造という。
+非破壊的木構造により、データベースを参照する側と更新する側のデータを安全に扱うことができる。
+
+JungleDatabaseは木の集合からなり、名前で管理される。
+木はノードの集合から出来ている。
+ノードにはKeyとValueの組からなるデータを持つことができる。
+これはデータベースのレコードに相当する。
+
+通常のデータベースと違う点として子のノードを持つことである。
+
+Jungleは、データの変更を一度生成した木を上書きせず、ルートから編集を行うノードまでのコピーを行い、新しく木構造を構築し、そのルートをアトミックに入れ替える{図\ref{nonDestractTreeEdit}}。
+これを非破壊的木構造と呼ぶ。非破壊木構造は新しい木を構築している時にも、現在の木を安全に読み出せるという大きな特徴がある。
+しかし、書き込みの手間は大きくなる。
+
+\begin{figure}[h]
+\begin{center}
+\includegraphics[height = 3cm , bb=0 0 511 188]{images/nonDestractTreeEdit.pdf}
+\caption{非破壊的木構造の木の編集}
+\label{nonDestractTreeEdit}
+\end{center}
+\end{figure}
+
+\section{Jungle Database の構造}
+
+非破壊木構造を採用しているJungleでは、木の変更の手間はO(1)からO(n)となり得る。
+つまりアプリケーションに合わせて木を設計しない限り充分な性能を出すことは出来ない。
+逆に木の設計を行えば高速な処理が可能である。
+
+Jungleはオンメモリで使用することを考えており、一度木のルートを取得すれば、その上で木構造として自由にアクセスしてもよい。
+
+Jungleはcommit logを持ち、それを他のノードやディスクに転送することにより、分散構成と持続性を実現する。
+
+\section{JungleDatabaseのAPI}
+
+\subsection{Jungleの木}
+
+Jungleは複数の木の名前を利用し、管理しており、名前により生成、編集を行う。
+以下にJungleクラスが提供している木の生成、管理を行うAPI(表\ref{jungleTree})に記述する。
+
+\begin{table}[htb]
+\begin{center}
+\caption{Jungleに実装されているAPI}
+\begin{tabular*}{\textwidth}{|l|l|}        \hline
+{\tt JungleTree  createNewTree(string treeName) } & Jungleに新しく木を生成する。木の名前が重複した場合、生成に失敗しnullを返す。     \\ \hline
+{\tt JungleTree getTreeByName(string treeName)}   & JungleからtreeNameと名前が一致するtreeを取得する。名前が一致するTreeがない場合取得は失敗しnullを返す       \\ \hline
+\end{tabular*}
+\label{jungleTree}
+\end{center}
+\end{table}
+
+\subsection{TreeNode}
+
+Jungleが保有する木は、複数のノードの集合で出来ている。
+ノードは、自身の子のList、属性名と属性値の組のデータを持つ。
+ノードに対するアクセスは表\ref{treeNodeAPI}に記述されているAPIを用いて行う。
+
+\begin{table}[htb]
+\begin{center}
+\caption{TreeNodeに実装されているAPI}
+\begin{tabular}{|p{8em}|p{14em}|}                                  \hline
+{\tt Children getChildren()} & ノードの子供を扱うChildrenオブジェクトを返す。\\ \hline
+{\tt Attribute getAttribute()} &ノードが保持しているデータを扱うAttribteオブジェクトを返す。    \\ \hline
+\end{tabular}
+\label{treeNodeAPI}
+\end{center}
+\end{table}
+
+\subsection{Either}
+
+jungleでは例外処理を投げる時にEitherクラスを用いて行う。返って来たEitherのオブジェクトに対して、{\tt isA() }で{\tt Error}かどうかをチェックする。
+{\tt Error}でない場合は{\tt b()}で対象のオブジェクトを取り出す事ができる。
+
+以下にルートノードの2番目の子どもを取ってくるのEitherのサンプルコードを記述する。
+
+\begin{lstlisting}[frame=lrbt,numbers=left,label=getAttributeCode]
+Either<Error,TreeNode> either = children.at(2);
+if (either.isA()) 
+    return either.a();
+TreeNode child = either.b();
+\end{lstlisting}
+
+
+\subsection{ChildrenとAttribute}
+
+Childrenクラスへのアクセスは表\ref{Children}に記述されているAPIを、Attributeクラスへアクセスは表\ref{Attribute}に記述されているAPIを用いて行う。
+
+\begin{table}[htb]
+\begin{center}
+\caption{Childrenに実装されているAPI}
+\begin{tabular}{|p{8em}|p{14em}|}                                  \hline
+{\tt int size()}  &  子供の数を返す。\\ \hline
+{\tt <Either Error,TreeNode> at(int num)} &ノードが持つ子供の中から、 変数{\tt num}で指定された位置にある子ノードを返す。   \\ \hline
+\end{tabular}
+\label{Children}
+\end{center}
+\end{table}
+
+\begin{table}[htb]
+\begin{center}
+\caption{Attributeに実装されているAPI}
+\begin{tabular}{|p{10em}|p{12em}|} \hline
+{\tt T get<T>(string key)}   &ノードが持つ値から、属性名 {\tt key}とペアの属性値を{\tt Generic}型で返す。 \\ \hline
+{\tt string getString(string key)} &ノードが持つ値から、属性名 {\tt key} とペアの属性値を{\tt string}型で返す。 \\ \hline
+\end{tabular}
+\label{Attribute}
+\end{center}
+\end{table}
+
+\subsection{NodePath}
+
+Jungleでは、木のノードの位置を{\tt NodePath}クラスを使って表す。
+{\tt NodePath}クラスはルートノードからスタートし、対象のノードまでの経路を、数字を用いて指し示すことで対象のノードの場所を表す。また、ルートノードは例外として-1と表記される。
+{\tt NodePath}クラスが{\tt < -1,1,2,3>} を表している際の例を図\ref{NodePath}に記す。
+\begin{figure}[h]
+\begin{center}
+\includegraphics[height = 6cm , bb=0 0 568 455]{images/nodePath.pdf}
+\caption{NodePath}
+\label{NodePath}
+\end{center}
+\end{figure}
+
+\subsection{木の編集}
+
+Jungleの木の編集は{\tt JungleTreeEditor}クラスを用いて行われる。
+{\tt JungleTreeEditor}クラスには編集を行うために、表\ref{editor}に記述されているAPIを用いて行う。
+
+\begin{table}[htb]
+\begin{center}
+\caption{Editorに実装されているAPI}
+\begin{tabular}{|p{8em}|p{14em}|}        \hline
+{\tt Either<Error, JungleTreeEditor> addNewChildAt( NodePath path, int pos)} &
+変数{\tt path}で指定した場所にある、ノードの子供の変数{\tt pos}で指定した位置子ノードを追加する\\ \hline
+{\tt Either<Error, JungleTreeEditor> deleteChildAt( NodePath path, int pos)}      &
+変数{\tt path}で指定した場所にある、ノードの子供の変数{\tt pos}で指定した位置の子ノードを削除する。 \\ \hline
+{\tt Either<Error, JungleTreeEditor> putAttribute( NodePath path, string key, byte[] value)} &
+変数{\tt path}で指定した場所にあるノードに、属性名 変数{\tt key} 属性値 変数{\tt value} のペアで値を挿入する。 \\ \hline
+{\tt Either< Error, JungleTreeEditor> deleteAttribute( NodePath path, string key)}&
+変数{\tt path}で指定した場所にあるノードが持つ、属性名 変数{\tt key}とペアで保存されているデータを削除する。\\ \hline
+{\tt Either<Error, JungleTreeEditor> commit()}  &
+木へ行った変更をコミットする。自分が編集を行っていた間に、他のJungleTreeEditorクラスによって木が更新されていた場合、コミットは失敗する。 \\ \hline
+\end{tabular}
+\label{editor}
+\end{center}
+\end{table}
+
+編集を行った後は、関数{\tt editor.commit()}で今までの編集をコミットすることができる。他の{\tt JungleTreeEditor}クラスによって木が更新されていた場合はコミットは失敗し、{\tt commit()}は{\tt Error}を返す。
+その場合は、木の編集を最初からやり直す必要がある。
+
+
 
 \label{chap:introduction}
 \pagenumbering{arabic}
@@ -112,9 +269,15 @@
 
 \section{Unityにおけるデータベース}
 
-Unityでのデータベースとして考えられるものとしてはMySQL、SQlite3、PlayerPrefsが挙げられる。
+Unityでのデータベースとして考えられるものとしてはMySQL、SQLite3、PlayerPrefsが挙げられる。
+
+PlayerPrefsとは、Unityに特化したバイナリ形式でKeyとValueのみで保存されるものである。
+セーブ機能に特化していてメモリ上にDBを展開するものではない。
 
-PlayerPrefsとは、Unityに特化したバイナリ形式でKeyとValueのみで保存されるものである。セーブ機能に特化していてメモリ上にDBを展開するものではない。
+SQLite3ではC\#で利用できるORMapperが提供されている。
+プログラム中からデータのインサートやデリートを行う。
+
+%% 最近ではUnityでもJsonが扱えるようになった。
 
 \chapter{Jungle-Sharpの実装}
 
@@ -201,152 +364,63 @@
 }
 \end{itembox}
 
-\chapter{Jungle Database の概念}
-
-Jungleは名前付きの複数の木の集合からなり、木は複数のノードの集合で出来ている。
-ノードは自身の子のリストと属性名と属性値の組でデータを持つ。
-これはデータベースのレコードに相当する。
-通常のレコードと異なるのは、ノードに子どもとなる複数のノードがつくところである。
-
-Jungleは、データの変更を一度生成した木を上書きせず、ルートから編集を行うノードまでのコピーを行い、新しく木構造を構築し、そのルートをアトミックに入れ替える{図\ref{nonDestractTreeEdit}}。
-これを非破壊的木構造と呼ぶ。非破壊木構造は新しい木を構築している時にも、現在の木を安全に読み出せるという大きな特徴がある。
-しかし、書き込みの手間は大きくなる。
+\section{bindの実装}
 
-\begin{figure}[h]
-\begin{center}
-\includegraphics[height = 2.5cm , bb=0 0 511 188]{images/nonDestractTreeEdit.pdf}
-\caption{非破壊的木構造の木の編集}
-\label{nonDestractTreeEdit}
-\end{center}
-\end{figure}
-
-\section{Jungle Database の構造}
+Jungleではデータの編集を行った後、Eitherを用いてエラーのチェックを行う。
+エラーがあればエラーが包まれたEitherが返される。
+エラーがない場合は指定した型のオブジェクトがEitherに包まれて返される。
 
-非破壊木構造を採用しているJungleでは、木の変更の手間はO(1)からO(n)となり得る。つまりアプリケーションに合わせて木を設計しない限り充分な性能を出すことは出来ない。逆に木の設計を行えば高速な処理が可能である。
-
-Jungleはオンメモリで使用することを考えており、一度木のルートを取得すれば、その上で木構造として自由にアクセスしてもよい。
-
-Jungleはcommit logを持ち、それを他のノードやディスクに転送することにより、分散構成と持続性を実現する。
+これは関数型プログラミング言語、Haskellから採用したものである。
 
-\section{JungleDatabaseのAPI}
-
-\subsection{Jungleの木}
-
-Jungleは複数の木の名前を利用し、管理しており、名前により生成、編集を行う。
-以下にJungleクラスが提供している木の生成、管理を行うAPI(表\ref{jungleTree})に記述する。
+編集を行うたび、Eitherのチェックbindで行うことにより、より関数型プログラミングに特化した書き方が可能になる。
+C\#で実装したbindは以下に記述する。
 
-\begin{table}[htb]
-\begin{center}
-\caption{Jungleに実装されているAPI}
-\begin{tabular}{|p{10em}|p{12em}|}        \hline
-{\tt JungleTree  createNewTree(string treeName) } & Jungleに新しく木を生成する。木の名前が重複した場合、生成に失敗しnullを返す。     \\ \hline
-{\tt JungleTree getTreeByName(string treeName)}   & JungleからtreeNameと名前が一致するtreeを取得する。名前が一致するTreeがない場合取得は失敗しnullを返す       \\ \hline
-\end{tabular}
-\label{jungleTree}
-\end{center}
-\end{table}
-
-\subsection{TreeNode}
-
-Jungleが保有する木は、複数のノードの集合で出来ている。
-ノードは、自身の子のList、属性名と属性値の組のデータを持つ。
-ノードに対するアクセスは表\ref{treeNodeAPI}に記述されているAPIを用いて行う。
+\begin{itembox}[l]{DefaultEither.cs}
+\scriptsize{
+\begin{verbatim}
+public Either<A, B> bind (System.Func<B, Either<A, B>> f) {
+    if (this.isA ()) {
+      return this;
+    }
 
-\begin{table}[htb]
-\begin{center}
-\caption{TreeNodeに実装されているAPI}
-\begin{tabular}{|p{8em}|p{14em}|}                                  \hline
-{\tt Children getChildren()} & ノードの子供を扱うChildrenオブジェクトを返す。\\ \hline
-{\tt Attribute getAttribute()} &ノードが保持しているデータを扱うAttribteオブジェクトを返す。    \\ \hline
-\end{tabular}
-\label{treeNodeAPI}
-\end{center}
-\end{table}
-
-\subsection{Either}
-
-jungleでは例外処理を投げる時にEitherクラスを用いて行う。返って来たEitherのオブジェクトに対して、{\tt isA() }で{\tt Error}かどうかをチェックする。
-{\tt Error}でない場合は{\tt b()}で対象のオブジェクトを取り出す事ができる。
-
-以下にルートノードの2番目の子どもを取ってくるのEitherのサンプルコードを記述する。
+    return f (this.b ());
+}
+\end{verbatim}
+}
+\end{itembox}
 
-\begin{lstlisting}[frame=lrbt,numbers=left,label=getAttributeCode]
-Either<Error,TreeNode> either = children.at(2);
-if (either.isA()) 
-    return either.a();
-TreeNode child = either.b();
-\end{lstlisting}
-
-\subsection{ChildrenとAttribute}
-
-Childrenクラスへのアクセスは表\ref{Children}に記述されているAPIを、Attributeクラスへアクセスは表\ref{Attribute}に記述されているAPIを用いて行う。
-
-\begin{table}[htb]
-\begin{center}
-\caption{Childrenに実装されているAPI}
-\begin{tabular}{|p{8em}|p{14em}|}                                  \hline
-{\tt int size()}  &  子供の数を返す。\\ \hline
-{\tt <Either Error,TreeNode> at(int num)} &ノードが持つ子供の中から、 変数{\tt num}で指定された位置にある子ノードを返す。   \\ \hline
-\end{tabular}
-\label{Children}
-\end{center}
-\end{table}
-
-\begin{table}[htb]
-\begin{center}
-\caption{Attributeに実装されているAPI}
-\begin{tabular}{|p{10em}|p{12em}|} \hline
-{\tt byte[] get(string key)}   &ノードが持つ値から、属性名 {\tt key}とペアの属性値を{\tt byte array}型で返す。 \\ \hline
-{\tt string getString(string key)} &ノードが持つ値から、属性名 {\tt key} とペアの属性値を{\tt string}型で返す。 \\ \hline
-\end{tabular}
-\label{Attribute}
-\end{center}
-\end{table}
-
-\subsection{NodePath}
+Eitherをチェックしつつデータを格納する例を以下に記述する。
+\begin{itembox}[l]{DataSaveTest.cs}
+\scriptsize{
+\begin{verbatim}
+System.Collection.Generic.List<BoxItemInfo> infoList = new System.Collection.Generic.List<BoxItemInfo> ();
+    infoList.Add (new BoxItemInfo (1, 2, "Grass", "#019540FF"));
+    infoList.Add (new BoxItemInfo (2, 4, "Wood", "#7F3C01FF"));
+    infoList.Add (new BoxItemInfo (3, 1, "Sand", "#D4500EFF"));
+    infoList.Add (new BoxItemInfo (4, 5, "Water", "#2432ADFF"));
 
-Jungleでは、木のノードの位置を{\tt NodePath}クラスを使って表す。
-{\tt NodePath}クラスはルートノードからスタートし、対象のノードまでの経路を、数字を用いて指し示すことで対象のノードの場所を表す。また、ルートノードは例外として-1と表記される。
-{\tt NodePath}クラスが{\tt < -1,1,2,3>} を表している際の例を図\ref{NodePath}に記す。
-\begin{figure}[h]
-\begin{center}
-\includegraphics[height = 6cm , bb=0 0 568 455]{images/nodePath.pdf}
-\caption{NodePath}
-\label{NodePath}
-\end{center}
-\end{figure}
-
-\subsection{木の編集}
-
-Jungleの木の編集は{\tt JungleTreeEditor}クラスを用いて行われる。
-{\tt JungleTreeEditor}クラスには編集を行うために、表\ref{editor}に記述されているAPIを用いて行う。
+    foreach (var info in infoList.Select((v, i) => new {v, i})) {
+      either = either.bind ((JungleTreeEditor arg) => {
+        return arg.addNewChildAt (path, info.i);
+      });
 
-\begin{table}[htb]
-\begin{center}
-\caption{Editorに実装されているAPI}
-\begin{tabular}{|p{8em}|p{14em}|}        \hline
-{\tt Either<Error, JungleTreeEditor> addNewChildAt( NodePath path,  int pos)} &
-変数{\tt path}で指定した場所にある、ノードの子供の変数{\tt pos}で指定した位置子ノードを追加する\\ \hline
-{\tt Either<Error, JungleTreeEditor> deleteChildAt( NodePath path,int pos)}      &
-変数{\tt path}で指定した場所にある、ノードの子供の変数{\tt pos}で指定した位置の子ノードを削除する。 \\ \hline
-{\tt Either<Error, JungleTreeEditor> putAttribute( NodePath path,String key,ByteBuffer value)} &
-変数{\tt path}で指定した場所にあるノードに、属性名 変数{\tt key} 属性値 変数{\tt value} のペアで値を挿入する。 \\ \hline
-{\tt Either< Error, JungleTreeEditor> deleteAttribute( NodePath path,String key)}&
-変数{\tt path}で指定した場所にあるノードが持つ、属性名 変数{\tt key}とペアで保存されているデータを削除する。\\ \hline
-{\tt Either<Error, JungleTreeEditor> commit()}  &
-木へ行った変更をコミットする。自分が編集を行っていた間に、他のJungleTreeEditorクラスによって木が更新されていた場合、コミットは失敗する。 \\ \hline
-\end{tabular}
-\label{editor}
-\end{center}
-\end{table}
+      either = either.bind ((JungleTreeEditor arg) => {
+        return arg.putAttribute (info.v);
+      });
+    }
+\end{verbatim}
+}
+\end{itembox}
 
-編集を行った後は、関数{\tt editor.commit()}で今までの編集をコミットすることができる。他の{\tt JungleTreeEditor}クラスによって木が更新されていた場合はコミットは失敗し、{\tt commit()}は{\tt Error}を返す。
-その場合は、木の編集を最初からやり直す必要がある。
+bindの実装により、分岐でErrorがないかチェックする必要がなくなった。
+
 
 \chapter{Unityで実装したアプリケーション}
 
+\section{例題ゲーム}
+
 本論文ではC\#で再実装を行ったJungleをUnityで作られたゲームの上に構築する。
-例題のゲームとしては図\ref{craft}のマインクラフトの簡易版を作成する。
+例題のゲームとしては図\ref{craft}に記載した、マインクラフトの簡易版を作成する。
 
 \begin{figure}[h]
 \begin{center}
@@ -356,24 +430,129 @@
 \end{center}
 \end{figure}
 
+プレイヤーは自由にマップを移動し、ステージの破壊や、生成を行うことができる。
+破壊や生成のオペレーションに合わせてJungleのノードにも同期する。
+この同期も非破壊で行われる。
+
+\section{ゲームの要素}
+
+例題ゲームを構成するゲームの要素を記述する。
+
+Unityではオブジェクトに対してコンポーネントが紐付けられる。
+クラスも同様にコンポーネントして扱える。
+%% ただし、MonoBehaviourを継承している場合インスタンスを生成することができない。
+
+ステージを構成するブロックのコンポーネントして、ItemBoxクラスを紐付ける。
+ItemBoxの持つ変数を表\ref{itembox}に示す。
+
+\begin{table}[htb]
+\begin{center}
+\caption{ItemBoxクラスが持つAttribute}
+\begin{tabular}{|p{8em}|p{14em}|}        \hline
+{\tt Broken }&
+Itemの体力、0になると自身のItemBoxのオブジェクトを破壊\\ \hline
+{\tt ColorCode}      &
+自身のブロックの色 \\ \hline
+\end{tabular}
+\label{itembox}
+\end{center}
+\end{table}
+
+プレーヤーにはコンポーネントとしてPlayerクラスを紐付ける。
+Playerクラスの持つ変数を表\ref{player}に示す。
+
+\begin{table}[htb]
+\begin{center}
+\caption{Playerクラスが持つAttribute}
+\begin{tabular}{|p{8em}|p{14em}|}        \hline
+{\tt HP }&
+プレイヤーの体力、0になるとゲームオーバー\\ \hline
+{\tt ItemList}      &
+プレイヤーが持つアイテムのリスト \\ \hline
+\end{tabular}
+\label{player}
+\end{center}
+\end{table}
+
 \section{データ設計}
 
+Unityにおけるゲームの構成はObjectの親子関係、つまり木構造である。
+Jungle Databaseは木構造型のデータベースであるので、そのまま格納するという手法が考えられる。
+%% Unityでシーンを構成する際にデータの設計を気にしなくてもいい。
+
+図\ref{GameTree}ではJungleに格納する構造を示したものである。
+
+\begin{figure}[h]
+\begin{center}
+\includegraphics[height = 6cm , bb=0 0 568 455]{images/GameTree.pdf}
+\caption{GameTree}
+\label{GameTree}
+\end{center}
+\end{figure}
+
+
+
+\section{Attributeの格納するデータの型}
+
+UnityではGameObjectクラスがシーンを構成する。
+
+
+
 \chapter{ベンチマーク}
 
 \section{Javaとの比較}
 
-\section{他のデータベースとの比較}
+本論文ではJavaで書かれたJungle DatabaseをC\#で再実装した。
+同じオペレーションでJavaとC\#で計測する。オペレーションは以下に記述する。
+なお、1回目の処理はキャッシュを作り処理が遅くなるため、計測は行わず、2回目以降から行う。
+
+\begin{itembox}[l]{Benchmark.cs}
+\scriptsize{
+\begin{verbatim}
+public JungleTreeEditor createTree(JungleTreeEditor editor, int _curY, int _maxHeight, NodePath path) {
+
+    if (_curY == _maxHeight) {
+      return editor;
+    }
 
-% 今後の課題
+    for (int i = 0; i < 3; i++) {
+      Either<Error, JungleTreeEditor> either = editor.addNewChildAt (path, _curY);
+      DebugCommon.Assert (either.isA (), "Error");
+      editor = either.b ();
+      string value = path.add (_curY).ToString ();
+      either = editor.putAttribute (path.add (_curY), key, System.Text.Encoding.ASCII.GetBytes (value));
+      DebugCommon.Assert (either.isA (), "Error");
+      editor = either.b ();
+      string value2 = value + "+ index";
+      either = editor.putAttribute (path.add (_curY), indexKey, System.Text.Encoding.ASCII.GetBytes (value2));
+      DebugCommon.Assert (either.isA (), "Error");
+      editor = either.b ();
+      editor = createTree (editor, _curY + 1, _maxHeight, path);
+    }
+    return editor;
+  }
+\end{verbatim}
+}
+\end{itembox}
+
+%% データの図を入れる
+
+
+\section{SQLite3とPlayerPrefsとの比較}
+
+Unityで使われているデータ保存としてSQLite3とPlayerPrefsがある。
+それぞれに対し、データの格納を行い、計測する。
+
+%% データの図を入れる/
 
 \chapter{結論}
 \section{まとめ}
 
-
+本論文ではJungleDatabaseをC\#で再実装を行った。
+JavaとC\#は比較的似ている言語であるため移行は難しくはなかった。
 
-\section{今後の課題}
-
-ネットワークゲームの課題はデータの偽装、つまりチートである。今後ネットワークとして対応させるにはそこを考える必要がある。
+Jungleはオンメモリで動作する。
+その為SQLite3やPlayerPrefsよりも速く動作する。
 
 %\section{Alice での実装}
 
@@ -394,7 +573,7 @@
 
 \hspace{1zw}本研究の遂行,また本論文の作成にあたり、御多忙にも関わらず終始懇切なる御指導と御教授を賜わりました河野真治准教授に深く感謝致します。
 
-数々の貴重な御助言と細かな御配慮を戴いた金川 竜己さん、並びに並列信頼研究室の皆様に深く感謝致します。
+数々の貴重な御助言と細かな御配慮を戴いた金川 竜己さん、比嘉健太さん、伊波立樹さん、並びに並列信頼研究室の皆様に深く感謝致します。
 
 最後に、有意義な時間を共に過ごした情報工学科の学友、並びに物心両面で支えてくれた両親に深く感謝致します。