view presentation/thesis_pre.html @ 20:56617f0a3173

add cerium explain
author e055722
date Thu, 26 Feb 2009 10:51:30 +0900
parents a264f5f7e9f6
children 39dcb6906101
line wrap: on
line source

<!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>thesis_presentation</title>
<!-- metadata -->
<meta name="generator" content="S5" />
<meta name="version" content="S5 1.1" />
<meta name="presdate" content="20050728" />
<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="projection" id="slideProj" />
<link rel="stylesheet" href="ui/default/outline.css" type="text/css" media="screen" 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="projection" 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>[date:09/02/26]</h1>
<h2>SceneGraphを用いたゲームプログラムの為のテスト作成手法</h2>
</div>

</div>


<div class="presentation">

<div class="slide">
<h1>SceneGraphを用いた<br>ゲームプログラムの為のテスト作成手法</h1>
<h3>発表者:小林 佑亮</h3>
<h4>所属:琉球大学 工学部 情報工学科</h4>
<h4>指導教員:河野 真治</h4>
</div>


<div class="slide">
<h1>研究背景・目的</h1>
<font size=5>
研究背景<br>
<ul>
<li>当研究室では学生実験において、PlayStation3を用いた並列的なゲームプログラムの作成を行っている</li>
<li>そこで使用されるのが当研究室で開発したCeriumレンダリングエンジンである</li>
<li>PlayStation2で動作していたゲーム「超弾帝(スーパーダンディ)」の移植の際、オブジェクトの描画、衝突判定などで不具合が発生した</li>
<li>超弾帝には約100種類に及ぶオブジェクトが存在し、今後も同様な不具合を修正していく必要があると考えられる</li>
</ul>
<br>
研究目的<br>
<ul>
<li>本研究ではゲームプログラムをSceneGraph単位でテストすることでオブジェクトごとの振る舞いや描画をチェックする</li>
<li>ゲームのデバッグを容易にし、今後のゲームの移植や改良、作成を円滑にする</li>
</ul>
</font>
</div>

<div class="slide">
<h1>PlayStation3のアーキテクチャ</h1>
<font size=5>
<ul>
<li>Cellは1基のPPEと8基のSPEからなる非対称なマルチコアプロセッサであり、高速リングバスで構成されている</li>
<li>SPE は、LS (Local Store) という256KBのメモリを持つ</li>
<li>本研究で用いた PS3Linux では、6個の SPE を制御することができる</li>
</ul>
</font>
<br>
<img src="image/Cell-main.jpg" alt="Cell-main" width="430" height="283">
<img src="image/SPE.jpg" alt="SPE" width="233" height="221">
</ul>
</div>

<div class="slide">
<h1>Cerium Rendering Engine</h1>
Ceriumは以下の3つから構成される。
<ul>
<li>TaskManager/li>
<li>SceneGraph</li>
<li>RenderingEngine</li>
</ul>
<br>
<img src="image/Cerium.jpg" width=" " height=" ">
</div>

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

<font size="5">
<ul>
<li>Taskと呼ばれる分割された各プログラムを管理するライブラリである</li>
<li>Task同士の依存関係を考慮しながらメモリ上にマッピングし、SPE上ではそのプログラムを DMA転送によりロードする</li>
<li>SPEは256KBという小さなデータ量しか持てず、 大量のプログラムを全てSPE上に置いておく事は出来ない可能性がある</li>
<li>必要な時に必要な実行プログラムだけがSPE上にロードされている事が望ましい</li>
</ul>
</font>
<br>
<center>
<img src="image/TaskManager.jpg" width="25%" height="40%" alt="TaskManager">
</center>
</div>

<div class="slide">
<h1>SceneGraph</h1>
<font size="5">
<ul>
<li>ゲームの中の一つの場面(Scene)を構成するオブジェクトやその振る舞い、ゲームのルールの集合をSceneGraphとする</li>
<li>SceneGraphのノードは親子関係を持つTreeで構成される</li>
<li>親子関係とは、親オブジェクトの回転や平行移動等の行列計算による頂点座標の変更が、子オブジェクトにも反映する関係の事である</li>
<img src="image/SceneGraph.jpg" width="" height="" alt=" SceneGraph">
</font>
</div>

<div class="slide">
<h1>RenderingEngine</h1>
<font size="5">
<ul>
<li>SceneGraphから実際に表示するポリゴンを抽出する</li>
<li>ポリゴンからSpanを生成する</li>
<li>SpanにRGBをマッピングし描画する</li>
<img src="image/Cerium-main.png" width="50%" height="50%">
</font>
</div>

<div class="slide">
<h1>SceneGraphの生成</h1>
<font size="5">
<ul>
<li>Blenderでオブジェクトモデルを作成</li>
<li>作成したオブジェクトモデルをpythonスクリプトでxmlファイルに変換</li>
<li>xmlファイルからSceneGraphを生成する</li>
<li>各ノードにはオブジェクトの動きを決めるmoveとオブジェクトの相互作用を決めるcollisionがある。</li>
</ul>
<br>
<br>
<center>
<img src="image/SGcreate.jpg" width="50%" height="30%">
</center>
</font>
</div>

<div class="slide">
<h1>move,collision</h1>
boss1_action.cpp<br>
<font size="5">
<pre>
static void
boss1_move_right(SceneGraphPtr node, int screen_w, int screen_h) {
  node->xyz[0] += node->stack_xyz[0];
  if(node->xyz[0] > screen_w-280) {
    node->set_move_collision(boss1_move_left, boss1_collision);
  }
}

static void
boss1_move_left(SceneGraphPtr node, int screen_w, int screen_h) {
  node->xyz[0] -= node->stack_xyz[0];
  if(node->xyz[0] < 280) {
     node->set_move_collision(boss1_move_right, boss1_collision);
  }
}
</pre>
</font>
<br>
<ul>
<li>boss1_move_right,left…boss1が左右に移動する動きを記述</li>
<li>boss1_collision…boss1の衝突判定を記述</li>
<li>set_move_collision…新しいmoveとcollitsionを設定する</li>
</ul>
</div>

<div class="slide">
<h1>CppUnitによるテスト手法</h1>
<font size="5">
<ul>
<li>C++の単体テストを自動化するflame workである</li>
<li>テストケースを増やす事が容易</li>
<li>テストケース群は一括で実行し、結果の表示も行える</li>
</ul>
<br>
<br>
<center>
<img src="image/test_state.jpg" width="40%" height="50%">
</center>
</font>
</div>

<div class="slide">
<h1>テストを行うゲームプログラム</h1>
<font size="5">
<br>
<table>
<tr>
<td><img src="image/boss1.png" width=" " height=" "></td>
<td>
<ul>
<li>3つのSceneGraphを持つ</li>
<li>本体の他に左右にパーツを1つずつ持つ。</li>
<li>本体をTreeのrootとして左右のパーツがその子供となっている</li>
</ul>
</td>
</table>
<br>
<ul>
<li>各オブジェクトのSceneGraphはその親や子、兄弟に対するアドレスを保持している</li>
<li>パーツオブジェクトのテストを行いたい場合、Rootである本体から辿れば、パーツオブジェクトの各パラメータを参照できる</li>
</ul>
</font>
</div>

<div class="slide">
<h1>CppUnitによるゲームプログラムのテスト</h1>
<font size="5">
<ul>
<li>getSGPによりSceneGraphのrootのアドレスを取得</li>
<li>rootアドレスから本体オブジェクトの各パラメータを参照</li>
<li>rootアドレスを走査してパーツオブジェクトの各パラメータを参照</li>
</ul>
<br>
<table>
<tr>
<td><img src="image/test_part.jpg" width=" " height=" "></td>
<td>
<pre>
void
sgTest::rootTest() {
  test_init();

  sg_root->print_member();
  CPPUNIT_ASSERT_EQUAL((float)width/2, sg_root->xyz[0]);
  CPPUNIT_ASSERT_EQUAL(0.0f, sg_root->xyz[1]);
  CPPUNIT_ASSERT_EQUAL(-100.0f, sg_root->xyz[2]);
}

void
sgTest::childTest() {
  while (sg_root) {
    if(sg_root->children != NULL) {
      sg_root->children->print_member();
...
      sg_root = sg_root->children;
    } else if(sg_root->brother != NULL) {
      sg_root->brother->print_member();
      CPPUNIT_ASSERT_EQUAL(0.0f, sg_root->brother->xyz[0]);
...
      sg_root = sg_root->brother;
    } else {
	...
</pre>
</td>
</table>
</font>
</div>

<div class="slide">
<h1>評価・今後の課題</h1>
<ul>
<li>全てのオブジェクトの座標の初期位置が正しい事を確認</li>
<li>move,collision中の各オブジェクトの座標は確認出来ない</li>
<li>今後各moveとcollisionを抜き出してテストする手法を実装する</li>
</ul>
</div>

<div class="slide">
<h2>ご清聴ありがとうございました。</h2>
</div>

</div>

</body>
</html>