Mercurial > hg > Events > OSC2010
view 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 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> <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>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>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> <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>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> <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>ゲームとは、</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>並列アーキテクチャは並列でないと...</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> <!-- section:Linda --> <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>