Mercurial > hg > Papers > 2009 > koba-thesis
comparison presentation/thesis_pre.html @ 23:39dcb6906101
add many images
author | e055722 |
---|---|
date | Thu, 26 Feb 2009 14:54:25 +0900 |
parents | 56617f0a3173 |
children | 806126a7596c |
comparison
equal
deleted
inserted
replaced
22:ba9f928959ce | 23:39dcb6906101 |
---|---|
39 <div class="presentation"> | 39 <div class="presentation"> |
40 | 40 |
41 <div class="slide"> | 41 <div class="slide"> |
42 <h1>SceneGraphを用いた<br>ゲームプログラムの為のテスト作成手法</h1> | 42 <h1>SceneGraphを用いた<br>ゲームプログラムの為のテスト作成手法</h1> |
43 <h3>発表者:小林 佑亮</h3> | 43 <h3>発表者:小林 佑亮</h3> |
44 <h4>所属:琉球大学 工学部 情報工学科</h4> | 44 <h4>所属:琉球大学 工学部 情報工学科 並列信頼研</h4> |
45 <h4>指導教員:河野 真治</h4> | 45 <h4>指導教員:河野 真治</h4> |
46 </div> | 46 </div> |
47 | 47 |
48 | 48 |
49 <div class="slide"> | 49 <div class="slide"> |
50 <h1>研究背景・目的</h1> | 50 <h1>研究背景・目的</h1> |
51 <font size=5> | 51 研究背景 |
52 研究背景<br> | 52 <ul> |
53 <ul> | 53 <li>PlayStation3上での並列的なゲームプログラムの作成</li> |
54 <li>当研究室では学生実験において、PlayStation3を用いた並列的なゲームプログラムの作成を行っている</li> | 54 <li>当研究室で開発したCeriumレンダリングエンジンを使用</li> |
55 <li>そこで使用されるのが当研究室で開発したCeriumレンダリングエンジンである</li> | 55 <li>ゲーム「超弾帝(スーパーダンディ)」の移植の際、不具合が発生</li> |
56 <li>PlayStation2で動作していたゲーム「超弾帝(スーパーダンディ)」の移植の際、オブジェクトの描画、衝突判定などで不具合が発生した</li> | 56 <li>ゲーム内に約100種類に及ぶオブジェクトが存在</li> |
57 <li>超弾帝には約100種類に及ぶオブジェクトが存在し、今後も同様な不具合を修正していく必要があると考えられる</li> | 57 </ul> |
58 </ul> | 58 研究目的 |
59 <br> | 59 <ul> |
60 研究目的<br> | 60 <li>SceneGraph単位でオブジェクトごとにテスト</li> |
61 <ul> | 61 <li>今後のゲームの移植や改良、作成のデバッグで活かしたい</li> |
62 <li>本研究ではゲームプログラムをSceneGraph単位でテストすることでオブジェクトごとの振る舞いや描画をチェックする</li> | 62 </ul> |
63 <li>ゲームのデバッグを容易にし、今後のゲームの移植や改良、作成を円滑にする</li> | |
64 </ul> | |
65 </font> | |
66 </div> | 63 </div> |
67 | 64 |
68 <div class="slide"> | 65 <div class="slide"> |
69 <h1>PlayStation3のアーキテクチャ</h1> | 66 <h1>PlayStation3のアーキテクチャ</h1> |
70 <font size=5> | 67 <font size=5> |
71 <ul> | 68 <ul> |
72 <li>Cellは1基のPPEと8基のSPEからなる非対称なマルチコアプロセッサであり、高速リングバスで構成されている</li> | 69 <li>CellにはPPEが1基、SPEが8基</li> |
73 <li>SPE は、LS (Local Store) という256KBのメモリを持つ</li> | 70 <li>SPE に256KBのメモリ</li> |
74 <li>本研究で用いた PS3Linux では、6個の SPE を制御することができる</li> | 71 <li>PS3Linuxでは6個の SPE を制御</li> |
75 </ul> | 72 </ul> |
76 </font> | 73 </font> |
77 <br> | 74 <br> |
78 <img src="image/Cell-main.jpg" alt="Cell-main" width="430" height="283"> | 75 <center> |
79 <img src="image/SPE.jpg" alt="SPE" width="233" height="221"> | 76 <img src="image/Cell-main.jpg" alt="Cell-main" width="450" height="300"> |
80 </ul> | 77 <img src="image/SPE.jpg" alt="SPE" width="300" height="280"> |
78 </center> | |
81 </div> | 79 </div> |
82 | 80 |
83 <div class="slide"> | 81 <div class="slide"> |
84 <h1>Cerium Rendering Engine</h1> | 82 <h1>Cerium Rendering Engine</h1> |
85 Ceriumは以下の3つから構成される。 | 83 <ul> |
86 <ul> | 84 <li>TaskManager</li> |
87 <li>TaskManager/li> | |
88 <li>SceneGraph</li> | 85 <li>SceneGraph</li> |
89 <li>RenderingEngine</li> | 86 <li>RenderingEngine</li> |
90 </ul> | 87 </ul> |
91 <br> | |
92 <img src="image/Cerium.jpg" width=" " height=" "> | |
93 </div> | 88 </div> |
94 | 89 |
95 <div class="slide"> | 90 <div class="slide"> |
96 <h1>TaskManager</h1> | 91 <h1>TaskManager</h1> |
97 | 92 <ul> |
98 <font size="5"> | 93 <li>Taskに分割されたプログラムを管理</li> |
99 <ul> | 94 <li>メモリ上にマッピング、SPE上ではDMA転送によりロード</li> |
100 <li>Taskと呼ばれる分割された各プログラムを管理するライブラリである</li> | 95 <li>SPEは256KBという小さなデータ量のみ保持</li> |
101 <li>Task同士の依存関係を考慮しながらメモリ上にマッピングし、SPE上ではそのプログラムを DMA転送によりロードする</li> | 96 <li>必要な実行プログラムだけをSPE上にロード</li> |
102 <li>SPEは256KBという小さなデータ量しか持てず、 大量のプログラムを全てSPE上に置いておく事は出来ない可能性がある</li> | |
103 <li>必要な時に必要な実行プログラムだけがSPE上にロードされている事が望ましい</li> | |
104 </ul> | 97 </ul> |
105 </font> | 98 </font> |
106 <br> | 99 <br> |
107 <center> | 100 <center> |
108 <img src="image/TaskManager.jpg" width="25%" height="40%" alt="TaskManager"> | 101 <img src="image/TaskManager.jpg" width="25%" height="40%" alt="TaskManager"> |
111 | 104 |
112 <div class="slide"> | 105 <div class="slide"> |
113 <h1>SceneGraph</h1> | 106 <h1>SceneGraph</h1> |
114 <font size="5"> | 107 <font size="5"> |
115 <ul> | 108 <ul> |
116 <li>ゲームの中の一つの場面(Scene)を構成するオブジェクトやその振る舞い、ゲームのルールの集合をSceneGraphとする</li> | 109 <li>ゲームの中の場面を構成するオブジェクトやその振る舞い、ゲームのルールの集合</li> |
117 <li>SceneGraphのノードは親子関係を持つTreeで構成される</li> | 110 <li>親子関係を持つTreeで構成</li> |
118 <li>親子関係とは、親オブジェクトの回転や平行移動等の行列計算による頂点座標の変更が、子オブジェクトにも反映する関係の事である</li> | 111 </ul> |
119 <img src="image/SceneGraph.jpg" width="" height="" alt=" SceneGraph"> | 112 </font> |
120 </font> | 113 <br> |
121 </div> | 114 <center> |
122 | 115 <img src="image/SceneGraph.jpg" width="" height=""> |
123 <div class="slide"> | 116 </center> |
124 <h1>RenderingEngine</h1> | |
125 <font size="5"> | |
126 <ul> | |
127 <li>SceneGraphから実際に表示するポリゴンを抽出する</li> | |
128 <li>ポリゴンからSpanを生成する</li> | |
129 <li>SpanにRGBをマッピングし描画する</li> | |
130 <img src="image/Cerium-main.png" width="50%" height="50%"> | |
131 </font> | |
132 </div> | 117 </div> |
133 | 118 |
134 <div class="slide"> | 119 <div class="slide"> |
135 <h1>SceneGraphの生成</h1> | 120 <h1>SceneGraphの生成</h1> |
136 <font size="5"> | 121 <font size="5"> |
137 <ul> | 122 <ul> |
138 <li>Blenderでオブジェクトモデルを作成</li> | 123 <li>Blenderでオブジェクトモデルを作成</li> |
139 <li>作成したオブジェクトモデルをpythonスクリプトでxmlファイルに変換</li> | 124 <li>作成したオブジェクトモデルをpythonスクリプトでxmlファイルに変換</li> |
140 <li>xmlファイルからSceneGraphを生成する</li> | 125 <li>xmlファイルからSceneGraphを生成s</li> |
141 <li>各ノードにはオブジェクトの動きを決めるmoveとオブジェクトの相互作用を決めるcollisionがある。</li> | 126 <li>各ノードにmoveとcollision</li> |
142 </ul> | 127 </ul> |
143 <br> | 128 <br> |
144 <br> | 129 <center> |
145 <center> | 130 <img src="image/SGcreate.jpg" width="80%" height="40%"> |
146 <img src="image/SGcreate.jpg" width="50%" height="30%"> | 131 </center> |
147 </center> | 132 </font> |
148 </font> | 133 </div> |
134 | |
135 <div class="slide"> | |
136 <h1>超弾帝(スーパーダンディ)</h1> | |
137 <ul> | |
138 <li>2Dシューティングゲーム</li> | |
139 <li>moveで移動</li> | |
140 <li>collisionで衝突判定</li> | |
141 <li>set_move_collisionで行動変化</li> | |
142 </ul> | |
143 </div> | |
144 | |
145 <div class="slide"> | |
146 <h1>超弾帝(スーパーダンディ)</h1> | |
147 <center> | |
148 <img src="image/Dandy.jpg" width="100%" height="75%"> | |
149 </center> | |
149 </div> | 150 </div> |
150 | 151 |
151 <div class="slide"> | 152 <div class="slide"> |
152 <h1>move,collision</h1> | 153 <h1>move,collision</h1> |
153 boss1_action.cpp<br> | 154 <font size=5> |
154 <font size="5"> | 155 <font color=red size=4> |
156 boss1_move_right(SceneGraphPtr node, int screen_w, int screen_h) { | |
157 </font> | |
155 <pre> | 158 <pre> |
156 static void | |
157 boss1_move_right(SceneGraphPtr node, int screen_w, int screen_h) { | |
158 node->xyz[0] += node->stack_xyz[0]; | |
159 if(node->xyz[0] > screen_w-280) { | |
160 node->set_move_collision(boss1_move_left, boss1_collision); | |
161 } | |
162 } | |
163 | |
164 static void | |
165 boss1_move_left(SceneGraphPtr node, int screen_w, int screen_h) { | |
166 node->xyz[0] -= node->stack_xyz[0]; | 159 node->xyz[0] -= node->stack_xyz[0]; |
167 if(node->xyz[0] < 280) { | 160 if(node->xyz[0] < 280) { |
161 <font color=blue size=4> | |
168 node->set_move_collision(boss1_move_right, boss1_collision); | 162 node->set_move_collision(boss1_move_right, boss1_collision); |
163 </font> | |
169 } | 164 } |
170 } | 165 } |
171 </pre> | 166 </pre> |
172 </font> | 167 <font size=5> |
173 <br> | 168 <font color=red size=4> |
174 <ul> | 169 boss1_move_left(SceneGraphPtr node, int screen_w, int screen_h) { |
175 <li>boss1_move_right,left…boss1が左右に移動する動きを記述</li> | 170 </font> |
176 <li>boss1_collision…boss1の衝突判定を記述</li> | 171 <pre> |
177 <li>set_move_collision…新しいmoveとcollitsionを設定する</li> | 172 node->xyz[0] += node->stack_xyz[0]; |
178 </ul> | 173 if(node->xyz[0] > screen_w-280) { |
174 <font color=blue size=4> | |
175 node->set_move_collision(boss1_move_left, boss1_collision); | |
176 </font> | |
177 } | |
178 } | |
179 </pre> | |
180 <ul> | |
181 <font color=red><li>ボス1が右や左に移動</li></font> | |
182 <font color=blue><li>引数のmoveとcollisionに変化</li></font> | |
183 </ul> | |
184 </font> | |
179 </div> | 185 </div> |
180 | 186 |
181 <div class="slide"> | 187 <div class="slide"> |
182 <h1>CppUnitによるテスト手法</h1> | 188 <h1>CppUnitによるテスト手法</h1> |
183 <font size="5"> | 189 <font size="5"> |
184 <ul> | 190 <ul> |
185 <li>C++の単体テストを自動化するflame workである</li> | 191 <li>C++の単体テストを自動化するflame workである</li> |
186 <li>テストケースを増やす事が容易</li> | 192 <li>テストケースを増やす事が容易</li> |
187 <li>テストケース群は一括で実行し、結果の表示も行える</li> | 193 <li>テストケース群は一括で実行し、結果の表示も行える</li> |
188 </ul> | 194 </ul> |
189 <br> | 195 |
190 <br> | |
191 <center> | |
192 <img src="image/test_state.jpg" width="40%" height="50%"> | |
193 </center> | |
194 </font> | |
195 </div> | |
196 | |
197 <div class="slide"> | |
198 <h1>テストを行うゲームプログラム</h1> | |
199 <font size="5"> | |
200 <br> | |
201 <table> | 196 <table> |
202 <tr> | 197 <tr> |
203 <td><img src="image/boss1.png" width=" " height=" "></td> | 198 <td><img src="image/TestState.jpg" width=" " height="85%"></td> |
204 <td> | 199 <td> |
205 <ul> | 200 <ul> |
206 <li>3つのSceneGraphを持つ</li> | 201 <li>CPPUNIT_ASSERT( )<br> |
207 <li>本体の他に左右にパーツを1つずつ持つ。</li> | 202 引数が真なら成功、偽なら失敗</li> |
208 <li>本体をTreeのrootとして左右のパーツがその子供となっている</li> | 203 <li>CPPUNIT_ASSERT_EQUAL( , )<br> |
209 </ul> | 204 第1引数と第2引数が同じなら成功、違えば失敗</li> |
205 <li>CPPUNIT_FAIL( )<br> | |
206 必ず失敗する</li> | |
207 </ul> | |
208 </font> | |
210 </td> | 209 </td> |
211 </table> | 210 </table> |
212 <br> | |
213 <ul> | |
214 <li>各オブジェクトのSceneGraphはその親や子、兄弟に対するアドレスを保持している</li> | |
215 <li>パーツオブジェクトのテストを行いたい場合、Rootである本体から辿れば、パーツオブジェクトの各パラメータを参照できる</li> | |
216 </ul> | |
217 </font> | |
218 </div> | 211 </div> |
219 | 212 |
220 <div class="slide"> | 213 <div class="slide"> |
221 <h1>CppUnitによるゲームプログラムのテスト</h1> | 214 <h1>CppUnitによるゲームプログラムのテスト</h1> |
222 <font size="5"> | 215 <font size="5"> |
223 <ul> | 216 <ul> |
224 <li>getSGPによりSceneGraphのrootのアドレスを取得</li> | 217 <li>getSGPによりSceneGraphのrootのアドレスを取得</li> |
225 <li>rootアドレスから本体オブジェクトの各パラメータを参照</li> | 218 <li>rootアドレスから本体オブジェクトの各パラメータを参照</li> |
226 <li>rootアドレスを走査してパーツオブジェクトの各パラメータを参照</li> | 219 <li>rootアドレスを走査してパーツオブジェクトの各パラメータを参照</li> |
227 </ul> | 220 </ul> |
228 <br> | 221 </font> |
229 <table> | 222 <table> |
230 <tr> | 223 <tr> |
231 <td><img src="image/test_part.jpg" width=" " height=" "></td> | 224 <td><img src="image/test_part.jpg" width=" " height=" "></td> |
232 <td> | 225 <td> |
226 <font size="5"> | |
233 <pre> | 227 <pre> |
234 void | 228 void |
235 sgTest::rootTest() { | 229 sgTest::rootTest() { |
236 test_init(); | 230 test_init(); |
237 | 231 |
251 } else if(sg_root->brother != NULL) { | 245 } else if(sg_root->brother != NULL) { |
252 sg_root->brother->print_member(); | 246 sg_root->brother->print_member(); |
253 CPPUNIT_ASSERT_EQUAL(0.0f, sg_root->brother->xyz[0]); | 247 CPPUNIT_ASSERT_EQUAL(0.0f, sg_root->brother->xyz[0]); |
254 ... | 248 ... |
255 sg_root = sg_root->brother; | 249 sg_root = sg_root->brother; |
256 } else { | |
257 ... | 250 ... |
258 </pre> | 251 </pre> |
259 </td> | 252 </td> |
260 </table> | 253 </table> |
261 </font> | 254 </font> |
262 </div> | 255 </div> |
263 | 256 |
264 <div class="slide"> | 257 <div class="slide"> |
265 <h1>評価・今後の課題</h1> | 258 <h1>評価・今後の課題</h1> |
259 <font size=6> | |
266 <ul> | 260 <ul> |
267 <li>全てのオブジェクトの座標の初期位置が正しい事を確認</li> | 261 <li>全てのオブジェクトの座標の初期位置が正しい事を確認</li> |
268 <li>move,collision中の各オブジェクトの座標は確認出来ない</li> | 262 <li>move,collision中の各オブジェクトの座標は確認出来ない</li> |
269 <li>今後各moveとcollisionを抜き出してテストする手法を実装する</li> | 263 <li>今後各moveとcollisionを抜き出してテストする手法を実装する</li> |
270 </ul> | 264 </ul> |
271 </div> | 265 </font> |
272 | 266 </div> |
273 <div class="slide"> | 267 |
274 <h2>ご清聴ありがとうございました。</h2> | 268 <div class="slide"> |
269 <h1>ご清聴ありがとうございました。</h1> | |
275 </div> | 270 </div> |
276 | 271 |
277 </div> | 272 </div> |
278 | 273 |
279 </body> | 274 </body> |