# HG changeset patch # User koba # Date 1282934271 -32400 # Node ID 14fe10070ae5123b24144985d0a2d971d5a4e002 # Parent 263caaf80bf9ca4e3e868899665fe12c4b68b8a7 add new section diff -r 263caaf80bf9 -r 14fe10070ae5 paper-koba.tex --- 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}