-
シーングラフとPS3 を使った
ゲームプログラミング
Cerium Task Manager
Blender / SceneGraph
-
構成案
構成案と言っても、ほぼ去年のやつの改変
- ゲームの作り方
- ゲームとはモデルのレンダリングと操作!
- うちはレンダリングエンジン自作! ネットワーク通信プロトコルも自作!
- モデリング : Blender
- モデルの作り方
- モデル -> XML 変換
- レンダリング: Cerium
- レンダリングの実装
- Ceriumの話 (PS3, タスクマネージャー)
- ネットワーク: Linda
- Lindaの話
- お魚の例題
発表概要
PS3 ゲーム開発用フレームワーク Cerium の紹介.
Linda...
Cerium を用いたゲーム開発
SuperDandy3D
- 3D シューティングゲーム
- Cerium を用いて学生が作成
- ジョイスティックやキーボードでの操作が可能
-
3Dモデル
ポリゴン: 3つの座標によって表現される三角平面.
テクスチャ: ポリゴンに貼られた2Dの画像
3D オブジェクト: ポリゴンが集まってできた一つのブジェクト
-
3Dモデルの作成
Blender: フリーの高機能なモデリングツール
モデルをCeriumに読ませる.
3Dオブジェクトの作成 Blender. 生成したオブジェクトをXMLに変換.
Ceriumでは, オブジェクトをSceneGraphと呼ばれるツリー構造で保持.
-
Cellとは
Cellとはソニー、東芝、IBM社の3社が共同開発したマイクロプロセッサ
Cellは1基の制御系のプロセッサコアPPEと、8基の演算系プロセッサコアSPEで構成される(Ceriumで扱えるSPEの数は6基)。
PPEよりもSPEが高速なので、1SPE 上で実行するだけでも意味がある。
それぞれ高速なバスで接続されている
Ceriumとは
Ceriumとは当研究室で開発したゲーム開発用フレームワークである
Task Manager
タスクと呼ばれる分割されたプログラムを管理する
Scene Graph
ゲーム中のオブジェクトの振る舞いや、ルールを管理する。
Rendering Engine
Cerium独自に開発した描画用のエンジン
の3つの要素から構成される。
Ceriumは PS3/Cell、linux, macosx 上で動作する。
Rendering Engineの構成
Rendering Engineは主に3つのタスクから構成されている
CreatePolygonタスク
モデリングデータからポリゴンを生成するタスク
CreateSpanタスク
生成されたポリゴンを水平な直線(Span)に分割するタスク
DrawSpanタスク
Spanのデータを元に、画面に描画するタスク
Rendering Engineの流れ
CreatePolygon:
SceneGraph をもとに回転や並行移動したポリゴンを、モデルデータから生成するタスク
ポリゴンは三角形である
回転や平行移動はSceneGraphが持っている変換行列を用いる
Rendering Engineの流れ
CreateSpan:
三角形のポリゴンを線に分割するタスク。
生成されたポリゴンを水平な直線(Span)の集合へと分割する
Spanとは1ドット単位で分割された線
Rendering Engineの流れ
DrawSpan:
Spanを画面へ描画するタスク
Spanを1Dotずつ見ていき、対応する画面の1Dotに色をつける
色はSpanに対応する画像の色をみて決める
-
SceneGraph
Blenderで生成した3Dモデルを独自のXML形式で出力.
SceneGraph の各ノードには MoveTask, Collision Task がある.
-
SceneGraph と Rendering Engine
SceneGraph -> SceneGraph
SceneGraph -> Polygon
Polygon -> Span Pack
Span Pack を Texture を使って Rendering
これらを大きく並列に実行する
Rendering は細かく並列に実行する
-
SceneGraph と Rendering Engine
1 dot 1 dot SPUが書いていく
|
-
Rendering Task
SG2PP
- SceneGraph を操作後、ポリゴンに変換し PolygonPack (ポリゴンの集合)を生成する
PP2SP
- ポリゴンの中から、Span (ポリゴン内にあるx軸に水平な線分) を抽出し、 SpanPack (Span の集合)を生成する
DrawSpan
- Span を使って 1 ラインずつ FrameBuffer に描画していく
-
PlayStation3 と Cell
- Video Chip を 操作することができないので、SPEを用いてレンダリングしている。
- しかし現在、新型PlayStation3は開発用に使うことができない。
- PlayStation3 のファームウェアアップデートによって、公式でPS3Linuxをサポートしなくなった。
などの問題が起きている。
-
Cell Architecture
- Linux 側から使える SPE は 6 個
- SPE は 256KB の Local Store (LS)
- SPE からメインメモリへ直接アクセスできない (DMAを使う)
- SPE は 128 ビットレジスタを 128 個持っている
-
並列性
並列度を維持するには
の2つを考慮しなければならない。
-
階層的並列プログラミング
- Row Level での並列性
- Vector (データ並列)
- Streaming (パイプライン)
- SPE Level での並列性
データの読み込み、実行、書き込みのパイプライン
- High Level での並列性
-
データ読み込み、 実行、データ書込
パイプラインバッファはいくつ?
-
Cerium Task Manager
- Open/GL Mesa に Cell driver を書いたが、メインメモリに依存しすぎていたため、動作が遅くなってしまった。
- Task base で書く必要がある。
- Video Chip が公開されていないので、Rendering Engine も用意すべき
- SPE の Local Store は 256KB なので、コードの管理も必要
このような経緯で、Cell Task Manager を作成することになった。
-
Cerium Task Manager の特徴
PPU/SPUで、Task の互換性がある
SPU上の最適化は当面禁止
OS X 上でも動く
コードのデバッグはOS X 上でやる
並列化とチューニングだけPS3上で行なう
SPU上のメモリをCode と Data を Hash とメモリリストで管理する
SPUに入り切らない巨大なTaskでも実行できる
-
ゲームとは、
SceneGraph を
MoveTask
CollsionTask
で書き換えていく
MoveTask, CollsionTask は、ステートパターンで
入れ換えられる
これで、すべて書ける。
-
つまり、
SceneGraph の構築
MoveTask
CollsionTask
だけを書けば、あとは、Cell が自動的に並列に実行してくれる
-
並列アーキテクチャは並列でないと...
特に、Cell/PS3 は、SPUで実行しないとだめ
既存のプログラミングでは、まったく歯が立たない
トリビアルなプログラムでも、並列にする必要がある
-
やってはいけないこと
最初に大量のTaskをすべて作る
Task が自分でデータを拾って来る
Task 同士が、同期を行なう
-
Demo
相互制約が非常に大きい物理シミュレーションの例
非ホロノミック系なので、単純な積分では力学を決定できない
SPU上で、すべての要素を同時に計算する必要がある
(あまり並列計算向きではない...ベクトル向き)
(地味です...)
-
まとめ
Blender/Linux/Cerium を用いたオープンソースなゲームフレームワーク
SceneGraphを作れば、move/collision を記述するだけで並列に実行される
ソフトウェアレンダリングなんで、なんでも自分で書ける
-
今後の課題