changeset 5:14fe10070ae5

add new section
author koba <koba@cr.ie.u-ryukyu.ac.jp>
date Sat, 28 Aug 2010 03:37:51 +0900
parents 263caaf80bf9
children cd0acbe8f5e0
files paper-koba.tex
diffstat 1 files changed, 43 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/paper-koba.tex	Sat Aug 28 01:22:21 2010 +0900
+++ b/paper-koba.tex	Sat Aug 28 03:37:51 2010 +0900
@@ -147,7 +147,7 @@
 \label{figure:SceneGraph}
 \end{figure}
 
-\subsection{Rendering Engine}
+\subsection{Rendering Engine}\label{subsection:rendering}
 Cerium の Rendering Engine では、以下の3つの Task を持つ。
 
 \begin{itemize}
@@ -198,7 +198,7 @@
 
 set\_postにより、ユーザ側でも Task が終了したということを検知できる
 
-\section{Cerium を用いたゲーム開発}
+\section{Cerium を用いたゲーム開発}\label{section:game_develop}
 多くのゲームでは毎フレーム、オブジェクトのパラメータを計算し、その結果によって 
 Rendering や collision の判定を行う必要がある。
 Cerium 環境では毎フレーム、オブジェクトの動作(Move)を記述した Task を生成し
@@ -206,9 +206,20 @@
 しかし SPE の LS は 256KB しか無い為(\ref{subsection:SPE}節)、Polygon や Texture などの
 余分な情報の入った SceneGraph そのものを送るのは望ましくない。
 そこで計算に必要なパラメータだけを持つ Property をユーザ側で定義し、Task と共に 
-SPE に送る手法を取る。SPE に計算された値は post\_func を用いて(\ref{subsubsection:set_post}節)
+SPE に送る手法を取る。SPE に計算された値は post\_func を用いて
 SceneGraph に反映され、Rendering Engine によって描画される(図\ref{figure:reflect})。
 
+以下は Task を生成するルーチンの例である。
+
+\begin{verbatim}
+HTask *task = sgroot->tmanager->create_task(id);
+  task->set_cpu(SPE_ANY);
+  task->add_inData(property, size);
+  task->add_outData(property, size);
+  task->set_post(post_func, (void*)property, 0);
+  task->spawn();
+\end{verbatim}
+
 \begin{figure}[tb]
 \begin{center}
 \scalebox{0.50}{\includegraphics{image/reflect_value.eps}}
@@ -217,10 +228,37 @@
 \label{figure:reflect}
 \end{figure}
 
-\section{ゲーム開発の過程で生じたバグとテストアプローチ}
+\section{発生したバグとその対処}
+\subsection{Task の依存関係によるバグ}
+Cerium を用いたゲーム開発を進めたところ、
+Task による Property の計算が描画に反映されなかった。そこでプログラム上で動作している 
+主要な Task の実行順序を調べてみたところ、以下のようになった。
 
+\begin{enumerate}
+\item GameTask(Game 本体の Task)
+\item CreatePolygonFromSceneGraph(SceneGraph からPolygonPack を生成)
+\item GameTask->post\_func(GameTask によって計算された値を SceneGraph に反映)
+\item CreateSpan(PolygonPack から SpanPack を生成)
+\item DrawSpan(SpanPack から Texture を読み込みながら描画)
+\end{enumerate} 
 
-\section{まとめと今後の課題}
+Cerium による Rendering は 3つの Task によって実現されているが\ref{subsection:rendering}
+そのプロセスが SceneGraph への Property の値の反映より先に実行されているのがわかる。
+
+このバグに対しては全ての GameTask の終了をwait\_forで待つ DummyTask(何も動作しないTask)を Rendering Task との
+間に挟むことによって Task の 実行順序を調整した(図\ref{figure:debug_dependency})。
 
+\begin{figure}[tb]
+\begin{center}
+\scalebox{0.50}{\includegraphics{image/dependency.eps}}
+\end{center}
+\caption{DummyTask による GameTask と Rendering の実行順序の調整}
+\label{figure:debug_dependency}
+\end{figure}
+
+\subsection{Task に送る}
+
+\section{まとめ}
+Task の dependency を把握することは
 
 \end{document}