Mercurial > hg > Events > OSC2010
diff 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 |
line wrap: on
line diff
--- a/presen/osc2010.html Fri Oct 01 20:32:33 2010 +0900 +++ b/presen/osc2010.html Sat Oct 02 01:09:44 2010 +0900 @@ -76,33 +76,178 @@ </ul> </font> </li> + +<div class="slide"> +<h1>発表概要</h1> +<p>PS3 ゲーム開発用フレームワーク <span class="text-maroon">Cerium</span> の紹介.</p> +<p>Linda...</p> +</div> + +<div class="slide" id="id17"> +<h1>Cerium を用いたゲーム開発</h1> +<div align="center" class="align-center"><img alt="images/cerium_game.jpg" class="align-center" src="images/cerium_game.jpg" style="width: 450px;" /></div> +<div align="center"> + SuperDandy3D +</div><ul class="simple"> +<li>3D シューティングゲーム</li> +<li>Cerium を用いて学生が作成</li> +<li>ジョイスティックやキーボードでの操作が可能<ul> +<li>SDL を用いて入力値を取得している</li> +</ul> +</li> +</ul> +</div> + + +<!-- section:Blender --> <li class="slide"> -<h1>ゲームの作り方</h1> -<p>ゲームとは: 3Dモデルのレンダリング & 操作</p> +<h1>3Dモデル</h1> +<p>ポリゴン: 3つの座標によって表現される三角平面.</p> +<p>テクスチャ: ポリゴンに貼られた2Dの画像</p> +<p>3D オブジェクト: ポリゴンが集まってできた一つのブジェクト</p> +<img src=""/> +</li> +<li class="slide"> +<h1>3Dモデルの作成</h1> +<p>Blender: フリーの高機能なモデリングツール</p> + +<img src=""/> +</li> + +<div class="slide"> +<h1>モデルをCeriumに読ませる.</h1> <img src="photo/cerium_sg_tree.jpg" alt="sg" > +<p>3Dオブジェクトの作成 Blender. 生成したオブジェクトをXMLに変換.</p> +<p>Ceriumでは, オブジェクトをSceneGraphと呼ばれるツリー構造で保持.</p> +</div> + +<!-- section:Cerium --> + <li class="slide"> -<h1>Blender から SceneGraph 用の xml 生成</h1> -PythonScript の導入<br> -<p><ol><br> -<li> Blender をダウンロードしてインストール</li><br> -<li> export_xml.py を用意する</li><br> -<li>"/Applications/blender-version/blender.app/Contens/MacOS/.blender/scripts<br> -"<br> -<pre> 以下にexport_xml.py をコピー</li><br> +<h1>Cellとは</h1> + +<big>Cell</big>とはソニー、東芝、IBM社の3社が共同開発したマイクロプロセッサ<br><br> +Cellは1基の制御系のプロセッサコア<u>PPE</u>と、8基の演算系プロセッサコア<u>SPE</u>で構成される(Ceriumで扱えるSPEの数は6基)。 +PPEよりもSPEが高速なので、1SPE 上で実行するだけでも意味がある。 +それぞれ高速なバスで接続されている<br><br> + +<table height="100%" width="100%" border="0"> +<tr><td align="center" valign="middle"> +<img src="gazo/cell1.png" style="width: 40%%"></td></tr> +</table> + +<!--<img src="gazo/cell1.png" style="width: 45%%"><br>--> +</li> + +<div class="slide"> +<h1>Ceriumとは</h1> +<big>Cerium</big>とは当研究室で開発したゲーム開発用フレームワークである<br><br> + +<u>Task Manager</u><br> + タスクと呼ばれる分割されたプログラムを管理する<br> + +<u>Scene Graph</u><br> + ゲーム中のオブジェクトの振る舞いや、ルールを管理する。 + +<u>Rendering Engine</u><br> + Cerium独自に開発した描画用のエンジン + +<br><br> +の3つの要素から構成される。<br><br> +Ceriumは PS3/Cell、linux, macosx 上で動作する。 + +</div> + +<div class="slide"> +<h1>Rendering Engineの構成</h1> +<p class="ex2">Rendering Engineは主に3つのタスクから構成されている</p> + +<u>CreatePolygonタスク</u><br> + モデリングデータからポリゴンを生成するタスク<br> +<u>CreateSpanタスク</u><br> + 生成されたポリゴンを水平な直線(Span)に分割するタスク<br> +<u>DrawSpanタスク</u><br> + Spanのデータを元に、画面に描画するタスク<br> + +</div> + +<div class="slide"> +<h1>Rendering Engineの流れ</h1> + +<img src="gazo/rendering1.png" style="display:block; width: 60%; margin: auto;"> + +<u><big>CreatePolygon</big></u>:<br> +SceneGraph をもとに回転や並行移動したポリゴンを、モデルデータから生成するタスク<br> +ポリゴンは三角形である<br> +回転や平行移動はSceneGraphが持っている変換行列を用いる +</div> + +<div class="slide"> +<h1>Rendering Engineの流れ</h1> + +<img src="gazo/rendering2.png" style="display:block; width: 60%; margin: auto;"> + +<div style="float: left; width: 50%;"><u><big>CreateSpan</big></u>:<br> +三角形のポリゴンを線に分割するタスク。 +生成されたポリゴンを水平な直線(Span)の集合へと分割する<br> +Spanとは1ドット単位で分割された線 +</div> + +<img src="gazo/span2.png" style="display:block; width: 38%; float: right; margin-top:5%"> + + +</div> + +<div class="slide"> +<h1>Rendering Engineの流れ</h1> +<br> +<img src="gazo/rendering3.png" style="display:block; width: 65%; margin: auto;"> + +<u><big>DrawSpan</big></u>:<br> +Spanを画面へ描画するタスク<br> +Spanを1Dotずつ見ていき、対応する画面の1Dotに色をつける<br> +色はSpanに対応する画像の色をみて決める +</div> + +<li class="slide"> +<h1>SceneGraph</h1> +<img src="photo/cerium_sg_tree.jpg" alt="sg" > +<p>Blenderで生成した3Dモデルを独自のXML形式で出力.</p> +<p></p> +<p>SceneGraph の各ノードには <font color="red">MoveTask, Collision Task</font> がある.</p> </pre> -<li>Blender を起動すると File -> Export に Libps3 (.xml) が追加される</li><br> -</ol><br> -<p>ゲームの初期化部分でcrateFromXMLfileを呼ぶ<br> -<font size="4"><pre><br> -void<br> -game_init(TaskManager *manager, int bg)<br> -{<br> -<pre> sgroot->createFromXMLfile(manager, "xml_file/SG.xml");<br> +</li> + +<li class="slide"> +<h1>SceneGraph と Rendering Engine</h1> +<p><pre> SceneGraph -> SceneGraph<br> + SceneGraph -> Polygon<br> + Polygon -> Span Pack<br> + Span Pack を Texture を使って Rendering<br> + これらを大きく並列に実行する<br> + Rendering は細かく並列に実行する<br> </pre> -...<br> -</pre></font><br> +</li> +<li class="slide"> +<h1>SceneGraph と Rendering Engine</h1> +<p>1 dot 1 dot SPUが書いていく<br> +<p><td><img src="photo/rendering.png" alt="rendering" ></td><br> <p></li> <li class="slide"> +<h1>Rendering Task</h1> +SG2PP<br> +<ul><li> SceneGraph を操作後、ポリゴンに変換し PolygonPack (ポリゴンの集合)を生成する +</li> +PP2SP<br> +<li> ポリゴンの中から、Span (ポリゴン内にあるx軸に水平な線分) を抽出し、 SpanPack (Span の集合)を生成する +</li> +DrawSpan<br> +<li> Span を使って 1 ラインずつ FrameBuffer に描画していく +</li> +<p></ul> +</li> + +<li class="slide"> <h1>PlayStation3 と Cell</h1> <p> <ul> @@ -131,22 +276,6 @@ </li> <li class="slide"> -<h1>並列プログラムとは</h1> -<ul> - <li>取るに足らないようなプログラムでも並列に実行する必要がある。</li><br> - <li>PPEがとても遅いので、SPEで実行するべきである。</li><br> - <li>例えば、<font color="orange">Word count</font> </li><br> -</ul> -</li> - -<li class="slide"> -<h1>プログラムを Task に分割</h1> -<p>Task には依存関係がある(整合性を保つために)<br> -<p><font color="orange">Open/CL , Spurs Engine </font><br> -<p> -</li> - -<li class="slide"> <h1>並列性</h1> <p>並列度を維持するには</p> <ul> @@ -210,20 +339,7 @@ SPUに入り切らない巨大なTaskでも実行できる<br> </pre> </li> -<li class="slide"> -<h1>SceneGraph</h1> -<pre> 階層化された3Dオブジェクト<br> - 子供の向きを決定する変換行列<br> - Camera<br> - 背景<br> - 入力デバイス<br> -</pre> -SceneGraph のノードには、<br> -<pre> MoveTask<br> - Collision Task <br> - がある<br> -</pre> -</li> + <li class="slide"> <h1>ゲームとは、</h1> <p><pre> SceneGraph を<br> @@ -243,46 +359,7 @@ </pre> だけを書けば、あとは、Cell が自動的に並列に実行してくれる<br> <p></li> -<li class="slide"> -<h1>Task の作り方</h1> -SchedTask を継承した class を作る<br> -<pre><br> -class SpeTask : public SchedTask {<br> -<pre> SchedConstructor( SpeTask );<br> - int run(TaskManager *manager, void *rbuf, void *wbuf);<br> -</pre> -};<br> -</pre><br> -<p>run 関数は Task における main 関数のようなもの<br> -SchedConstructor() で class 名を登録する<br> -(C++のnew を使うとメモリを食われる...)<br> -<p>SchedRegisterTask(TASK_SPE, SpeTask) で SpeTask に TASK_SPE という ID をつけて<br> -登録します<br> -<p></li> -<li class="slide"> -<h1>Task の作り方(Con't)</h1> -<pre><br> -/* 先ほど登録した ID を指定して Task を生成 */<br> -HTaskPtr task = manager->create_task(TASK_SPE);<br> -<p>/* 入出力先の指定 */<br> -task->add_inData(rbuff, rbuff_SIZE);<br> -task->add_outData(wbuff, wbuff_SIZE);<br> -<p>/* CPU の指定 */<br> -task->set_cpu(SPE_ANY);<br> -<p>/* Task の投入 */<br> -task->spawn();<br> -</pre><br> -<p></li> -<li class="slide"> -<h1>Task の作り方(Con't)</h1> -Task は依存関係を記述する事ができる<br> -<pre><br> -/* taskB は taskA が終わるまで待つ */<br> -taskB->wait_for(taskA);<br> -<p>/* taskC は taskB が終わるまで待つ */<br> -taskC->wait_for(taskB);<br> -</pre><br> -<p></li> + <li class="slide"> <h1>並列アーキテクチャは並列でないと...</h1> 特に、Cell/PS3 は、SPUで実行しないとだめ<br> @@ -297,95 +374,8 @@ Task 同士が、同期を行なう<br> </pre> </li> -<li class="slide"> -<h1>Cerium Engine での同期</h1> -<p><pre> Task 内では同期はしない<br> - Local Storage/専有したメインメモリしか使わない<br> - Task が終了した時に、Single Thread で動いているPPE<br> - がデータの整理/同期を行なう<br> - Task 側では、Task の生成は行なわない<br> - Task の post_func (continuation) で、Taskを生成する<br> -</pre> -</li> -<li class="slide"> -<h1>SPE Task, PPE Task</h1> -<pre> Task 内で生成しても即座には実行されない<br> - Task 終了時に、SPEに送る Task List が作られる<br> - Task List のアドレスがSPEにメールされる<br> - SPEがメールを見て、Task List を読み込み実行する<br> - Task List の読み込みとSPEのTaskの実行は並列<br> - Task List がなくなる(なくなりそうになると)と、<br> - PPEにメールで要求する<br> -</pre> -PPE Task<br> -<pre> SPE Task と互換。メインメモリを自由に参照できる<br> -</pre> -</li> -<li class="slide"> -<h1>Fifo TaskManager</h1> -<p>全部、同じCPU上で実行する。<br> -<p>OS X 上で動作する (Linux でも)<br> -<p>デバッグ用<br> -<p></li> -<li class="slide"> -<h1>MemList と Hash</h1> -<pre> get_segment/put_segment/wait_segement<br> - 明示的にキャッシュ制御する必要がある<br> -</pre> -特に、<br> -<p>Dynamic SPE Task<br> -<pre> SPE上に常駐しないTask<br> - MemList と Hash で管理されている<br> -</pre> -256K (GBAと同じ!?) しかメモリがないので重要<br> -<p></li> -<li class="slide"> -<h1>SPU上でのコード管理</h1> -<pre> GCCのOverlayを使う <br> - Overlay では、異なる場所にコードを置けない<br> - 部分的にPICではなく、絶対参照に変更する<br> - 自分自身へは相対参照。ライブラリへは絶対参照<br> - Perl Script で書き換える<br> -</pre> -</li> -<li class="slide"> -<h1>Task list</h1> -<p><pre> task_list にオブジェクト生成するコードを入れる<br> - オブジェクトが生成されてしまえば、普通に扱える<br> - task 実行中にコードが追い出されることはない<br> - 現在実行中のコード<br> - 次にロードするコード<br> - の二つは必ずメモリ上にある<br> -</pre> -</li> -<li class="slide"> -<h1>SceneGraph と Rendering Engine</h1> -<p><pre> SceneGraph -> SceneGraph<br> - SceneGraph -> Polygon<br> - Polygon -> Span Pack<br> - Span Pack を Texture を使って Rendering<br> - これらを大きく並列に実行する<br> - Rendering は細かく並列に実行する<br> -</pre> -</li> -<li class="slide"> -<h1>SceneGraph と Rendering Engine</h1> -<p>1 dot 1 dot SPUが書いていく<br> -<p><td><img src="photo/rendering.png" alt="rendering" ></td><br> -<p></li> -<li class="slide"> -<h1>Rendering Task</h1> -SG2PP<br> -<ul><li> SceneGraph を操作後、ポリゴンに変換し PolygonPack (ポリゴンの集合)を生成する -</li> -PP2SP<br> -<li> ポリゴンの中から、Span (ポリゴン内にあるx軸に水平な線分) を抽出し、 SpanPack (Span の集合)を生成する -</li> -DrawSpan<br> -<li> Span を使って 1 ラインずつ FrameBuffer に描画していく -</li> -<p></ul> -</li> + +<!-- section:Linda --> <li class="slide"> <h1>Demo</h1>