3
|
1 \documentclass[twocolumn,twoside,9.5pt]{jarticle}
|
|
2 % \usepackage[dvips]{graphicx}
|
|
3 \usepackage[dvipdfm]{graphicx}
|
|
4 \usepackage{fancyhdr,picins}
|
|
5 \pagestyle{fancy}
|
|
6 \lhead{\parpic{
|
|
7 \includegraphics[height=1zw,clip,keepaspectratio]{pic/emblem-bitmap.pdf}}
|
|
8 琉球大学主催 工学部情報工学科 卒業研究発表会}
|
|
9 \rhead{}
|
|
10 \cfoot{}
|
|
11
|
|
12 \setlength{\topmargin}{-1in \addtolength{\topmargin}{15mm}}
|
|
13 \setlength{\headheight}{0mm}
|
|
14 \setlength{\headsep}{5mm}
|
|
15 \setlength{\oddsidemargin}{-1in \addtolength{\oddsidemargin}{11mm}}
|
|
16 \setlength{\evensidemargin}{-1in \addtolength{\evensidemargin}{21mm}}
|
|
17 \setlength{\textwidth}{181mm}
|
|
18 \setlength{\textheight}{261mm}
|
|
19 \setlength{\footskip}{0mm}
|
|
20 \pagestyle{empty}
|
|
21
|
|
22 \begin{document}
|
|
23 \title{SceneGraph を用いた\\マルチコア CPU 向けゲームの処理}
|
|
24 \author{065746J 仲宗根広樹 指導教員 : 河野真治}
|
|
25 \date{\today}
|
|
26 \maketitle
|
|
27 \thispagestyle{fancy}
|
|
28
|
|
29 \section{概要}
|
|
30 近年のゲームマシンは高度な並列性を持つようになっており、
|
|
31 ゲームプログラムでの様々なレベルでの並列処理が必須となっている。
|
|
32 プログラムの一部を並列処理するのではなく、定常的な並列度を提供する
|
|
33 必要がある。しかし、
|
|
34 データが処理される順番を把握することができないので出力結果などが特定しづらく、
|
|
35 逐次型に比べて難易度が高い
|
|
36 データ転送やタスクの生成、管理等の技術が多く存在する。
|
|
37 短期間の学生実験では新しい技術を習得することに時間を割かれ、ゲームの完成度を上げることが難しくなる。
|
|
38
|
|
39 そこで本研究では、
|
|
40 SceneGraph と言うゲーム中の1つの場面(Scene) を構成するオブジェクトやその振る舞い、ゲームのルールの集合を導入する。
|
|
41 SceneGraph の処理を自動的に並列に行なうことにより、並列処理と、習得の早い
|
|
42 ゲームプログラミングの両立を可能にする。
|
|
43
|
|
44 \section{SceneGraph を使ったゲーム作成}
|
|
45 SceneGraph のノードは親子関係を持つ tree で構成される(図\ref{fig:SceneGraph})。
|
|
46
|
|
47 SceneGraph を使用すると、ゲーム内のオブジェクトは個別に SceneGraph ノードに分けられているので、ノードを別個に処理すると自然と並列度がでてくる。
|
|
48
|
|
49 SceneGraph ノード は以下のようなデータと動作を持つ。
|
|
50 \begin{itemize}
|
|
51 \item データ
|
|
52 \begin{enumerate}
|
|
53 \item Vertex :ポリゴンオブジェクトの頂点座標
|
|
54 \item Texture:ポリゴンオブジェクトのテクスチャ座標
|
|
55 \item TextureImage:テクスチャイメージ
|
|
56 \item TransMatrix :ポリゴンオブジェクトの変換行列
|
|
57 \item Coordinates :オブジェクトの座標
|
|
58 \item Angle:オブジェクトの角度
|
|
59 \item Property:オブジェクトのゲームに係わる内部状態
|
|
60 \end{enumerate}
|
|
61 \item 動作
|
|
62 \begin{enumerate}
|
|
63 \item Move:自律的なオブジェクトの動き
|
|
64 \item Collision:他のノードとの衝突判定をする
|
|
65 \end{enumerate}
|
|
66 \end{itemize}
|
|
67
|
4
|
68 SceneGraph の親子関係に沿って TransMatrix を計算し、Move, Collision を実行することで SceneGraph 内のオブジェクトが変化する。Collision によって Move が変更され、Move によって Coordinates や Angle が変更される。これらをどのように変更させるかがゲームのルールになる。
|
|
69
|
3
|
70 %現在はゲームの main loop (PPE) で SceneGraph ノードのリストを辿り、シーケンシャルに Move, Collision を実行している。
|
4
|
71 %ゲームは各ノードの Move, Collision を実行して SceneGraph の描画を繰り返す事で進行する。
|
3
|
72 %Move, Collision はノードの数だけ実行されるので、ゲームの規模が大きくなればそれに比例して増大する。制御系プロセッサ PPE に膨大な量の演算をさせるのは好ましくない。
|
|
73 %本研究では Move, Collision の処理を複数のコアを用いて処理させて全てのコアが常に busy 状態になることを目標とする。
|
|
74
|
|
75 \begin{figure}[htb]
|
|
76 \begin{center}
|
|
77 \includegraphics[scale=0.4]{image/SceneGraph.pdf}
|
4
|
78 \caption{tree 構造の SceneGraph}
|
3
|
79 \label{fig:SceneGraph}
|
|
80 \end{center}
|
|
81 \end{figure}
|
|
82
|
|
83 %Cerium の並列度の向上を計り、プレイヤーが満足できるゲームの処理速度を実現させる。
|
|
84 %家庭用ゲーム機 PlayStation 3 には Cell というヘテロジニアスマルチコアプロセッサが搭載されている。
|
|
85 %当研究室では Cell 上でゲームプログラミングができる Cell Task Manager Cerium を開発した。
|
|
86 %Cerium は TaskManager, SceneGraph, Rendering Engine の3つの機能に分けられる。
|
|
87
|
|
88 %Cerium の並列度の向上を計り、プレイヤーが満足できる処理速度を実現させる
|
|
89 %当研究室では家庭用ゲーム機 PlayStation 3 上でゲームプログラミングができる Cell Task Manager Cerium を開発した。
|
|
90 %現在、PlayStation 3 の GPU にアクセスする API は公開されていないため Cerium は独自に Rendering Engine を持っている。
|
|
91 %Cerium は TaskManager, Rendering, SceneGraph の三つで構成されている。
|
|
92
|
|
93
|
|
94
|
|
95 \section{Cell Broadband Engine} \label{sec:cell}
|
|
96 Cell\cite{cell} は1基の PowerPC Processor Element (PPE) と8基の Synergistic Processor Element (SPE) で構成されるヘテロジニアスマルチコアプロセッサである。各プロセッサは高速バスで接続されている。本研究では6基の SPE が使用可能となっている。
|
|
97
|
|
98 % PPE は汎用プロセッサでありオペレーティングシステムやアプリケーションの実行、SPE を制御する役割を持っている。SPE は演算を繰り返すマルチメディア系の処理を得意とする演算系プロセッサである。SPE は 演算処理を行う SPU、256 KByte の Local Store、メインメモリや他の SPE とデータをやり取りする Memory Flow Controller の3つで構成されている。
|
|
99
|
|
100 \section{Cerium}
|
|
101 Cerium とは当研究室で開発した Cell 上で動作するゲームフレームワークである。
|
|
102 Cerium は SceneGraph、OSMesa に代表される Rendering Engine、そしてそれらの実行単位を Task とし、動的に全てのコアが動作する様な割り振りを行うカーネル TaskManager で構成されている。
|
|
103
|
|
104 現在、Cerium では SceneGraph の Move, Collision を PPE でシーケンシャルに処理しているので、この部分の処理を SPE を用いて並列に処理するように変更する。
|
|
105
|
|
106 %ゲーム内で使用するオブジェクトは Cerium 独自の xml 形式で書かれており、xml ファイルを読込んで SceneGraph を生成する。
|
|
107 %Rendering に関しては処理を Task 単位に分割して SPE に投入して処理しているが、SceneGraph の処理は PPE 1つで行っている。
|
|
108 %SceneGraph の move, collision の処理は PPE で行っている。しかし PPE に単純な演算の繰り返しをさせるのは好ましくない。
|
|
109 %そこで、SceneGraph の処理も Task に分割して SPE に投入し、Rendering と並行に走らせる事で処理速度の向上を計る。
|
|
110
|
|
111 \section{SceneGraph の並列処理}
|
|
112 Rendering と SceneGraph の処理を並行に実行するためには SceneGraph の tree と後述する Property のバッファは2つずつ用意する必要がある。
|
|
113 一方の SceneGraph tree と Property を Rendering で使用し、もう一方を Move, Collision で使用し、両方の処理が終わったら、相互にバッファを切り替える。切替える時に二つのタスクは同期する必要がある。
|
|
114 %ゲーム内のオブジェクトは個別に SceneGraph ノードに分けられているので、SceneGraph を別個に処理するだけで並列処理になる。
|
|
115 \subsection{vacuum}
|
|
116 SceneGraph の処理の例題として、学生実験で作成されたゲーム vacuum を使用する。
|
|
117 vacuum には自機と吸収ブロック、敵ブロックの3種類のオブジェクトがあり、自機を上下左右に移動させ、ボタンを押している間は自機の周りのブロックを引き寄せ、うまく吸収ブロックだけを自機と衝突させるゲームである。このゲームのMoveとCollisionは以下のようになる。
|
|
118
|
|
119 \begin{figure}[htb]
|
|
120 \begin{center}
|
|
121 \includegraphics[scale=0.7]{image/vacuum.png}
|
|
122 \caption{vacuum のゲーム画面}
|
|
123 \label{fig:vacuum}
|
|
124 \end{center}
|
|
125 \end{figure}
|
|
126
|
|
127 %SceneGraph ノードにはポリゴンを形成するための点やテクスチャの座標等が含まれている。これらの情報を全て SPE に送ると Local Store に入りきらない。そのため Move、Collision に必要な Coordinates, Angle, 親子関係の情報、生成消滅の情報を持つ Property の配列を作成する。
|
|
128 %SceneGraph の tree と Property のバッファは二つ用意する。
|
|
129
|
|
130 % \subsection{Move}
|
|
131 [Move] vacuum のオブジェクトは全て独立して動くので、使用する SPE に均等に Property を割り振る。
|
|
132 SPE でオブジェクトの種類毎の Move 処理を行い、Property を更新して PPE に返す。
|
|
133
|
|
134 \if0
|
|
135 \begin{figure}[htb]
|
|
136 \begin{center}
|
|
137 \includegraphics[scale=0.43]{image/Move.pdf}
|
|
138 \caption{vacuum の Move}
|
|
139 \label{fig:Move}
|
|
140 \end{center}
|
|
141 \end{figure}
|
|
142 \fi
|
|
143
|
|
144 % \subsection{Collision}
|
|
145 [Collision]
|
|
146 vaccum の Collision は自機と吸収ブロック(Collision A)、自機と敵ブロック(Collision B)の二つがある。
|
|
147 Collision の種類毎に SPE で動作する Collision Task を作成する。どちらの Collision も自機とブロックの衝突判定しか行わないので SPE には自機とブロックの Property を送り、SPE で2者間の衝突判定を行い、Property を更新して PPE に返す。(図\ref{fig:Collision})\\
|
|
148
|
|
149 \begin{figure}[htb]
|
|
150 \begin{center}
|
|
151 \includegraphics[scale=0.43]{image/Collision.pdf}
|
|
152 \caption{Collision に使う Property を各 SPE に渡す}
|
|
153 \label{fig:Collision}
|
|
154 \end{center}
|
|
155 \end{figure}
|
|
156
|
|
157 Move, Collision を SPE で処理する際に、SPE には SceneGraph ノードは送らない。代わりに vacuum の Move, Collision に必要な情報をまとめた Property を送る。
|
|
158 Property は SceneGraph ノードと1対1で対応しており、Coordinates, Angle, 親子関係の情報, ノードの生成消滅の情報を持つ。
|
|
159 PPE 側では返されてきた Property を元に SceneGraph を作成し Tree を再構成して Rendering に渡す。
|
|
160
|
|
161 \section{まとめと今後の課題}
|
|
162 \begin{itemize}
|
|
163 \item 現在は SPE 1基で SceneGraph を処理する例題の作成途中なので、複数 SPE に均等に処理を割り振る例題の作成。
|
|
164 \item Property から SceneGraph を生成し tree を構築する部分において、SceneGraph の新規生成と削除を考慮した設計を行う。
|
|
165 \item xml から作成された SceneGraph はオリジナルとして配列に順次格納されている。現在は SceneGraph を create する場合はオリジナルの配列をリニアサーチしてきた物をコピーしている。このオリジナルの配列を Texture を管理している hash テーブルを用いてまとめて管理できるようにする。
|
|
166 \end{itemize}
|
|
167
|
|
168 \thispagestyle{fancy}
|
|
169 \begin{thebibliography}{9}
|
|
170
|
|
171 \bibitem{cell}Sony Corporation.
|
|
172
|
|
173 Cell BroadbandEngine \texttrademark アーキテクチャ, 2006
|
|
174
|
|
175 \bibitem{spursengine}TOSHIBA: SpursEngine
|
|
176
|
|
177 \verb|http://www.semicon.toshiba.co.jp|\\
|
|
178 \verb|/product/assp/selection/spursengine/index.html|
|
|
179
|
|
180 \bibitem{cerium} SourceForge.JP: Cerium Rendering Engine
|
|
181
|
|
182 \verb|https//sourceforge.jp/projects/cerium/|
|
|
183
|
|
184 \bibitem{opencl} OpenCL
|
|
185
|
|
186 \verb|http://www.khronos.org/opencl/|
|
|
187
|
|
188 \bibitem{wataru} Wataru MIYAGUNI.
|
|
189
|
|
190 Cell 用の Fine-Grain Task Manager の実装, 2009
|
|
191
|
|
192 \end{thebibliography}
|
|
193 \end{document}
|