view presen/osc2010.html @ 7:93c3962d9a01

add file
author Yutaka_Kinjyo
date Sat, 02 Oct 2010 08:22:30 +0900
parents 19623b8a4144
children 57a4fa3f2359
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>

<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>学生実験でPS3上でのGame作成を行っている</li>
<li>Cerium を用いて学生が作成</li>
<li>ジョイスティックやキーボードでの操作が可能<ul>
<li>SDL を用いて入力値を取得している</li>
</ul>
</li>
</ul>
</div>


<!-- section:Blender -->
<li class="slide">
<h1>3Dモデリング</h1>

まずはゲーム中のオブジェクトのモデリングを行う


</li>

<li class="slide">
<h1>3Dモデルの作成</h1>
<p>Blender: フリーの高機能なモデリングツール</p>
<img src="gazo/blender.jpeg" style="width: 30%">
<img src="gazo/post.png" style="width: 30%">
<img src="gazo/blenderlogo.jpeg" style="width: 30%">
</li>

<li class="slide">
<h1>3Dモデルの作成</h1>
<p>Blender: 作成画面</p>
<img src="gazo/blender2.png" style="width: 60%">
</li>

<div class="slide">
<h1>モデルをCeriumに読ませる.</h1>
<img src="gazo/model2xml.png" style="width: 90%">
<ul>
  <li>作成したオブジェクトはBlenderから、スクリプトを使ってCerium用に変換</li>
  <li>xmlファイルとなったモデリングデータをCeriumが描画する</li>
</ul>
</div>

<div class="slide">
<h1>PS3,Cell,Cerium</h1>
PS3にはCell Broadband Engine が搭載されている。
</div>

<!-- section:Cerium -->

<li class="slide">
<h1>Cellとは</h1>

<big>Cell</big>とはソニー、東芝、IBM社の3社が共同開発したマイクロプロセッサ<br>
Cellは1基の制御系のプロセッサコア<u>PPE</u>と、8基の演算系プロセッサコア<u>SPE</u>で構成される(Ceriumで扱えるSPEの数は6基)。それぞれ高速なバスで接続されている<br><br>

<table height="100%" width="100%" border="0">
<tr><td align="center" valign="middle">
<img src="gazo/cell1.png" style="width: 35%%"></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>

<li class="slide">
<h1>SceneGraph</h1>
<img src="photo/cerium_sg_tree.jpg" style="width 100%" >
<p>Blenderで生成した3Dモデルを独自のXML形式で出力.</p>
<p></p>
<p>SceneGraph の各ノードには <font color="red">MoveTask, Collision Task</font> がある.</p>
</pre>
</li>

<div class="slide">
<h1>SceneGraph</h1>
<img src="gazo/boss.png" style="width: 60%">
</div>

<div class="slide">
<h1>SceneGraph</h1>
<img src="gazo/scenegraph2.png" style="width: 100%">
</div>

<div class="slide">
<h1>SceneGraph</h1>
<img src="gazo/scenegraph1.png" style="width: 100%">
</div>

<div class="slide">
<h1>SceneGraph</h1>
<img src="gazo/move.png" style="width: 70%">
</div>

<div class="slide">
<h1>SceneGraph</h1>
<img src="gazo/collision1.png" style="width: 70%">
</div>

<div class="slide">
<h1>SceneGraph</h1>
<img src="gazo/collision2.png" style="width: 70%">
</div>

<div class="slide">
<h1>SceneGraph</h1>
<img src="gazo/collision3.png" style="width: 70%">
</div>

<div class="slide">
<h1>SceneGraph</h1>
<img src="gazo/boss2.png" style="width: 60%">
</div>

<div class="slide">
<h1>SceneGraph</h1>
<img src="gazo/boss3.png" style="width: 70%">
</div>

<div class="slide">
<h1>SceneGraph</h1>
<p><pre>       SceneGraph を<br>
         MoveTask<br>
         CollsionTask<br>
      で書き換えていく<br>
         MoveTask, CollsionTask は、ステートパターンで<br>
         入れ換えられる<br>
</pre>
これで、すべて書ける。<br>
<p></div>


<div class="slide">
<h1>つまり、</h1>
<pre>    SceneGraph の構築<br>
    MoveTask<br>
    CollsionTask<br>
</pre>
だけを書けば、あとは、Cerium Task Manager が自動的に並列に実行管理してくれる<br>
<p></div>

<div class="slide">
<h1>SceneGraphの結果を描画</h1>
SceneGraphで操作したオブジェクトの結果を、レンダリングエンジンで描画する
</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>

<div class="slide">
<h1>TaskManager</h1>
SceneGraph, RenderingEngineのTaskを管理し、SPEに
</div>

<div class="slide">
<h1>TaskManager</h1>

<ul>
<li>TaskManagerは、Taskと呼ばれる、分割された各プログラムを管理する</li>
<ul>
<li>Taskの単位はサブルーチン</li>
</ul>
<li>Task同士の依存関係を考慮</li>
<li>実行可能になったTaskをSPEに渡す</li>
</ul>

<table height="100%" width="100%" border="0">
<tr><td align="center" valign="middle">
<img src="gazo/taskmanager1.png" style="width: 50%%"></td></tr>
</table>

</div>

<div class="slide">
<h1>CeriumにおけるTask</h1>

TaskはTaskManagerを使って生成する。Taskを生成する際に以下のような要素が
設定可能である。

<ul>
  <li>Input data</li>
  <li>Output data</li>
  <li>Paramater</li>
  <li>CPU type</li>
  <li>Dependency</li>
</ul>

</div>

<div class="slide">
<h1>CeriumにおけるTask</h1>
<big><u>Dependency</u></big><br>
<ul>
<li>Dependencyは他のTaskとの依存関係を示す。</li>
<li>例えばTaskAがTaskBをwaitする場合、TaskBが実行完了すると、TaskAが実行可能になる。</li>
<li>Taskの実行完了は、SPEのMail送信ボックスにデータが書き込まれ通知される。</li>
</ul>

<table height="100%" width="100%" border="0">
<tr><td align="center" valign="middle">
<img src="gazo/dependency1.png" style="width: 40%%"></td></tr>
</table>

</div>


<div class="slide">
<h1>CeriumにおけるTask</h1>
<big><u>Mail機能</u></big><br>
<ul>
<li>Cellの機能の1つ</li>
<li>32bitのメッセージをPPE,SPE間でやりとりできる</li>
<li>送信ボックス、受信ボックスがSPEに設けられている。</li>
<li>それぞれMailボックスはキューになっている</li>
<li>受信ボックスのサイズは4</li>
<li>送信ボックスのサイズは1</li>
</ul>

</div>

<div class="slide">
<h1>CeriumにおけるTask</h1>
<big><u>Mail機能</u></big><br>
<ul>
<li>送信ボックスのデータはPPEから、受信ボックスのデータはSPEから呼び出される</li>
<li>書き込みはその逆</li>
</ul>

<table height="100%" width="100%" border="0">
<tr><td align="center" valign="middle">
<img src="gazo/mail.png" style="width: 60%%"></td></tr>
</table>

</div>

<div class="slide">
<h1>Taskの送信</h1>

<ul>
<li>Taskは1つ毎にSPEには送らない</li>
<li>いくつかのTaskをまとめTaskListとして送る</li>
<li>TaskListをすべて完了すると、SPEからPPEへのMailが書き込まれる</li>
<li>PPE側がMailをチェックし次のTaskListをMailで通知する</li>
</ul>

<table height="100%" width="100%" border="0">
<tr><td align="center" valign="middle">
<img src="gazo/tasklist1.png" style="width: 40%%"></td></tr>
</table>

</div>



<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>
特に、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>まとめ</h1>
Blender/Linux/Cerium を用いたオープンソースなゲームフレームワーク<br>
<p>SceneGraphを作れば、move/collision を記述するだけで並列に実行される<br>
<p>ソフトウェアレンダリングなんで、なんでも自分で書ける<br>
<p>
</li>

<li class="slide">
<h1>今後の課題</h1>
</li>