view rendering.tex @ 3:4ee5cef03d5f

*** empty log message ***
author akira
date Tue, 04 Mar 2008 13:41:40 +0900
parents dd72cabc3aff
children 00ef3b6ef98a
line wrap: on
line source

\section{レンダリングエンジン}
PS3Linuxでは以前我々が扱っていたPS2Linuxと違いGDPに直接アクセスすること
ができない。しかし、フレームバッファは扱うことができる。そこでMesa
\cite{bib:Mesa}のフレー
ムバッファ用ドライバであるOSMesaを使ってゲーム開発を行っていた。しかし、
OSMesaはメインメモリ依存でCellのようなマルチコアアーキテクチャを活かすよ
うな分割を行うことは容易ではない。\\
そこで我々はシーングラフ、レンダリングエンジン、タスクマネージャからなる
Ceriumを例題として用いた。\\
ゲームの中の一つの場面(Scene)を構成するオブジェクトやその振る舞い、ゲー
ムのルールの集合をSceneGraphとする。SceneGraphの各ノードがゲームの一部で
あるオブジェクトのファイルやゲームのルールとなり、ノードをたどり実行する
ことでゲームの中の一つの場面となる。SceneGraphはゲームプログラムとしての
条件を満たす物なので、一つのSceneGraphで小さなゲームと言える。\\
レンダリングエンジンはOSMesaの機能を簡素化し、よりシンプルに設計されたフ
レームワークである。OSMesaではいろいろな機能を付加し続けた結果、様々な計
算の部分でコピーがたくさん行われていた。それはCPUに多大な負荷を与えると
ともに動作が遅くなる大きな要因となっていた。そこで我々が提案するレンダリ
ングエンジンはシーングラフからポリゴンの各頂点を受け取り、頂点からSPANを
生成し、SPANに対応するテクスチャを生成するシンプルな物を目指す。\\
タスクマネージャはタスクを管理するライブラリで、タスクと呼ばれる分割され
た各プログラムを依存関係を考慮しながらメモリ上にマッピングし、SPU上では
そのプログラムをDMAによりロードする。(図\ref{fig:taskmanager})\\
\begin{figure}[htb]
\begin{center}
\includegraphics[scale=.5]{./fig/taskmanager.pdf}
\end{center}
\caption{タスクマネージャ}
\label{fig:taskmanager}
\end{figure}
これらをCbCで実装すると次のようになる。
\input{./src/render.c}
上記のソースはシーケンシャルなアルゴリズムでの実装コードである。
SCENEGRAPH2POLYGONではシーングラフの計算を行い、ポリゴンの情報から回転や
拡大、平行移動などの計算を行い、ポリゴンの情報を次のcode-segmentに渡す。
POLYGON2SPANでも同様に、受け取ったPOLYGONからSPANを出力する。SPAN2DRAWで
も基本的に変わらないが、ここで終了条件をみることになる。\\
これらのcode-segmentはすべてSPUで実行される。SPUで実行するときは前述した
通り、入力データアドレス、入力データサイズ、出力データアドレスが必要とな
る。これらはタスクマネージャに登録される。
タスクマネージャは登録されたcode-segmentをみて、プログラムのロードを行い、入力データの読み込み、計算、出力データの書き出しを行う。