annotate paper/dandy.tex @ 9:028ed9741872

finish chapter 8.
author koba <koba@cr.ie.u-ryukyu.ac.jp>
date Tue, 08 Feb 2011 05:18:27 +0900
parents 2dcc784d62e0
children d711f469cdb7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
1 \chapter{テストに用いるゲームプログラム Super Dandy}
6
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
9
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
3 \section{テストプログラムに最適なシューティングゲーム}\label{sec:dandy}
6
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 Super Dandy は我々が PlayStation でのゲーム開発を行っていた 1998 年に
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 開発されたシューティングゲームである。PlayStation アーキテクチャの
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 スプライト描画機能を用いて宇宙空間を表現しており、タイトルからゲーム本編中の
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 敵機の登場、攻略後のスコア一覧、エンディングなどのシーン切り替え、4 種類の
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 射撃と 2 種類の特殊射撃を駆使し、ステージをクリアしていくなど、ゲーム性も
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 高い。SuperDandy は開発する環境が変わる度に移植されており、過去には
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 PlayStation2 Linux、OpenGL バージョンも作られた。(図\ref{fig:dandy})
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 \begin{figure}[hb]
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 \begin{center}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 \includegraphics[scale=0.4]{images/dandy.pdf}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 \end{center}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 \caption{Super Dandy}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 \label{fig:dandy}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 \end{figure}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 \newpage
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 Super Dandy が伝統的に移植されてきた背景には、ある程度のボリュームのある
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 ゲームであること、衝突判定やオブジェクト管理、ステージクリアによる
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 シーン切り替えなど、基本的なゲームとしての要素が入っていること、
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 そして動作結果を過去の環境と比較することで新たな環境のチューニングが行える
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 ことが挙げられる。
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 \section{Task Dandy(Super Dandy Task version)}\label{sec:taskdandy}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 本研究を進めるにあたり、Super Dandy を Cerium の Task で書き換えた
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 Task Dandy を作成した。Task Dandy はできるだけ元の Super Dandy のコード
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 やデータ構造を流用し、比較、テストが容易に行えるように設計した。
9
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
32 その為、Super Dandy で Move や Collision の処理を行う state\_update() や
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
33 collision\_detect() において Move Task や Collision Task を生成している。
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
34 また、obj\_draw() はオブジェクトの描画を行う関数であったが、Task Dandy では
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
35 SceneGraph の tree を生成している。そしてゲームの処理を抜け、Cerium の処理に
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
36 入ると、さきほど生成した SceneGraph の tree から描画処理を行う 3 つの Task
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
37 を生成する(\ref{sec:rendering})。この一連の処理を繰り返すことによって
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
38 シューティングゲームである Task Dandy が形成される。(図\ref{fig:taskdandy})
6
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39
9
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
40 \begin{figure}[h]
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
41 \begin{center}
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
42 \includegraphics[scale=0.5]{images/taskdandy.pdf}
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
43 \end{center}
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
44 \caption{Super Dandy と Task Dandy の処理}
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
45 \label{fig:taskdandy}
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
46 \end{figure}
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
47
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
48 \newpage
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
49
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
50 \subsection{Super Dandy のデータ構造}
6
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 データ構造は Super Dandy のものを流用している。Super Dandy では主に以下の
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 ようなデータが存在する。
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 \begin{itemize}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 \item player:\\
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 プレイヤーの操作する機体。xy 座標の他、残機数、無敵時間、
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 コンテニュー回数などが存在する。
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 \item CHARACTER:\\
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 敵キャラクターや敵の弾。xy 座標とその方向の速さ、体力、倒したときのスコア、
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 オブジェクトの種類を表すキャラナンバー、死亡フラグなどがある。
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 また、Move と Collision を関数ポインタで持ち、ステートパターンで
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 切り替えて状態遷移する。
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 \item tama\_lv1〜laser\_lv3:\\
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 プレイヤーが撃った弾。xy 座標と存在の有無を表すフラグを持っている。
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 プレイヤーが射撃ボタンを押すと対応した弾の配列に状態が格納され、
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 敵に当たるか、画面外に消えるまで存在フラグが立つ。
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 \end{itemize}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68
7
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
69 これらのデータは オブジェクトの情報として管理されるだけでなく、
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
70 その他のオブジェクトの移動や衝突判定時にも使用される。
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
71
9
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
72 \subsection{データ転送に用いる Property}\label{sec:property}
7
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
73 Task Dandy の Task は処理のために、複数のデータを set\_inData する
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
74 必要がある。特に Collision Task に使用するデータはオブジェクト自身の情報の
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
75 他にプレイヤーの機体、プレイヤーの出した弾など、種類が多く、全てを set\_in
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
76 Data するとコードが無駄に長く、煩雑になってしまう。そこで必要なパラメータを
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
77 Property という構造体にコピーする。こうすることで多くのパラメータを 1回の
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
78 set\_inData で送ることが出来る。(図\ref{fig:property})
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
79
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
80 \begin{figure}[h]
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
81 \begin{center}
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
82 \includegraphics[scale=0.7]{images/property.pdf}
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
83 \end{center}
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
84 \caption{Property のデータ構造}
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
85 \label{fig:property}
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
86 \end{figure}
6
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
87
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 \subsection{SPE における状態遷移}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 SPE では各々に固有の LS を持つ\ref{sec:spe}為、Super Dandy で使用していた
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 ステートパターンによる状態遷移は使用できない。これは関数ポインタに格納されて
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 いるアドレスが PPE 上のものであり、SPE では意味を為さないからである。
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 そこで SPE 上では Task の ID を変更することによりオブジェクトの状態遷移を
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 実現するようにした。CHARACTER 構造体に Task ID を格納する新たなパラメータを
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 追加した。以下のようなコードで状態が遷移する条件に入ると Task ID が
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 書き換えられる。
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
9
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
98 \newpage
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
99
6
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 \begin{verbatim}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 static int
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 state6(SchedTask *smanager, void *rbuf, void *wbuf)
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 {
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 CHARACTER *p = (CHARACTER*)smanager->get_input(rbuf, 0);
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 CHARACTER *q = (CHARACTER*)smanager->get_output(wbuf, 0);
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 player *jiki = (player*)smanager->get_input(rbuf, 1);
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 p->y += p->vy;
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 p->x += p->vx;
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 if(p->y + 96 < jiki->y
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 && p->y + 128 > jiki->y)
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 {
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 p->vy = 2;
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 p->vx = ((jiki->x > p->x) ? 4 : -4);
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 p->state_task = STATE0;
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 }
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 else p->state_task = STATE6;
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 *q = *p;
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 return 0;
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 }
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 \end{verbatim}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123
9
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
124 \newpage
028ed9741872 finish chapter 8.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
125
6
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 書き換えられた ID は次に Task を生成する際に使用され、別の種類の Task を
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 生成するようになる。
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 \begin{verbatim}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 int task_num = p->state_task;
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 HTaskPtr state_task = tmanager->create_task(task_num);
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 \end{verbatim}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 \subsection{SPE におけるオブジェクトの生成}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 Super Dandy では敵オブジェクトが弾丸を作り出し、プレイヤーを攻撃する、
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 といったイベントが存在する。SPE に送られた Task 内でこのイベントが発生した時
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 、SPE の LS 内で弾丸オブジェクトの生成が行われる。しかし、Cerium の Rendering
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 Engine はPPE 上の SceneGraph tree に登録されているオブジェクトを見て描画用
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 Task を生成するので(\ref{sec:rendering} 節)、このままでは弾丸オブジェクトは
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 描画されない。また、複数の SPE 上の Task からこのオブジェクトのデータを参照
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 したい時、データを同期するためにも 1 箇所のメモリでオブジェクトを管理する方が
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 良い。よって SPE 内で生成されたオブジェクトデータを DMA 転送により
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 メインメモリへオブジェクトデータを送る必要がある。
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 Cerium は set\_outData と get\_output により、Task からデータを書き出すこと
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 ができるが、書き出すサイズと数が決め打ちである。例えば以下のコードでは
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 Puttama で弾丸オブジェクトを生成しているが、条件によって 0〜3 個の
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 弾丸オブジェクトが生成される為、オブジェクトの最大数分だけサイズをセット
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 しなければならない。これによって、余計な DMA 転送が発生する。
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 \begin{verbatim}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 if((p->dt1 > 60) && (p->dt1 <= 70))
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 {
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 if(p->dt1 % 2 == 1)
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 {
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 // Puttama は弾丸オブジェクトを生成する
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 Puttama(0, rinkx - 16, rinky);
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 Puttama(0, rinkx, rinky);
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 Puttama(0, rinkx + 16, rinky);
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 }
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 }
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 if((p->dt1 > 180) && (p->dt1 <= 240))
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 {
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 if(p->dt1 % 2 == 1)
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 {
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 rinkf2 = 1;
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 Puttama(2, rinkx - 16, p->y - 32);
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 Puttama(3, rinkx + 32 - 16, p->y - 32);
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 }
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 else
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 {
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 rinkf2 = 2;
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 }
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 }
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 \end{verbatim}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
176
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 その為、Task Dandy の Task 内では set\_outputSize (\ref{sec:refine_wbuf})に
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 よって write buffer の大きさを再定義している。これにより無駄な DMA 転送は
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 抑えることができるが、メインメモリ上には予めオブジェクトの最大数分のメモリを
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 確保しておく必要がある。
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
181
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 \begin{verbatim}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 int obj_size = sizeof(ObjContainer)*DATA_LENGTH;
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 HTaskPtr state_task = manager->create_task(task_id);
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 ObjContainerPtr obj = (ObjContainerPtr)tmanager->allocate(obj_size);
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 state_task->set_outData(0, obj, 0);
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 \end{verbatim}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 \subsection{可変長な Output Data の定義}\label{sec:refine_wbuf}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 図 \ref{fig:wbuf} にあるように write buffer の allocate は Task の実行前に
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 行われており、また DMA 転送により書き出されるサイズは事前に set\_outData で
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 指定したサイズとなるため、Task 内で書き出すデータサイズを変更することは
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 出来なかった。
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 そこで新たに{\bf set\_outputSize(int index, int size) } という API を
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 実装した。index にはサイズを変更したいバッファの番号を入れ、size には新たに
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 設定するバッファサイズを入れる。
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199
7
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
200 write buffer は Task 実行前に allocate されるが、
6
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 Task 内で set\_outputSize をすることで set\_outData で設定されたサイズを書き
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 換える。そして事前に allocate された write buffer を free し、新たに設定
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 されたサイズで write buffer を allocate することで可変長な output Data を
7
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
204 定義している。(図\ref{fig:set_w2})
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
205 \if0
6
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 \begin{figure}[h]
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 \begin{center}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 \includegraphics[scale=0.7]{images/set_wbuf1.pdf}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 \end{center}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 \caption{Task 実行前の allocate}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 \label{fig:set_w1}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 \end{figure}
7
2dcc784d62e0 add new image;
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
213 \fi
6
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 \begin{figure}[h]
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 \begin{center}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 \includegraphics[scale=0.8]{images/set_wbuf2.pdf}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 \end{center}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 \caption{output Data の再定義}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 \label{fig:set_w2}
f59edc38c858 add graphic files.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 \end{figure}