SceneGraphを用いた
ゲームプログラムの為のテスト作成手法

発表者:小林 佑亮

所属:琉球大学 工学部 情報工学科 並列信頼研

指導教員:河野 真治

研究背景・目的

研究背景 研究目的

PlayStation3のアーキテクチャ

  • CellにはPPEが1基、SPEが8基
  • SPE に256KBのメモリ
  • PS3Linuxでは6個の SPE を制御

Cell-main SPE

Cerium Rendering Engine

TaskManager

  • Taskに分割されたプログラムを管理するライブラリ
  • プログラムをメモリ上にマッピング、SPE上ではDMA転送によりロード
  • SPEは256KBという小さなデータ量しか保持できない
  • 必要な時に必要な実行プログラムだけをSPE上にロード
TaskManager

SceneGraph

  • ゲームの中の場面を構成するオブジェクトやその振る舞い、ゲームのルールの集合
  • 親子関係を持つTreeで構成

SceneGraphの生成

  • Blenderでオブジェクトモデルを作成
  • 作成したオブジェクトモデルをpythonスクリプトでxmlファイルに変換
  • xmlファイルからSceneGraphを生成
  • 各ノードにmoveとcollision

超弾帝(スーパーダンディ)

超弾帝(スーパーダンディ)

move,collision

boss1_move_right(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);

  }
}
boss1_move_left(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);

  }
}
  • ボス1が右や左に移動
  • 引数のmoveとcollisionに状態変化

CppUnitによるテスト手法

  • C++の単体テストを自動化するflame workである
  • テストケースを増やす事が容易
  • テストケース群は一括で実行し、結果の表示も一括で行える
  • CPPUNIT_ASSERT( )
    引数が真なら成功、偽なら失敗
  • CPPUNIT_ASSERT_EQUAL( , )
    第1引数と第2引数が同じなら成功、違えば失敗
  • CPPUNIT_FAIL( )
    必ず失敗する

CppUnitによるゲームプログラムのテスト

  • getSGPによりSceneGraphのrootのアドレスを取得
  • rootアドレスから本体オブジェクトの各パラメータを参照
  • rootアドレスを走査してパーツオブジェクトの各パラメータを参照
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;
	...

評価・今後の課題

  • 全てのオブジェクトの座標の初期位置が正しい事を確認
  • move,collision中の各オブジェクトの座標は確認出来ない
  • 一括実行のため値が変化する値を追う事が出来ない
  • 今後各moveとcollisionを抜き出してテストする手法を実装する
  • 2つの手法によりゲームのデバッグを行う

ご清聴ありがとうございました。