Mercurial > hg > Events > OSC2010
view presen/osc2010.html @ 3:6e68a8297587
change scenario
author | Ryoma SHINYA <shinya@firefly.cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 01 Oct 2010 20:32:33 +0900 |
parents | 3b3ed6aa4103 |
children | 19623b8a4144 |
line wrap: on
line source
<html> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>2010-10-02 (土) シーングラフとPS3 を使ったゲームプログラミング</title> <!-- metadata --> <meta name="generator" content="S5" /> <meta name="version" content="S5 1.2a2" /> <meta name="author" content="Eric A. Meyer" /> <meta name="company" content="Complex Spiral Consulting" /> <!-- configuration parameters --> <meta name="defaultView" content="slideshow" /> <meta name="controlVis" content="hidden" /> <!-- style sheet links --> <link rel="stylesheet" href="ui/default/slides.css" type="text/css" media="projec tion" id="slideProj" /> <link rel="stylesheet" href="ui/default/outline.css" type="text/css" media="scree n" id="outlineStyle" /> <link rel="stylesheet" href="ui/default/print.css" type="text/css" media="print" id="slidePrint" /> <link rel="stylesheet" href="ui/default/opera.css" type="text/css" media="project ion" id="operaFix" /> <!-- S5 JS --> <script src="ui/default/slides.js" type="text/javascript"></script> </head> <body> <div class="layout"> <div id="controls"><!-- DO NOT EDIT --></div> <div id="currentSlide"><!-- DO NOT EDIT --></div> <div id="header"></div> <div id="footer"> <h1>2010-10-02 (土) シーングラフとPS3 を使ったゲームプログラミング</h1> <h2></h2> </div> </div> <ol class="xoxo presentation"> </li> <li class="slide"> <h1>シーングラフとPS3 を使った <br> ゲームプログラミング</h1> <p><pre> Cerium Task Manager<br> Blender / SceneGraph<br> </pre> </li> <li class="slide"> <h1>構成案</h1> <font size="4"> <p>構成案と言っても、ほぼ去年のやつの改変</p> <ul> <li>ゲームの作り方</li> <ol> <li>ゲームとはモデルのレンダリングと操作!</li> <li>うちはレンダリングエンジン自作! ネットワーク通信プロトコルも自作!</li> </ol> <li>モデリング : Blender</li> <ol> <li>モデルの作り方</li> <li>モデル -> XML 変換</li> </ol> <li>レンダリング: Cerium</li> <ol> <li>レンダリングの実装</li> <li>Ceriumの話 (PS3, タスクマネージャー)</li> </ol> <li>ネットワーク: Linda</ll> <ol> <li>Lindaの話</li> <li>お魚の例題</li> </ol> </ul> </font> </li> <li class="slide"> <h1>ゲームの作り方</h1> <p>ゲームとは: 3Dモデルのレンダリング & 操作</p> <img src="photo/cerium_sg_tree.jpg" alt="sg" > <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> </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> </pre> ...<br> </pre></font><br> <p></li> <li class="slide"> <h1>PlayStation3 と Cell</h1> <p> <ul> <li>Video Chip を 操作することができないので、SPEを用いてレンダリングしている。</li><br> <li>しかし現在、新型PlayStation3は開発用に使うことができない。</li><br> <li>PlayStation3 のファームウェアアップデートによって、公式でPS3Linuxをサポートしなくなった。</li><br> などの問題が起きている。 </ul> </p> </li> <li class="slide"> <h1>Cell Architecture</h1> <center> <img width="500", height="300", src="photo/Cell-main2.png" alt="pipeline" height="200"><br> </center> <br> <ul> <ul> <li>Linux 側から使える SPE は <font color="red">6</font> 個</li><br> <li>SPE は <font color="red">256KB</font> の Local Store (LS) </li><br> <li>SPE からメインメモリへ直接アクセスできない (DMAを使う)</li><br> <li>SPE は 128 ビットレジスタを 128 個持っている</li><br> </ul> </ul> </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> <li><font color="blue">データ並列</font></li> <li><font color="blue">パイプライン</font></li><br> </ul> の2つを考慮しなければならない。 </li> <li class="slide"> <h1>階層的並列プログラミング</h1> <ul> <li><font color="red">Row Level</font> での並列性</li> <ul> <li>Vector (データ並列)</li> <li>Streaming (パイプライン)</li> </ul> <br> <li><font color="red">SPE Level</font> での並列性</li> <p>データの読み込み、実行、書き込みのパイプライン</p> <br> <li><font color="red">High Level</font> での並列性</li> <ul> <li>Rendering</li> <li>SceneGraph</li> </ul> </ul> </li> <li class="slide"> <h1> データ読み込み、 実行、データ書込 </h1> <center> <img width="1000", height="500", src="photo/pipeline.jpg" alt="pipeline" height="300"> <br><br> パイプラインバッファはいくつ? </center> </li> <li class="slide"> <h1>Cerium Task Manager</h1> <p></p> <ul> <li>Open/GL Mesa に Cell driver を書いたが、メインメモリに依存しすぎていたため、動作が遅くなってしまった。</li> <li>Task base で書く必要がある。</li> <li>Video Chip が公開されていないので、Rendering Engine も用意すべき</li> <li>SPE の Local Store は 256KB なので、コードの管理も必要</li> </ul> <br> このような経緯で、Cell Task Manager を作成することになった。 </li> <li class="slide"> <h1>Cerium Task Manager の特徴</h1> <pre> PPU/SPUで、Task の互換性がある<br> SPU上の最適化は当面禁止<br> OS X 上でも動く<br> コードのデバッグはOS X 上でやる<br> 並列化とチューニングだけPS3上で行なう<br> SPU上のメモリをCode と Data を Hash とメモリリストで管理する<br> 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> MoveTask<br> CollsionTask<br> で書き換えていく<br> MoveTask, CollsionTask は、ステートパターンで<br> 入れ換えられる<br> </pre> これで、すべて書ける。<br> <p></li> <li class="slide"> <h1>つまり、</h1> <pre> SceneGraph の構築<br> MoveTask<br> CollsionTask<br> </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> <pre> 既存のプログラミングでは、まったく歯が立たない<br> </pre> トリビアルなプログラムでも、並列にする必要がある<br> <p></li> <li class="slide"> <h1>やってはいけないこと</h1> <pre> 最初に大量のTaskをすべて作る<br> Task が自分でデータを拾って来る<br> 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> <li class="slide"> <h1>Demo</h1> <pre> 相互制約が非常に大きい物理シミュレーションの例<br> 非ホロノミック系なので、単純な積分では力学を決定できない<br> SPU上で、すべての要素を同時に計算する必要がある<br> (あまり並列計算向きではない...ベクトル向き)<br> </pre> (地味です...)<br> <p> </li> <li class="slide"> <h1>まとめ</h1> Blender/Linux/Cerium を用いたオープンソースなゲームフレームワーク<br> <p>SceneGraphを作れば、move/collision を記述するだけで並列に実行される<br> <p>ソフトウェアレンダリングなんで、なんでも自分で書ける<br> <p> </li> <li class="slide"> <h1>今後の課題</h1> </li>