Mercurial > hg > Papers > 2016 > kazuma-midterm
changeset 12:202092f0f309
fix
author | Kazuma |
---|---|
date | Fri, 21 Oct 2016 21:07:43 +0900 |
parents | 95eca1bbcf2e |
children | 03e97e769bb0 |
files | midterm.pdf midterm.tex |
diffstat | 2 files changed, 50 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- a/midterm.tex Fri Oct 21 18:45:14 2016 +0900 +++ b/midterm.tex Fri Oct 21 21:07:43 2016 +0900 @@ -47,7 +47,7 @@ \section{Unityでの問題点} -Unityではデータの保存の際にMySQL、SQlite3、PlayerPrefsといった第一正規系、第二正規系のDBがよく使われている。 +Unityではデータの保存の際にMySQL、SQlite3、PlayerPrefsといったDBがよく使われている。 しかし、木構造でゲームは構成されているため、ゲーム構造を保存するにはRDB向けにノードの関係を変換する必要がある。 つまり、そのまま格納することができればスケールアウトするデータにも対応でき、データベース設計も簡略化できると考え、C\#に書き直すことにした。 @@ -61,14 +61,15 @@ \section{AtomicRefefarenceの実装} % atomic reference問題 Jungleの木の更新(commit)は、CAS(check and set*図1)を用いて atomic に行われる。競合している書き込みにの中で自分の書き込みが成功した場合に関数 \verb+success()+が成功する。 -JavaにはAtomicRefarenceが標準であったがC\#はなかったため、AtomicReferenceのClassを新たに作った。 +JavaにはAtomicRefarenceが標準であるがC\#はなかったため、AtomicReferenceのClassを新たに作った。 \begin{figure}[htbp] \includegraphics[width=8cm]{pic/cas.pdf} -\label{Check and Set} +\label{fig:cas} +\caption{Check and Set} \end{figure} -{\scriptsize + \begin{itembox}[l]{ソースコード1 AtomicReference.cs} \begin{verbatim} public class AtomicReference <T> where T : class { @@ -81,7 +82,7 @@ public bool CompareAndSet(T newValue, T prevValue) { T oldValue = value; return (oldValue - != Interlocked.CompareExchange (ref value, newValue, prevValue)); + != Interlocked.CompareExchange (ref value, newValue, prevValue)); } public T Get() { @@ -90,7 +91,6 @@ } \end{verbatim} \end{itembox} -} CompereAndSetメソッドではInterlocked Operationを利用した。 これによりスレッドセーフな値の変更を行うことが可能になる。 @@ -99,24 +99,47 @@ Jungleでは、木の編集や、特定のNode下のTreeの探索、Nodeの親をたどるためには全てそのNodeへのPathが必要になる。 その管理をListで行っている。 Listを実装する際にIteratorが必要となる。 -C\#にはIEnumeratorがあるのでそれを利用した。 +JavaではインナークラスでIteratorを返すが +\begin{itembox}[l]{ソースコード2 List.java} +\begin{verbatim} +public Iterator<T> iterator() { + return new Iterator<T>() { + Node<T> currentNode = head.getNext(); + + @Override + public boolean hasNext() { + return currentNode.getAttribute() + != null; + } -{\scriptsize -\begin{itembox}[l]{ソースコード2 List.cs} + @Override + public T next() { + T attribute + = currentNode.getAttribute(); + currentNode + = currentNode.getNext(); + return attribute; + } + }; +} +\end{verbatim} +\end{itembox} + +C\#にはIEnumeratorがあるのでそれを利用した。 +ListのforeachではIteratorを呼び出すため、一つずつ要素を返す必要がある。 +yield returnステートメントを利用することで位置が保持され、次に呼ばれた際に続きから値の取り出しが可能になる。 + +\begin{itembox}[l]{ソースコード3 List.cs} \begin{verbatim} public IEnumerator<T> iterator() { - Node<T> currentNode = head.getNext(); - while (currentNode.getAttribute() != null) { - yield return (T)currentNode.getAttribute(); - currentNode = currentNode.getNext (); - } + Node<T> currentNode = head.getNext(); + while (currentNode.getAttribute() != null) { + yield return (T)currentNode.getAttribute(); + currentNode = currentNode.getNext (); } +} \end{verbatim} \end{itembox} -} - -ListのforeachではIteratorを呼び出すため、一つずつ要素を返す必要がある。 -yield returnステートメントを利用することで位置が保持され次に呼ばれた際に続きから値の取り出しが可能になる。 \section{ベンチマーク} @@ -128,22 +151,23 @@ \begin{itemize} \item OS : Windows 10 \item CPU : Intel Core i7-4700MQ 2.4GHz -\item Unity : Unity 5.4.2f1 +\item Unity : 5.4.2f1 \end{itemize} %\begin{figure}[htbp] % \includegraphics[width=70mm]{pic/benchmark.pdf} %\end{figure} -\begin{table}[htb] - \begin{tabular}{|l|c|} - データベース & 速度(ms) 早い方がいい - Jungle & data \\ - Sqlite3 & data \\ - PlayerPrefs & data \\ +\begin{table}[htbp] + \caption{速度測定} + \label{table:data_type} + \begin{tabular}{lcrr} \hline + データベース & 速度(ms) \\ \hline \hline + Jungle & 100 \\ + Sqlite3 & 100 \\ + PlayerPrefs & 100 \\ \end{tabular} \end{table} -Sqlite3では100msを超えてしまったため省略してある。 図3の結果よりJungleDBの速度を確認することができた。 \section{これからの作業}