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>