Mercurial > hg > Events > OSC2010
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> |