comparison presen/osc2010.html @ 4:19623b8a4144

change scenario
author Ryoma SHINYA <shinya@firefly.cr.ie.u-ryukyu.ac.jp>
date Sat, 02 Oct 2010 01:09:44 +0900
parents 6e68a8297587
children 93c3962d9a01
comparison
equal deleted inserted replaced
3:6e68a8297587 4:19623b8a4144
74 <li>お魚の例題</li> 74 <li>お魚の例題</li>
75 </ol> 75 </ol>
76 </ul> 76 </ul>
77 </font> 77 </font>
78 </li> 78 </li>
79 <li class="slide"> 79
80 <h1>ゲームの作り方</h1> 80 <div class="slide">
81 <p>ゲームとは: 3Dモデルのレンダリング & 操作</p> 81 <h1>発表概要</h1>
82 <p>PS3 ゲーム開発用フレームワーク <span class="text-maroon">Cerium</span> の紹介.</p>
83 <p>Linda...</p>
84 </div>
85
86 <div class="slide" id="id17">
87 <h1>Cerium を用いたゲーム開発</h1>
88 <div align="center" class="align-center"><img alt="images/cerium_game.jpg" class="align-center" src="images/cerium_game.jpg" style="width: 450px;" /></div>
89 <div align="center">
90 SuperDandy3D
91 </div><ul class="simple">
92 <li>3D シューティングゲーム</li>
93 <li>Cerium を用いて学生が作成</li>
94 <li>ジョイスティックやキーボードでの操作が可能<ul>
95 <li>SDL を用いて入力値を取得している</li>
96 </ul>
97 </li>
98 </ul>
99 </div>
100
101
102 <!-- section:Blender -->
103 <li class="slide">
104 <h1>3Dモデル</h1>
105 <p>ポリゴン: 3つの座標によって表現される三角平面.</p>
106 <p>テクスチャ: ポリゴンに貼られた2Dの画像</p>
107 <p>3D オブジェクト: ポリゴンが集まってできた一つのブジェクト</p>
108 <img src=""/>
109 </li>
110 <li class="slide">
111 <h1>3Dモデルの作成</h1>
112 <p>Blender: フリーの高機能なモデリングツール</p>
113
114 <img src=""/>
115 </li>
116
117 <div class="slide">
118 <h1>モデルをCeriumに読ませる.</h1>
82 <img src="photo/cerium_sg_tree.jpg" alt="sg" > 119 <img src="photo/cerium_sg_tree.jpg" alt="sg" >
83 <li class="slide"> 120 <p>3Dオブジェクトの作成 Blender. 生成したオブジェクトをXMLに変換.</p>
84 <h1>Blender から SceneGraph 用の xml 生成</h1> 121 <p>Ceriumでは, オブジェクトをSceneGraphと呼ばれるツリー構造で保持.</p>
85 PythonScript の導入<br> 122 </div>
86 <p><ol><br> 123
87 <li> Blender をダウンロードしてインストール</li><br> 124 <!-- section:Cerium -->
88 <li> export_xml.py を用意する</li><br> 125
89 <li>"/Applications/blender-version/blender.app/Contens/MacOS/.blender/scripts<br> 126 <li class="slide">
90 "<br> 127 <h1>Cellとは</h1>
91 <pre> 以下にexport_xml.py をコピー</li><br> 128
92 </pre> 129 <big>Cell</big>とはソニー、東芝、IBM社の3社が共同開発したマイクロプロセッサ<br><br>
93 <li>Blender を起動すると File -> Export に Libps3 (.xml) が追加される</li><br> 130 Cellは1基の制御系のプロセッサコア<u>PPE</u>と、8基の演算系プロセッサコア<u>SPE</u>で構成される(Ceriumで扱えるSPEの数は6基)。
94 </ol><br> 131 PPEよりもSPEが高速なので、1SPE 上で実行するだけでも意味がある。
95 <p>ゲームの初期化部分でcrateFromXMLfileを呼ぶ<br> 132 それぞれ高速なバスで接続されている<br><br>
96 <font size="4"><pre><br> 133
97 void<br> 134 <table height="100%" width="100%" border="0">
98 game_init(TaskManager *manager, int bg)<br> 135 <tr><td align="center" valign="middle">
99 {<br> 136 <img src="gazo/cell1.png" style="width: 40%%"></td></tr>
100 <pre> sgroot->createFromXMLfile(manager, "xml_file/SG.xml");<br> 137 </table>
101 </pre> 138
102 ...<br> 139 <!--<img src="gazo/cell1.png" style="width: 45%%"><br>-->
103 </pre></font><br> 140 </li>
141
142 <div class="slide">
143 <h1>Ceriumとは</h1>
144 <big>Cerium</big>とは当研究室で開発したゲーム開発用フレームワークである<br><br>
145
146 <u>Task Manager</u><br>
147  タスクと呼ばれる分割されたプログラムを管理する<br>
148
149 <u>Scene Graph</u><br>
150  ゲーム中のオブジェクトの振る舞いや、ルールを管理する。
151
152 <u>Rendering Engine</u><br>
153  Cerium独自に開発した描画用のエンジン
154
155 <br><br>
156 の3つの要素から構成される。<br><br>
157 Ceriumは PS3/Cell、linux, macosx 上で動作する。
158
159 </div>
160
161 <div class="slide">
162 <h1>Rendering Engineの構成</h1>
163 <p class="ex2">Rendering Engineは主に3つのタスクから構成されている</p>
164
165 <u>CreatePolygonタスク</u><br>
166  モデリングデータからポリゴンを生成するタスク<br>
167 <u>CreateSpanタスク</u><br>
168  生成されたポリゴンを水平な直線(Span)に分割するタスク<br>
169 <u>DrawSpanタスク</u><br>
170  Spanのデータを元に、画面に描画するタスク<br>
171
172 </div>
173
174 <div class="slide">
175 <h1>Rendering Engineの流れ</h1>
176
177 <img src="gazo/rendering1.png" style="display:block; width: 60%; margin: auto;">
178
179 <u><big>CreatePolygon</big></u>:<br>
180 SceneGraph をもとに回転や並行移動したポリゴンを、モデルデータから生成するタスク<br>
181 ポリゴンは三角形である<br>
182 回転や平行移動はSceneGraphが持っている変換行列を用いる
183 </div>
184
185 <div class="slide">
186 <h1>Rendering Engineの流れ</h1>
187
188 <img src="gazo/rendering2.png" style="display:block; width: 60%; margin: auto;">
189
190 <div style="float: left; width: 50%;"><u><big>CreateSpan</big></u>:<br>
191 三角形のポリゴンを線に分割するタスク。
192 生成されたポリゴンを水平な直線(Span)の集合へと分割する<br>
193 Spanとは1ドット単位で分割された線
194 </div>
195
196 <img src="gazo/span2.png" style="display:block; width: 38%; float: right; margin-top:5%">
197
198
199 </div>
200
201 <div class="slide">
202 <h1>Rendering Engineの流れ</h1>
203 <br>
204 <img src="gazo/rendering3.png" style="display:block; width: 65%; margin: auto;">
205
206 <u><big>DrawSpan</big></u>:<br>
207 Spanを画面へ描画するタスク<br>
208 Spanを1Dotずつ見ていき、対応する画面の1Dotに色をつける<br>
209 色はSpanに対応する画像の色をみて決める
210 </div>
211
212 <li class="slide">
213 <h1>SceneGraph</h1>
214 <img src="photo/cerium_sg_tree.jpg" alt="sg" >
215 <p>Blenderで生成した3Dモデルを独自のXML形式で出力.</p>
216 <p></p>
217 <p>SceneGraph の各ノードには <font color="red">MoveTask, Collision Task</font> がある.</p>
218 </pre>
219 </li>
220
221 <li class="slide">
222 <h1>SceneGraph と Rendering Engine</h1>
223 <p><pre> SceneGraph -> SceneGraph<br>
224 SceneGraph -> Polygon<br>
225 Polygon -> Span Pack<br>
226 Span Pack を Texture を使って Rendering<br>
227 これらを大きく並列に実行する<br>
228 Rendering は細かく並列に実行する<br>
229 </pre>
230 </li>
231 <li class="slide">
232 <h1>SceneGraph と Rendering Engine</h1>
233 <p>1 dot 1 dot SPUが書いていく<br>
234 <p><td><img src="photo/rendering.png" alt="rendering" ></td><br>
104 <p></li> 235 <p></li>
236 <li class="slide">
237 <h1>Rendering Task</h1>
238 SG2PP<br>
239 <ul><li> SceneGraph を操作後、ポリゴンに変換し PolygonPack (ポリゴンの集合)を生成する
240 </li>
241 PP2SP<br>
242 <li> ポリゴンの中から、Span (ポリゴン内にあるx軸に水平な線分) を抽出し、 SpanPack (Span の集合)を生成する
243 </li>
244 DrawSpan<br>
245 <li> Span を使って 1 ラインずつ FrameBuffer に描画していく
246 </li>
247 <p></ul>
248 </li>
249
105 <li class="slide"> 250 <li class="slide">
106 <h1>PlayStation3 と Cell</h1> 251 <h1>PlayStation3 と Cell</h1>
107 <p> 252 <p>
108 <ul> 253 <ul>
109 <li>Video Chip を 操作することができないので、SPEを用いてレンダリングしている。</li><br> 254 <li>Video Chip を 操作することができないので、SPEを用いてレンダリングしている。</li><br>
126 <li>SPE は <font color="red">256KB</font> の Local Store (LS) </li><br> 271 <li>SPE は <font color="red">256KB</font> の Local Store (LS) </li><br>
127 <li>SPE からメインメモリへ直接アクセスできない (DMAを使う)</li><br> 272 <li>SPE からメインメモリへ直接アクセスできない (DMAを使う)</li><br>
128 <li>SPE は 128 ビットレジスタを 128 個持っている</li><br> 273 <li>SPE は 128 ビットレジスタを 128 個持っている</li><br>
129 </ul> 274 </ul>
130 </ul> 275 </ul>
131 </li>
132
133 <li class="slide">
134 <h1>並列プログラムとは</h1>
135 <ul>
136 <li>取るに足らないようなプログラムでも並列に実行する必要がある。</li><br>
137 <li>PPEがとても遅いので、SPEで実行するべきである。</li><br>
138 <li>例えば、<font color="orange">Word count</font> </li><br>
139 </ul>
140 </li>
141
142 <li class="slide">
143 <h1>プログラムを Task に分割</h1>
144 <p>Task には依存関係がある(整合性を保つために)<br>
145 <p><font color="orange">Open/CL , Spurs Engine </font><br>
146 <p>
147 </li> 276 </li>
148 277
149 <li class="slide"> 278 <li class="slide">
150 <h1>並列性</h1> 279 <h1>並列性</h1>
151 <p>並列度を維持するには</p> 280 <p>並列度を維持するには</p>
208 並列化とチューニングだけPS3上で行なう<br> 337 並列化とチューニングだけPS3上で行なう<br>
209 SPU上のメモリをCode と Data を Hash とメモリリストで管理する<br> 338 SPU上のメモリをCode と Data を Hash とメモリリストで管理する<br>
210 SPUに入り切らない巨大なTaskでも実行できる<br> 339 SPUに入り切らない巨大なTaskでも実行できる<br>
211 </pre> 340 </pre>
212 </li> 341 </li>
213 <li class="slide"> 342
214 <h1>SceneGraph</h1>
215 <pre> 階層化された3Dオブジェクト<br>
216 子供の向きを決定する変換行列<br>
217 Camera<br>
218 背景<br>
219 入力デバイス<br>
220 </pre>
221 SceneGraph のノードには、<br>
222 <pre> MoveTask<br>
223 Collision Task <br>
224 がある<br>
225 </pre>
226 </li>
227 <li class="slide"> 343 <li class="slide">
228 <h1>ゲームとは、</h1> 344 <h1>ゲームとは、</h1>
229 <p><pre> SceneGraph を<br> 345 <p><pre> SceneGraph を<br>
230 MoveTask<br> 346 MoveTask<br>
231 CollsionTask<br> 347 CollsionTask<br>
241 MoveTask<br> 357 MoveTask<br>
242 CollsionTask<br> 358 CollsionTask<br>
243 </pre> 359 </pre>
244 だけを書けば、あとは、Cell が自動的に並列に実行してくれる<br> 360 だけを書けば、あとは、Cell が自動的に並列に実行してくれる<br>
245 <p></li> 361 <p></li>
246 <li class="slide"> 362
247 <h1>Task の作り方</h1>
248 SchedTask を継承した class を作る<br>
249 <pre><br>
250 class SpeTask : public SchedTask {<br>
251 <pre> SchedConstructor( SpeTask );<br>
252 int run(TaskManager *manager, void *rbuf, void *wbuf);<br>
253 </pre>
254 };<br>
255 </pre><br>
256 <p>run 関数は Task における main 関数のようなもの<br>
257 SchedConstructor() で class 名を登録する<br>
258 (C++のnew を使うとメモリを食われる...)<br>
259 <p>SchedRegisterTask(TASK_SPE, SpeTask) で SpeTask に TASK_SPE という ID をつけて<br>
260 登録します<br>
261 <p></li>
262 <li class="slide">
263 <h1>Task の作り方(Con't)</h1>
264 <pre><br>
265 /* 先ほど登録した ID を指定して Task を生成 */<br>
266 HTaskPtr task = manager->create_task(TASK_SPE);<br>
267 <p>/* 入出力先の指定 */<br>
268 task->add_inData(rbuff, rbuff_SIZE);<br>
269 task->add_outData(wbuff, wbuff_SIZE);<br>
270 <p>/* CPU の指定 */<br>
271 task->set_cpu(SPE_ANY);<br>
272 <p>/* Task の投入 */<br>
273 task->spawn();<br>
274 </pre><br>
275 <p></li>
276 <li class="slide">
277 <h1>Task の作り方(Con't)</h1>
278 Task は依存関係を記述する事ができる<br>
279 <pre><br>
280 /* taskB は taskA が終わるまで待つ */<br>
281 taskB->wait_for(taskA);<br>
282 <p>/* taskC は taskB が終わるまで待つ */<br>
283 taskC->wait_for(taskB);<br>
284 </pre><br>
285 <p></li>
286 <li class="slide"> 363 <li class="slide">
287 <h1>並列アーキテクチャは並列でないと...</h1> 364 <h1>並列アーキテクチャは並列でないと...</h1>
288 特に、Cell/PS3 は、SPUで実行しないとだめ<br> 365 特に、Cell/PS3 は、SPUで実行しないとだめ<br>
289 <pre> 既存のプログラミングでは、まったく歯が立たない<br> 366 <pre> 既存のプログラミングでは、まったく歯が立たない<br>
290 </pre> 367 </pre>
295 <pre> 最初に大量のTaskをすべて作る<br> 372 <pre> 最初に大量のTaskをすべて作る<br>
296 Task が自分でデータを拾って来る<br> 373 Task が自分でデータを拾って来る<br>
297 Task 同士が、同期を行なう<br> 374 Task 同士が、同期を行なう<br>
298 </pre> 375 </pre>
299 </li> 376 </li>
300 <li class="slide"> 377
301 <h1>Cerium Engine での同期</h1> 378 <!-- section:Linda -->
302 <p><pre> Task 内では同期はしない<br>
303 Local Storage/専有したメインメモリしか使わない<br>
304 Task が終了した時に、Single Thread で動いているPPE<br>
305 がデータの整理/同期を行なう<br>
306 Task 側では、Task の生成は行なわない<br>
307 Task の post_func (continuation) で、Taskを生成する<br>
308 </pre>
309 </li>
310 <li class="slide">
311 <h1>SPE Task, PPE Task</h1>
312 <pre> Task 内で生成しても即座には実行されない<br>
313 Task 終了時に、SPEに送る Task List が作られる<br>
314 Task List のアドレスがSPEにメールされる<br>
315 SPEがメールを見て、Task List を読み込み実行する<br>
316 Task List の読み込みとSPEのTaskの実行は並列<br>
317 Task List がなくなる(なくなりそうになると)と、<br>
318 PPEにメールで要求する<br>
319 </pre>
320 PPE Task<br>
321 <pre> SPE Task と互換。メインメモリを自由に参照できる<br>
322 </pre>
323 </li>
324 <li class="slide">
325 <h1>Fifo TaskManager</h1>
326 <p>全部、同じCPU上で実行する。<br>
327 <p>OS X 上で動作する (Linux でも)<br>
328 <p>デバッグ用<br>
329 <p></li>
330 <li class="slide">
331 <h1>MemList と Hash</h1>
332 <pre> get_segment/put_segment/wait_segement<br>
333 明示的にキャッシュ制御する必要がある<br>
334 </pre>
335 特に、<br>
336 <p>Dynamic SPE Task<br>
337 <pre> SPE上に常駐しないTask<br>
338 MemList と Hash で管理されている<br>
339 </pre>
340 256K (GBAと同じ!?) しかメモリがないので重要<br>
341 <p></li>
342 <li class="slide">
343 <h1>SPU上でのコード管理</h1>
344 <pre> GCCのOverlayを使う <br>
345 Overlay では、異なる場所にコードを置けない<br>
346 部分的にPICではなく、絶対参照に変更する<br>
347 自分自身へは相対参照。ライブラリへは絶対参照<br>
348 Perl Script で書き換える<br>
349 </pre>
350 </li>
351 <li class="slide">
352 <h1>Task list</h1>
353 <p><pre> task_list にオブジェクト生成するコードを入れる<br>
354 オブジェクトが生成されてしまえば、普通に扱える<br>
355 task 実行中にコードが追い出されることはない<br>
356 現在実行中のコード<br>
357 次にロードするコード<br>
358 の二つは必ずメモリ上にある<br>
359 </pre>
360 </li>
361 <li class="slide">
362 <h1>SceneGraph と Rendering Engine</h1>
363 <p><pre> SceneGraph -> SceneGraph<br>
364 SceneGraph -> Polygon<br>
365 Polygon -> Span Pack<br>
366 Span Pack を Texture を使って Rendering<br>
367 これらを大きく並列に実行する<br>
368 Rendering は細かく並列に実行する<br>
369 </pre>
370 </li>
371 <li class="slide">
372 <h1>SceneGraph と Rendering Engine</h1>
373 <p>1 dot 1 dot SPUが書いていく<br>
374 <p><td><img src="photo/rendering.png" alt="rendering" ></td><br>
375 <p></li>
376 <li class="slide">
377 <h1>Rendering Task</h1>
378 SG2PP<br>
379 <ul><li> SceneGraph を操作後、ポリゴンに変換し PolygonPack (ポリゴンの集合)を生成する
380 </li>
381 PP2SP<br>
382 <li> ポリゴンの中から、Span (ポリゴン内にあるx軸に水平な線分) を抽出し、 SpanPack (Span の集合)を生成する
383 </li>
384 DrawSpan<br>
385 <li> Span を使って 1 ラインずつ FrameBuffer に描画していく
386 </li>
387 <p></ul>
388 </li>
389 379
390 <li class="slide"> 380 <li class="slide">
391 <h1>Demo</h1> 381 <h1>Demo</h1>
392 <pre> 相互制約が非常に大きい物理シミュレーションの例<br> 382 <pre> 相互制約が非常に大きい物理シミュレーションの例<br>
393 非ホロノミック系なので、単純な積分では力学を決定できない<br> 383 非ホロノミック系なので、単純な積分では力学を決定できない<br>