# HG changeset patch # User koba # Date 1299408434 -32400 # Node ID 7ea21aa275eb6da00ad75f80c4c2e6d2c596ea00 # Parent 7b20f8b4d6971afcfe91c9ec3fe08cad3b771f2f pre finish. diff -r 7b20f8b4d697 -r 7ea21aa275eb presen/sigss-presen.html --- a/presen/sigss-presen.html Sun Mar 06 17:29:49 2011 +0900 +++ b/presen/sigss-presen.html Sun Mar 06 19:47:14 2011 +0900 @@ -47,6 +47,7 @@

指導教員:河野 真治

+

研究背景

@@ -79,15 +81,14 @@
-

研究目的

+

研究概要

  • 本研究では Task に分割されたゲームプログラムがシーケンシャルなバージョン -と同じ動作である事を確認できるテスト環境の構築を目的とする。
  • -
  • プレイヤーの入力や乱数などの非決定的な要素を固定化し、バグの再現性を -低下させずにテストを行えるようにする。
  • -
  • 動作の同一性を確かめるために必要なパラメータの書き出しを行う
  • +と同じ動作である事を確認できるテスト環境を構築した +
  • プレイヤーの入力や乱数などの非決定的な要素を固定化した
  • +
  • 動作の同一性を確かめるために必要なパラメータの書き出しを行った
  • 高速なテストを行う為、テストに影響しない範囲で実行時間が大きい処理を -排除する。
  • +排除した
@@ -117,6 +118,7 @@ +

ゲームプログラムの特徴

@@ -184,16 +185,20 @@
  • 対処法としては、乱数生成器を無効にするか、定数でシードする
  • +-->
    -

    シューティングゲーム SuperDandy

    +

    ゲームプログラムの特徴

      -
    • 我々が PlayStation 上でのゲーム開発を行っていた 1998 年に開発
    • -
    • タイトルからゲーム本編中の敵機の登場、ステージクリア、エンディングと - ゲーム的な要素が多い
    • -
    • PlayStation, PlayStation2 Linux, OpenGL と伝統的に移植されてきた
    • +
    • プレイヤー入力によるゲーム内容への影響
    • +
    • オブジェクトの生成、衝突などにより状態が遷移
    • +
    • プレイヤー入力、乱数などのランダム要素
    • +
      +
    • テストプログラムとして我々が開発したシューティングゲーム + SuperDandy を用意
    • +
    • 全 5 ステージという、ある程度のボリュームのあるゲーム
    @@ -202,6 +207,7 @@
    +

    並列処理のバグを検出するタイミング

    • ゲームの並列処理によるバグは主に衝突判定時に検出される
    • ゲームプログラムの状態が遷移する時、バグが検出される
    • -
    • ゲームの状態が遷移する時(オブジェクトの削除・生成)、テストログを書き出す
    • -
    • これにより並列処理のバグを洗い出す
    • +
    • ゲームの状態が遷移する時(オブジェクトの削除・生成)、テストログを書き出すことにより、 + 並列処理のバグを洗い出す
    +
    +
    + +
    +	F64: CREATE  [NAME]enemy_greenclab_0 [COORD]x= 120.000000  y= -128.000000 vx= 0.000000  vy= 4.000000
    +	
    +	F85: DELETE  [NAME]enemy_greenclab_0 [COORD]x= 120.000000  y= -44.000000 vx= 0.000000  vy= 4.000000
    +        [BULLET]tlv1 = 2, tlv2 = 0 llv1 = 0
    +  
    +
    +
    -

    Capture モードと Trace モード

    +

    プレイヤー入力の固定の実装

    @@ -363,31 +406,13 @@
    -

    Cerium における画面の描画処理

    - - - - - -
      -
    • ビデオモードの選択(SDL, OpenGL)
    • -
    • 描画処理を行う画面バッファの領域の確保
    • -
    • ゲーム処理の実行
    • -
    • レンダリング Task による画面バッファへの描画
    • -
    - -
    -
    - -

    テスト環境における描画処理

      -
    • プレイヤーの入力の自動化により、プログラムを実行するだけでテストが可能
    • -
    • 描画処理が不要となる
    • -
    • 描画用 Task の生成を行わない事により、テストの高速化ができる
    • -
    • また、画面バッファの確保も不要
    • +
    • Cerium を用いたゲームでは画面バッファの確保、描画用の Task の生成により画面を描画する
    • +
    • プレイヤーの入力の固定化とテストログ出力により画面描画を行わずにテストができる
    • +
    • 描画用 Task や画面バッファの生成処理を行わない事により、テストの高速化ができる
    @@ -397,19 +422,19 @@
    -

    バグの検出実験

    +

    バグの検出方法

      -
    • OpenGL バージョンを Capture モードでプレイし、入力を記録
    • -
    • 記録された入力を用いて Task Dandy を Trace モードで実行
    • -
    • 各バージョンで得られたテストログを比較、考察
    • +
    • SuperDandy でプレイヤー入力を記録
    • +
    • 記録された入力を用いて TaskDandy を実行
    • +
    • 各バージョンで得られたテストログを比較
    • テストログの違いにより、バグの発生している箇所を特定

    SuperDandy と TaskDandy の比較

    -
    -super dandy(OpenGL) >>
    +
    +super dandy >>
     F109: DELETE  [NAME]enemy_greenclab_1  [COORD]x= 56.000000  y= -24.000000 ...
                  [BULLET]tlv1 = 2, tlv2 = 0 llv1 = 0
     F117: DELETE  [NAME]enemy_greenclab_2  [COORD]x= 184.000000  y= 40.000000 ...
    @@ -420,13 +445,12 @@
                  [BULLET]tlv1 = 2, tlv2 = 0 llv1 = 0
     F109: DELETE  [NAME]enemy_greenclab_2  [COORD]x= 184.000000  y= -24.000000 ...
                  [BULLET]tlv1 = 2, tlv2 = 0 llv1 = 0
    -
    +
      -
    • OpenGL では別フレームで死んだ 2 つの敵オブジェクトが Task Dandy では +
    • SuperDandy では別フレームで死んだ 2 つの敵オブジェクトが TaskDandy では 同フレームで死亡
    • -
    • この時の弾丸の数が一致
    • 片方が死んだ後、弾丸のオブジェクトの除去がされてない
    • -
    • 弾丸データが取れていない
    • +
    • 弾丸データの同期が取れていない
    @@ -449,8 +473,8 @@

    Collision Task の改良後の比較

    -
    -super dandy(OpenGL) >>
    +
    +super dandy >>
     F109: DELETE  [NAME]enemy_greenclab_1  [COORD]x= 56.000000  y= -24.000000 ...
                  [BULLET]tlv1 = 2, tlv2 = 0 llv1 = 0
     F117: DELETE  [NAME]enemy_greenclab_2  [COORD]x= 184.000000  y= 40.000000 ...
    @@ -461,30 +485,18 @@
                  [BULLET]tlv1 = 2, tlv2 = 0 llv1 = 0
     F117: DELETE  [NAME]enemy_greenclab_2  [COORD]x= 184.000000  y= 40.000000 ...
                  [BULLET]tlv1 = 2, tlv2 = 0 llv1 = 0
    -
    +
    • 2 つのバージョンのログがフレーム単位で同じ
    • -
    • Collision Task のデータ同期が有効に働いている
    • +
    • Collision Task のデータ同期によるバグの除去
    -

    Task への乱数受け渡しの検証

    -
      -
    • 乱数によって初期配置が変わる隕石オブジェクトを用いて検証
    • -
    • 多数の隕石オブジェクトが生成されるステージで全ての隕石オブジェクトが - 生成されるのを観察
    • -
    • 隕石オブジェクト生成後のパラメータを出力
    • -
    • 逐次実行させた場合と並列実行させた場合を比較
    • -
    -
    +

    隕石オブジェクトによる乱数の検証

    +
    +  int sf = random() % 4;
     
    -
    -

    隕石オブジェクトの実装

    -
    -  int sf;
    -
    -  sf = random() % 4;
       if((sf == 0) || (sf == 1))
         {
           p->x = -35;
    @@ -500,14 +512,19 @@
       if(sf == 3)
         {
           .....
    -
    +
    +
      +
    • 乱数によって初期配置が変わる隕石オブジェクトを用いて検証
    • +
    • 乱数によって決定される条件式を持つ
    • +
    • また、乱数によって配置される座標が変化する
    • +
    • 逐次実行させた場合と並列実行させた場合を比較
    • +

    実行結果

    -
    +
     demolog >>
    -[ID]0  [COORD]x= 320.000000  y= 66.000000  vx= -2.000000  vy= 0.000000
     [ID]1  [COORD]x= -35.000000  y= 20.000000  vx= 3.000000  vy= 1.000000
     ...
     [ID]6  [COORD]x= 220.000000  y= -30.000000  vx= 1.000000  vy= 4.000000
    @@ -520,9 +537,14 @@
     [ID]11  [COORD]x= -35.000000  y= 57.000000  vx= 3.000000  vy= 3.000000
     [ID]1  [COORD]x= -35.000000  y= 20.000000  vx= 3.000000  vy= 1.000000
     ...
    -
    +
    +
      +
    • 同一の ID を持つオブジェクト同士では、パラメータが一致している
    • +
    • Task への乱数受け渡しによる固定化が行われている
    • +
    +

    ビデオモードによる実行時間の比較

    -
      -
    • 実行時間の計測には unix の time コマンドを使用
    • -
    • オリジナルである OpenGL バージョン、Cerium による描画バージョン、描画無しバージョンで計測
    • -
    -
    - -
    -

    実行結果

    +

    SuperDandy と TaskDandy の描画の有無による実行時間を観測

    - - + +
    OpenGLTask(no video)Task
    実行時間336.09 sec385.17 sec6643.16 sec
    TaskDandyTaskDandy(no video)
    実行時間6643.16 sec385.17 sec
      -
    • Task バージョンは劇的に処理時間が増加した
    • -
    • OpenGL は GPU を使用し、TaskDandy はソフトウェアレンダリングである
    • -
    • TaskDandy では Cerium における Task の処理が発生したため、実行時間が大きく増加したと考えられる
    • -
    • 描画処理の Task に比べればゲームの Task は処理が小さい
    • +
    • 描画を行わないことにより、処理時間が大幅に減少した
    • +
    • 描画処理 Task の処理時間が非常に大きい
    • +
    • Cerium のチューニングにより実行時間は減少する
    @@ -559,12 +574,16 @@
    -

    結論

    -

    本研究では並列環境におけるゲームプログラムのテスト手法を提案した

    +

    まとめ

    +
    • ゲームの状態遷移時におけるバグの検出を行った
    • ゲームにおけるランダム要素であるプレイヤー入力、乱数生成を固定化した
    • -
    • +
    • 描画の除去によるテストの高速化を行った
    • +
      +
    • ゲームの状態遷移数を数えることにより、ゲーム内の全ての事象をテストできる
    • +
    • 並列環境上における、ゲームプログラムのテストを自動化する事が可能
    • +
    • 今後はゲームの状態遷移数の数え上げを行う