# HG changeset patch # User koba # Date 1293514968 -32400 # Node ID dd58d6a69f5698aeb3b40b9f85558a810a90358e make presen directry. diff -r 000000000000 -r dd58d6a69f56 image/SceneGraph.jpg Binary file image/SceneGraph.jpg has changed diff -r 000000000000 -r dd58d6a69f56 image/TaskManager.jpg Binary file image/TaskManager.jpg has changed diff -r 000000000000 -r dd58d6a69f56 image/autotools.jpg Binary file image/autotools.jpg has changed diff -r 000000000000 -r dd58d6a69f56 image/dependency.png Binary file image/dependency.png has changed diff -r 000000000000 -r dd58d6a69f56 image/figure/SceneGraph.graffle Binary file image/figure/SceneGraph.graffle has changed diff -r 000000000000 -r dd58d6a69f56 image/figure/TaskManager.graffle Binary file image/figure/TaskManager.graffle has changed diff -r 000000000000 -r dd58d6a69f56 image/figure/autotools.graffle Binary file image/figure/autotools.graffle has changed diff -r 000000000000 -r dd58d6a69f56 semi08_11_21.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi08_11_21.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,110 @@ + + + + + +ゼミ資料 08/12/12 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

並列プログラミングにおける
テストルーチンによる信頼性の向上

+

小林 佑亮

+

琉球大学 工学部 情報工学科

+

No.055722G

+
+ + +
+

研究背景・目的

+
    + +当研究室では学生実験において、PlayStation3を用いた並列的なゲームプログラムの作成を行っている。その際に使用されるのが当研究室で開発したCeriumレンダリングエンジンである。Ceriumを用いたプログラミングでは、Taskの管理やデータの転送など、独自の技術を必要としており、従来のプログラミングに比べその信頼性を確保する事は難しい。
    +
    +本研究ではCppUnitを用いて、学生の作成したプログラム、およびCerium本体の単体テストを行い、その動作を保証することを目的とする。 +
    +
+
+ +
+

Done

+
    +
  • sortプログラムのテスト
  • + +mainでの全てのテストケースの一括表示を + + +
+
+ + +
+

Doing

+
    +
  • 巨大オブジェクトの表示テスト
  • + + + + +
  • Automake/Autoconf
  • + +PS3:libSPEの有無
    +Linux:dlopen,dlcloseなど +
    + +
+
+ + +
+

To Do

+
    +
  • Ceriumを用いたゲーム
  • + +膨大な数のObjectを用いた戦争ゲーム? + + +
  • Game Objectのmove,collision
  • + +... + + +
+
+ +
+ + + diff -r 000000000000 -r dd58d6a69f56 semi08_12_12.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi08_12_12.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,127 @@ + + + + + +ゼミ資料 08/12/12 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

並列プログラミングにおける
テストルーチンによる信頼性の向上

+

小林 佑亮

+

琉球大学 工学部 情報工学科

+

No.055722G

+
+ + +
+

研究背景・目的

+
    + +
  • 当研究室では学生実験において、PlayStation3を用いた並列的なゲームプログラムの作成を行っている。
  • +
  • PlayStation3にはCellと呼ばれるCPUが搭載されており、作成したプログラムはCellに最適化させる必要がある。
  • +
  • そこで使用されるのが当研究室で開発したCeriumレンダリングエンジンである。
  • +
  • Ceriumレンダリングエンジンでは、Taskの管理やデータの転送など、Cellの特徴を考えた処理を行っている。
  • +
  • 従来のシーケンシャルなプログラミングに比べて、
  • +
    +
    +
  • 本研究ではCppUnitを用いて、学生の作成したプログラム、およびCerium本体の単体テストを行い、その動作を保証することを目的とする。
  • +
    +
+
+ +
+

Cellの構成

+
    + + +
+
+ +
+

Cellの構成

+
    + + +
+
+ +
+

Ceriumとは

+
    +
  • + +
+
+ +
+

Doing

+
    +
  • SG_marioのテスト
  • + +
+
+ + +
+

SG_marioの処理

+
    + + +
+
+ + +
+

To Do

+
    +
  • Ceriumを用いたゲーム
  • + +膨大な数のObjectを用いた戦争ゲーム? + + +
  • Game Objectのmove,collision
  • + +... + + +
+
+ +
+ + + diff -r 000000000000 -r dd58d6a69f56 semi09_01_09.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi09_01_09.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,115 @@ + + + + + +ゼミ資料 09/01/09 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

並列プログラミングにおける
テストルーチンによる信頼性の向上

+

小林 佑亮

+

琉球大学 工学部 情報工学科

+

No.055722G

+
+ + +
+

研究背景・目的

+
    + +
  • 当研究室では学生実験において、PlayStation3を用いた並列的なゲームプログラムの作成を行っている。
  • +
  • PlayStation3にはCellと呼ばれるCPUが搭載されており、作成したプログラムはCellに最適化させる必要がある。
  • +
  • そこで使用されるのが当研究室で開発したCeriumレンダリングエンジンである。
  • +
  • Ceriumには、Taskの管理やデータの転送などを行うTaskManager、オブジェクトのレンダリングを行うRenderingEngine、ゲームの場面(Scene)やルールをTree構造に格納したSceneGraphがある。
  • +
  • Ceriumを用いたプログラムにはTaskやSceneの概念、Cell上でのデータのやりとりなどがある為、期待された動作を保証するのは難しい。
  • +
    +
  • 本研究ではCppUnitを用いて、学生の作成したプログラム、およびCerium本体に対しての単体テストを行う。学生の作成したプログラムに対してはTask単位、Scene単位でのテストを行い、その動作を保証する。
  • +
    +
+
+ + +
+

Doing

+
    +
  • Game_project/ps3/tree_dandy2のCeriumへの移行
  • + +Scene_Graphの適用_doing
    +その他 +
    + +
  • Test
  • + +1つのSceneだけを抜き出すテスト
    +(まずは明らかにおかしい2面ボスシーンを) +
    +
+
+ + +
+

tree_dandy2

+
    +
  • move.c
  • + +
    +void Move()
    +...
    +
    +switch (enemy[tekino].move) {
    +            case 0:
    +                enemy[tekino].x += enemy[tekino].sx;
    +                enemy[tekino].y += enemy[tekino].sy;
    +                break;
    +            case 1:
    +                enemy[tekino].x -= enemy[tekino].sx;
    +                enemy[tekino].y -= enemy[tekino].sy;
    +                break;
    +            case 2:
    +                enemy[tekino].sy -= 0.25;
    +                enemy[tekino].y += enemy[tekino].sy;
    +                break;
    +				...
    +
    +
    +
+
+ +
+ + + diff -r 000000000000 -r dd58d6a69f56 semi09_01_16.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi09_01_16.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,155 @@ + + + + + +ゼミ資料 09/01/16 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

並列プログラミングにおける
テストルーチンによる信頼性の向上

+

小林 佑亮

+

琉球大学 工学部 情報工学科

+

No.055722G

+
+ + +
+

研究背景・目的

+
    + +
  • 当研究室では学生実験において、PlayStation3を用いた並列的なゲームプログラムの作成を行っている。
  • +
  • PlayStation3にはCellと呼ばれるCPUが搭載されており、作成したプログラムはCellに最適化させる必要がある。
  • +
  • そこで使用されるのが当研究室で開発したCeriumレンダリングエンジンである。
  • +
  • Ceriumには、Taskの管理やデータの転送などを行うTaskManager、オブジェクトのレンダリングを行うRenderingEngine、ゲームの場面(Scene)やルールをTree構造に格納したSceneGraphがある。
  • +
  • Ceriumを用いたプログラムにはTaskやSceneの概念、Cell上でのデータのやりとりなどがある為、期待された動作を保証するのは難しい。
  • +
    +
  • 本研究ではCppUnitを用いて、学生の作成したプログラム、およびCerium本体に対しての単体テストを行う。学生の作成したプログラムに対してはTask単位、Scene単位でのテストを行い、その動作を保証する。
  • +
    +
+
+ + +
+

TaskManagerとは

+ +TaskManagerは、Taskと呼ばれる分割された各プログラムを管理するライブラリである。 Task同士の依存関係を考慮しながらメモリ上にマッピングし、SPE上ではそのプログラムを DMA転送によりロードする。SPEは256KBという小さなデータ量しか持てず、 大量のプログラムを全てSPE上に置いておく事は出来ない可能性がある。 そのため、必要な時に必要な実行プログラムだけがSPE上にロードされている事が望ましい。(図1) + +TaskManager
+図1:TaskManager +
+
+ + +
+

SceneGraphとは

+ +ゲームの中の一つの場面(Scene)を構成するオブジェクトやその振る舞い、ゲームのルールの集合をSceneGraphとする。SceneGraphのノードは親子関係を持つTreeで構成される。(図2) + + + + +
 SceneGraph + +
    +
  • Vervatim:ポリゴンオブジェクトの頂点座標 +
  • Texture:ポリゴンオブジェクトのテクスチャ座標 +
  • TextureImage:テクスチャイメージ +
  • TransMatrix:ポリゴンオブジェクトの変換行列 +
  • Coordinates:オブジェクトの座標 +
  • Angle:オブジェクトの角度 +
  • Move:自律的なオブジェクトの動き +
  • Collision:他のノードと衝突した時の動き +
+
+
+図2:SceneGraph
+
+親子関係とは、親オブジェクトの回転や平行移動等の行列計算による頂点座標の変更が、子オブジェクトにも反映する関係の事である。これは子に対してスタックに積まれた親の変換行列をかけることで実現出来る。 +
+
+ + +
+

Doing

+
    +
  • Game_project/ps3/tree_dandy2のCeriumへの移行
  • + +Scene_Graphの適用_doing
    +その他 +
    + +
  • Test
  • + +1つのSceneだけを抜き出すテスト
    +(まずは明らかにおかしい2面ボスシーンを) +
    +
+
+ + +
+

tree_dandy2

+
    +
  • move.c
  • + +
    +void Move()
    +...
    +
    +switch (enemy[tekino].move) {
    +            case 0:
    +                enemy[tekino].x += enemy[tekino].sx;
    +                enemy[tekino].y += enemy[tekino].sy;
    +                break;
    +            case 1:
    +                enemy[tekino].x -= enemy[tekino].sx;
    +                enemy[tekino].y -= enemy[tekino].sy;
    +                break;
    +            case 2:
    +                enemy[tekino].sy -= 0.25;
    +                enemy[tekino].y += enemy[tekino].sy;
    +                break;
    +				...
    +
    +
    +
+
+ +
+ + + diff -r 000000000000 -r dd58d6a69f56 semi09_04_14.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi09_04_14.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,98 @@ + + + + + +ゼミ資料 09/04/14 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

発表資料

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ +
+

超弾帝の移植

+
    +
  • ソースの修正
  • + +
  • ダメなソース
  • +
    +...
    +  if(node->xyz[0] > screen_w-280) {
    +    node->set_move_collision(boss1_move_left, boss1_collision);
    +  }
    +...
    +
    +
  • 良いソース
  • +
    +#define BOSS1_RIGHT_END screen_w-280
    +...
    +  if(node->xyz[0] > BOSS1_RIGHT_END) {
    +    node->set_move_collision(boss1_move_left, boss1_collision);
    +  }
    +...
    +
    +
    +
    +
  • オブジェクト指向を使いたい
  • +
+
+ +
+

東京で聞いてきました

+
    +
  • 目の動きに合わせて立体的に見える光学技術
  • + +
  • ゲームに応用
  • +
  • 携帯ゲームに
  • +
    +
    +
  • PS3でのプログラミング
  • + +
  • SCEのツールはダメらしい
  • +
  • 各社自前のツールを用意
  • +
    +
  • SEGAの本は読んだ方が良い
  • +
+
+ +
+ + + diff -r 000000000000 -r dd58d6a69f56 semi09_05_12.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi09_05_12.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,115 @@ + + + + + +ゼミ資料 09/05/12 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

発表資料

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ +
+

この連休中にできたこと

+ +
    +
  • 1面ボスの基本的な動き
  • +
  • 自機キャラクターの基本的な動きと当たり判定
  • +
  • 自機の出す弾の動きと当たり判定・エフェクト
  • +
+
+ +
+

1面ボス

+ +
    +
  • 3月時の動きの微調整(継続中)
  • +
  • 当たり判定は持ってない
  • +
  • 登場時の演出の関係上、こいつが当たり判定を持っていた方が良い
  • +
    +
  • TO DO
  • +
      +
    • ボスのショットの実装
    • +
    +
+ +
+ +
+

自機キャラクター

+ +
    +
  • 操作の実装・ショットの実装(1種類のみ)
  • +
  • 自分とボスの当たり判定を持っている(ボスが持った方が良い)
  • +
    +
  • TO DO
  • +
      +
    • 左右操作時の旋回モーション
    • +
    • 敵に当たったときの爆発モーション&ゲームオーバー処理
    • +
    +
+ +
+ +
+

自機のショット

+
    +
  • ボスとの当たり判定(敵に実装が良い)
  • +
  • 爆発エフェクトの実装(ちょっと変)
  • +
+
+ +
+

全体的な課題

+
    +
  • オブジェクトの透過処理
  • +
  • ボスや自機の当たり判定の取り方
  • +
      +
    • 自機の当たり判定を小さく
    • +
    • ボスの当たり判定を細かく(ボス2への応用)
    • +
    +
  • scaleの実装(Blenderで大きさを合わせるのは手間)
  • +
+
+ +
+ + + diff -r 000000000000 -r dd58d6a69f56 semi09_05_19.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi09_05_19.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,130 @@ + + + + + +ゼミ資料 09/05/19 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

発表資料

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ +
+

今週やった事

+ +
    +
  • アルファ値の検出のテスト
  • +
  • スーパーダンディの微調整
  • +
+
+ +
+

アルファ値の検出テスト

+ +
    +
  • ダンディで確認
  • +
  • テクスチャ画像はPNGを使用
  • +
  • 画像はプレビューで加工
  • +
  • JPEG2000はSDL_imageが未対応(エラーが出る)
  • +
+ +
+ +
+

アルファ値の検出テスト

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SDL_image対応形式
PNG36KB
BMP128KB
GIF11KB(256色)
PNM140KB
PCX84KB
TGA107.8KB
XPM未調査
LBM未調査
JP216KB
+
+
    +
  • JPEG2000に対応させる?
  • +
+
+ +
+

ダンディの微調整

+
    +
  • 爆発エフェクトの挙動の修正
  • +
  • 旋回モーションの実装中…
  • +
+
+ +
+ + + diff -r 000000000000 -r dd58d6a69f56 semi09_05_26.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi09_05_26.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,73 @@ + + + + + +ゼミ資料 09/05/26 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

発表資料

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ +
+

今週やった事

+ +今週何もやりませんでした。スイマセン…… +
    +
  • MySQLの設定・コード読み
  • +
  • ファジィアルゴリズムの理解
  • +
+
+ +
+

これからやる予定の事

+
    +
  • Java PathFinderについて詳しく調べる
  • +
  • 他にどんなテストがあるか調べる
  • +
  • リアルタイムで値を変える仕組みを実装してみる
  • +
  • 併行してGUIをどうするか考える(Ceriumを使う?)
  • +
  • ダンディも進める
  • +
+
+ +
+ + + diff -r 000000000000 -r dd58d6a69f56 semi09_06_09.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi09_06_09.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,108 @@ + + + + + +ゼミ資料 09/06/09 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

発表資料

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ +
+

今週やった事

+ +
    +
  • ソース読み会
  • +
  • Autotools(Automake/Autoconf)の理解と試行
  • +
+
+ +
+

Autotoolsの基本的な使い方

+ +
    +
  1. autoscan する
  2. +
      +
    • configure.scan が生成される
    • +
    • mv configure.scan configure.in する
    • +
    +
  3. configure.in の編集
  4. +
  5. Makefile.am を作る
  6. +
  7. autoheader で configure.in から config.h.in を作る
  8. +
  9. automake で Makefile.am から Makefile.in を作る
  10. +
  11. autoconf で configure.in から configure を作る
  12. +
  13. configure すると Makefile.in から Makefile, config.h.in から config.h が作られる
  14. +
  15. make で Makefile とconfig.h からTARGET を作り出す。
  16. +
+
+
+ +
+

Autotoolsの基本的な使い方

+
+ +
+
+ +
+

Autotoolsでできること

+
    +
  • コンパイラのチェック
  • +
  • ライブラリのチェック
  • +
  • ヘッダのチェック
  • +
  • 関数のチェック
  • +
  • m4 を用いてautoconf で使えるマクロを定義する事が出来る
  • +
  • autoheaderでソースで使用するマクロを定義する事が出来る
  • +
+
+ +
+

Ceriumでautotoolsを使うに当たって

+
    +
  • libspe2の有無などによって出力するMakefileを変える
  • +
  • LibXXXXManagerは作成するが、各例題はMakefileを作成するに留める
  • +
  • 条件文によってコンパイルするファイルを選択できる
  • +
  • Ceriumの階層構造を見直すかどうか
  • +
+
+ + + diff -r 000000000000 -r dd58d6a69f56 semi09_07_07.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi09_07_07.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,152 @@ + + + + + +ゼミ資料 09/07/07 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

発表資料

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ +
+

DOING

+ +
    +
  • 複数の XML から registSceneGraph() で HashTable に登録する機能の実装
  • +
      +
    • HashTable の勉強
    • +
    • コード読み
    • +
    +
+
+ +
+

Approach

+
    +
  • とりあえず SceneGraphPtr を格納する HashTable を作成してみる
  • +
  • registSceneGraph() で HashTable に登録する
  • +
  • createSceneGraph(int id) を変更
  • +
+
+ +
+

HashTableの作成

+
    +
  • TextureHash, spe/TileHashを参考に
  • +
  • とりあえず書いてみる
  • +
  • Hash 関数を考える
  • +
+ +
+ +
+

HashTableの作成

+

実装例

+ +
+int
+SGHash::put(char *sg_name, SceneGraphPtr data)
+{
+    int hashval = hash(sg_name);
+
+    for (int i = 0; i < hashSize/2; i++) {
+        int index = (hashval + i*i)%hashSize;
+
+        if (table[index] == 0) {
+            table[index] = data;
+            return index;
+        }
+    }
+
+}
+
+SceneGraphPtr
+SGHash::get(char *sg_name)
+{
+    int hashval = hash(sg_name);
+
+    for (int i = 0; i < hashSize/2; i++) {
+        int index = (hashval + i*i)%hashSize;
+
+        if (table[index] != NULL &&
+            table[index]->name == sg_name) {
+            return table[index];
+        }
+    }
+
+
+
+ +
+

複数のXMLからHashTableに登録

+
    +
  • 現在の実装
  • + +
    +..
    +
    +  sgroot->createFromXMLfile("xml_file/boss1.xml");
    +  sgroot->createFromXMLfile("xml_file/player1.xml");
    +  sgroot->createFromXMLfile("xml_file/p_shot.xml");
    +  sgroot->createFromXMLfile("xml_file/blast.xml");
    +
    +..
    +
    +
    +
+
+ +
+

今後の課題

+
    +
  • 以下のような記述を使わないような実装
  • + +
    +#define BOSS1 scene_graph
    +#define BOSS1_L scene_graph->next
    +#define BOSS1_R scene_graph->next->next
    +
    +
    +
+
+ + + diff -r 000000000000 -r dd58d6a69f56 semi09_09_29.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi09_09_29.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,111 @@ + + + + + +ゼミ資料 09/09/29 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

Cell を用いた
+並列 Game Programming の為の
+Cerium Engine の実装

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ +
+

研究背景・目的

+ +
    +
  • 近年、CPU の性能向上はクロックの限界や発熱問題などからマルチコア化による +性能向上が図られている
  • +
  • マルチコア CPU の中でも、PlayStation3 に搭載されている Cell と呼ばれる CPU は、 +1つの PPE と8つの SPE をもつヘテロジニアス型のマルチコア CPU である
  • +
  • 当研究室では Playstation3 上でのゲーム開発を目的とした Cerium という + Engine を開発している
  • +
  • Cerium にはプログラムを Task 単位で Cell の各アーキテクチャに処理させる TaskManager と + Object をScene 毎に管理する SceneGraph、Object の描画をする RenderingEngine がある
  • +
    +
  • 本研究ではこの Cerium を使った一般的なゲームの作成を実現するための様々な実装を行う
  • +
+
+ +
+

DONE

+
    +
  • OSC 準備 & OSC
  • +
+
+ +
+

DOING

+

超弾帝を移植する為の必要事項の洗い出し

+
    +
  • 状態遷移
  • +
      +
    • property 内のHP等を見てif文 → Move のコードの書き換え?
    • +
    +
  • collision の実装
  • +
      +
    • property の他 Object の座標を見て衝突判定
    • +
    • Dandy なら1つの Object につき敵と自分,弾
    • +
    • 当たったら property 内のフラグが立つ
    • +
    • collision と move は別 SPE で計算?
    • +
    +
  • Object が大量にあった場合
  • +
      +
    • property の検索が必要 → Hash?
    • +
    +
  • 音楽
  • +
  • etc...
  • +
+ +
+ +
+

TODO

+
    +
  • Dandy 移植に向けた Cerium の実装
  • +
  • Cerium 用の Dandy を書く
  • +
+
+ + +
+ + diff -r 000000000000 -r dd58d6a69f56 semi09_10_06.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi09_10_06.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,103 @@ + + + + + +ゼミ資料 09/10/06 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ +
+

Cell を用いた
+並列 Game Programming の為の
+Cerium Engine の実装

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ +
+

研究背景・目的

+ +
    +
  • 近年、CPU の性能向上はクロックの限界や発熱問題などからマルチコア化による +性能向上が図られている
  • +
  • マルチコア CPU の中でも、PlayStation3 に搭載されている Cell と呼ばれる CPU は、 +1つの PPE と8つの SPE をもつヘテロジニアス型のマルチコア CPU である
  • +
  • 当研究室では Playstation3 上でのゲーム開発を目的とした Cerium という + Engine を開発している
  • +
  • Cerium にはプログラムを Task 単位で Cell の各アーキテクチャに処理させる TaskManager と + Object をScene 毎に管理する SceneGraph、Object の描画をする RenderingEngine がある
  • +
    +
  • 本研究では Cerium の実装として
  • +
      +
    • Test
    • +
    • 音声
    • +
    • MARS
    • +
    +
+
+ +
+

DONE

+
    +
  • Dandy の BMP ファイルを PNG 化 & 透過処理
  • +
+
+ +
+

DOING

+
    +
  • XML ファイルの作成
  • +
      +
    • ボス戦 ver
    • +
    • 1面 ver
    • +
    + +
+
+ +
+

TODO

+
    +
  • 現時点で動く Dandy の作成
  • +
  • 次期 Cerium の仕様に合わせた Dandy の作成
  • +
+
+ + +
+ + diff -r 000000000000 -r dd58d6a69f56 semi09_10_20.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi09_10_20.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,202 @@ + + + + + +ゼミ資料 09/10/20 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + +
+ + +
+

Cell を用いた
+並列 Programming の為の
+テスト手法の提案

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ + +
+

研究背景・目的

+ +
    +
  • 近年、CPU の性能向上はクロックの限界や発熱問題などからマルチコア化による +性能向上が図られている
  • +
  • マルチコア CPU の中でも、PlayStation3 に搭載されている Cell と呼ばれる CPU は、 +1つの PPE と8つの SPE をもつヘテロジニアス型のマルチコア CPU である
  • +
  • 各 SPE は 256KB の LocalStore(LS) を持ち、 +必要に応じて MainMemory 上の Data を LS に Load して実行する
  • +
  • 並列 Programming における計算の順序性と Cell 独自の仕様により、 +Cell 上での Program の Debug は通常の Program に比べて困難である
  • +
+
+ + +
+

研究背景・目的

+ +
    +
  • 本研究では Cell 上で動く Program の正常な動作を保証するテスト手法を提案する
  • +
  • Program の順序性と PPE, SPE 上での Data 管理の面からテスト手法を考える
  • +
  • 当研究室で開発した Cerium というPlayStation3 上で動作する Engine を用いてテストを行う
  • +
  • Cerium にはプログラムを Task 単位で Cell の各アーキテクチャに処理させる TaskManager と + Object をScene 毎に管理する SceneGraph、Object の描画をする RenderingEngine がある
  • +
+
+ +
+

DONE

+
    +
  • SnowLeopard 上での Cerium 開発環境
  • +
  • Dandy のタイトル画面追加
  • +
+
+ + +
+

SnowLeopard 上でのCerium 開発環境

+

GCC, G++

+
    +
  • default ではgcc-4.2
  • +
  • gcc-4.2 だと cast 等で error
  • +
    +  $sudo mv /usr/bin/gcc /usr/bin/gcc4.2
    +  $sudo mv /usr/bin/g++ /usr/bin/g++4.2
    +  $sudo ln -s /usr/bin/gcc-4.0 /usr/bin/gcc
    +  $sudo ln -s /usr/bin/g++-4.0 /usr/bin/g++
    +
    +
+
+ + +
+

SnowLeopard 上でのCerium 開発環境

+

SDL

+
    +
  • SDL-1.2.13 の Option を変えて Compile
  • +
    +  $env CC='/usr/bin/gcc-4.0' CFLAGS='-isysroot 
    +  /Developer/SDKs/MacOSX10.5.sdk -arch i386'
    +  LDFLAGS='-arch i386' ./configure
    +  --prefix=/sw --without-x
    +  $make
    +  ...
    +
    +
  • うまく行かない…
  • +
  • SDL-1.3 がSnowLeopard で動くらしい
  • +
  • …と思ったら、10月6日に SnowLeopard 対応の SDL-1.2.14 公開
  • +
+
+ + +
+

DOING

+
    +
  • 汎用的な collision 関数の実装
  • +
  • 爆発アニメーションの実装
  • +
  • Blender file の作成
  • +
+
+ + +
+

汎用的な collision 関数の実装

+
+static bool
+collision_judge(SceneGraphIteratorPtr it, SceneGraphPtr myself,
+                int obj_id, int my_radius, int enemy_radius)
+{
+  /* 自分と相手のx,y座標での距離と2点間の距離 */
+  float x_distant, y_distant, distance;
+  SceneGraphPtr enemy;
+
+  for (; it->hasNext(obj_id);) {
+    it->next(obj_id);
+    enemy = it->get();
+
+    x_distant = enemy->xyz[0] - myself->xyz[0];
+    y_distant = enemy->xyz[1] - myself->xyz[1];
+
+    /* hypotf で2点間の距離を求める */
+    distance = hypotf(x_distant, y_distant);
+
+    /* collision 判定 */
+    if(distance < (my_radius+enemy_radius)) {
+      return true;
+    }
+    return false;
+  }
+}
+
+ +
+ + +
+

爆発アニメーションの実装

+
+static void
+blast_move(SceneGraphPtr node, int screen_w, int screen_h)
+{
+  if(node->sgid > BLAST8 && node->frame%blast_interval == 0) {
+    SceneGraphPtr next_blast = sgroot->createSceneGraph(node->sgid-1);
+    next_blast->frame = 1;
+    next_blast->set_move_collision(blast_move, null_collision);
+    node->addBrother(next_blast);
+    node->remove();
+  }
+}
+
+ +
+ + +
+

TODO

+
    +
  • PS3 上でテスト
  • +
  • 引き続き Dandy の実装
  • +
  • example を用いたテスト
  • +
+
+ + + +
+ + diff -r 000000000000 -r dd58d6a69f56 semi09_11_10.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi09_11_10.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,107 @@ + + + + + +ゼミ資料 09/11/10 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + +
+ + +
+

Cell を用いた
+並列 Programming の為の
+テスト手法の提案

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ + +
+

研究背景・目的

+
    + +
  • Cell 上のプログラムを簡単にテストしたい
  • +
  • 当研究室で開発した Cerium Game Engine を使用する
  • +
  • Task 単位での単体テストをする
  • +
  • Task の依存関係・実行順序も考慮する
  • +
+ + + +
+ +
+

DOING

+
    +
  • Multi Task を考慮した Dandy の実装
  • +
  • Multi Task Game の 準備
  • +
+
+ +
+

Multi Task を考慮した Dandy の実装

+

以下のような Task に分割

+
    +
  • title 生成
  • +
  • 次の面の xmlfile の読み込み
  • +
  • 自機の操作(移動,発射)
  • +
  • 自機と敵機・弾の当たり判定の計算
  • +
+
+ +
+

Multi Task Game の 準備

+
    +
  • 現在は viewer 内で1つの SceneGraphTree を生成、allExecute している
  • +
  • SceneGraphTree 一つにつき Task 一つ?
  • + +
+
+ +
+ + diff -r 000000000000 -r dd58d6a69f56 semi09_11_17.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi09_11_17.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,151 @@ + + + + + +ゼミ資料 09/11/17 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + +
+ + +
+

Cerium を用いた
+Game Programming における
+テスト手法の提案

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ + +
+

研究背景・目的

+
    + +
  • Cell 上のプログラムをテストしたい
  • +
  • 当研究室で開発した Cerium Game Engine を使用する
  • +
  • Task 単位での単体テストをする
  • +
  • Task の依存関係・実行順序も考慮する
  • +
+ + + +
+ +
+

DOING

+
    +
  • 旧スーパーダンディの移植
  • +
+
+ +
+

旧ダンディの移植計画

+
    +
  • 構造体 CHARACTER = SceneGraph
  • +
  • active_chara_list, free_chara_list がある
  • +
  • 当たり前だが CHARACTER で malloc している
  • +
  • Putenemy で SceneGraph 作成するように
  • +
  • その他
  • +
+
+ +
+

旧ダンディの移植

+

その他ファイル

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
syokika.cmain.ccと同じ widthやvideo_modeなどの設定
obj.c, LoadSprite.cRenderer周り
Ss.cサウンド
sankaku.csin, cos等の計算に使用
Enemy.cPutenemyで敵を配置している 使ってない?
tama2.c弾を作る Putenemy使用
tokuten.c得点計算とスコア集計
collision.cあたり判定 幅などの調整が必要そう
xml.cxmlファイルの読み込み Ceriumと同じ
tree_controll.cSceneGraphの旧バージョン
move.cswitchで行動の選択 StatePutternの前のバージョンか
trace.c環境設定ファイルの読み込み
debug.cデバッグ用
atari.ccollision.cの旧バージョン
count2.cプレイヤー周りのState
+
+
+ +
+ + diff -r 000000000000 -r dd58d6a69f56 semi09_11_24.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi09_11_24.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,168 @@ + + + + + +ゼミ資料 09/11/24 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + +
+ + +
+

Cerium を用いた
+Game Programming における
+テスト手法の提案

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ + +
+

研究背景・目的

+
    + +
  • Cell 上のプログラムをテストしたい
  • +
  • 当研究室で開発した Cerium Game Engine を使用する
  • +
  • Task 単位での単体テストをする
  • +
  • 現行のCeriumをテストした状態の物と比較する New
  • +
  • Task の依存関係・実行順序も考慮する
  • +
+ + + +
+ +
+

DOING

+
    +
  • ダンディ移植中
  • +
+
+ +
+

頻繁に登場する関数の書き換え

+
    +
  • Puttama:Putenemyで弾の配置。引数で種類判別
  • +
  • DefSprite:オブジェクト情報の初期化
  • +
  • DefSpriteEx:オブジェクトの拡大・縮小、再配置
  • +
      +
    • 拡大・縮小の実装
    • +
    +
  • PutSpriteEx:sptableにオブジェクト情報
  • +
+
+ +
+

state(move)

+
    +
  • move_funcとして書き換え
  • +
  • 他オブジェクトの情報を必要とする動作がある
  • +
      +
    • collisionの方へ移動
    • +
    +
+ +
+

collision

+

collision.cc

+
    +
  • 関数atari内でif文を用いて分類している
  • +
  • goto文なんかもある
  • +
  • if文単位で別関数として分割する必要がある
  • +
+
+ +
+

様々な構造体

+ +

bom.h

+
    +
  • bom
  • +
+

Character.h

+
    +
  • enemy
  • +
+

sgoex.h

+
    +
  • SGO_PAD->不要
  • +
  • SpriteView
  • +
  • SpriteTable
  • +
+

count2.h

+
    +
  • player
  • +
  • tama
  • +
  • tama1
  • +
  • tama2
  • +
  • stge
  • +
  • laser
  • +
+
+
+ +
+

様々な構造体

+

要素

+ +
    +
  • キャラクタ番号
  • +
  • x座標, y座標
  • +
  • 幅・高さ
  • +
  • x倍率, y倍率
  • +
  • 体力, 残機数, 倒した得点
  • +
+
+
+
    +
  • 似たような物が多い
  • +
  • Propertyに格納
  • +
+
+ +
+ + diff -r 000000000000 -r dd58d6a69f56 semi09_12_08.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi09_12_08.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,106 @@ + + + + + +ゼミ資料 09/12/08 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + +
+ + +
+

Cerium を用いた
+Game Programming における
+テスト手法の提案

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ + +
+

研究背景・目的

+
    + +
  • Cell 上のプログラムをテストしたい
  • +
  • 当研究室で開発した Cerium Game Engine を使用する
  • +
  • Task 単位での単体テストをする
  • +
  • 現行のCeriumをテストした状態の物と比較する +
  • Task の依存関係・実行順序も考慮する
  • +
+ + + +
+ +
+

DOING

+
    +
  • collision
  • +
  • sgoex
  • +
+
+ +
+

collision

+
    +
  • 暫定的に関数名はcollision_00〜11に
  • +stack_xyz[]で +
  • collisionのセット
  • +
  • Playerも要書き換え
  • +
+
+ +
+

sgoex

+
    +
  • DefSprite, PutSpriteの定義
  • +
  • sptableはそのまま?
  • +
+
+ +
+ + diff -r 000000000000 -r dd58d6a69f56 semi09_12_22.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi09_12_22.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,103 @@ + + + + + +ゼミ資料 09/12/22 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + +
+ + +
+

Cerium を用いた
+Game Programming における
+テスト手法の提案

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ + +
+

研究背景・目的

+
    + +
  • Cell 上のプログラムをテストしたい
  • +
  • 当研究室で開発した Cerium Game Engine を使用する
  • +
  • Task 単位での単体テストをする
  • +
  • 現行のCeriumをテストした状態の物と比較する +
  • Task の依存関係・実行順序も考慮する
  • +
+ + + +
+ +
+

DONE

+
    +
  • collision.cc
  • +
  • Charactor_State.cc(move)
  • +
+
+ +
+

DOING

+
    +
  • main.cc
  • +
+
+ +
+

main.cc

+
    +
  • SDL周りの関数は使う?
  • +
  • lazer,jikiなんかの定義は?
  • +
+
+ +
+ + diff -r 000000000000 -r dd58d6a69f56 semi10_01_19.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi10_01_19.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,113 @@ + + + + + +ゼミ資料 10/01/19 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + +
+ + +
+

Cerium を用いた
+Game Programming における
+テスト手法の提案

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ + +
+

研究背景・目的

+
    +
  • Cell 上のプログラムをテストしたい
  • +
  • 当研究室で開発した Cerium Game Engine を使用する
  • +
  • Task 単位での単体テストをする
  • +
  • 現行のCeriumをテストした状態の物と比較する +
  • Task の依存関係・実行順序も考慮する
  • +
+ + + +
+ +
+

Doing

+
    +
  • Super Dandy
  • +
  • 就活
  • +
+
+ +
+

Super Dandy

+
    +
  • XML読み込み箇所やOpenGL使用のポリゴン作成部分を排除
  • +
  • CHARACTORやSpriteTableをPropertyに書き直したいが…
  • +
    +typedef struct Property {
    +  int no;
    +  int x;
    +  int y;
    +  BOOL extend;
    +  long rotate;
    +  short scalex;
    +  short scaley;
    +  short dx;
    +  short dy;
    +  short w;
    +  short h;
    +  short mx;
    +  short my;
    +} *PropertyPtr;
    +
    +
  • 今月中には動かします..
  • +
+
+ +
+

就活

+
    +
  • エントリー->作文
  • +
  • 試験勉強->数学・物理
  • +
  • 作品作成->ゲームプログラム勉強
  • +
+
+ +
+ + diff -r 000000000000 -r dd58d6a69f56 semi10_02_05.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi10_02_05.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,197 @@ + + + + + +ゼミ資料 10/02/05 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + +
+ + +
+

Cerium を用いた
+Game Programming における
+テスト手法の提案

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ + +
+

研究背景・目的

+
    +
  • Cell 上のプログラムをテストしたい
  • +
  • 当研究室で開発した Cerium Game Engine を使用する
  • +
  • Task 単位での単体テストをする
  • +
  • 現行のCeriumをテストした状態の物と比較する +
  • Task の依存関係・実行順序も考慮する
  • +
+ + + +
+ +
+

Doing

+
    +
  • 就活
  • +
+
+ + +
+

クリ博フェスタ2011

+

Publisher

+ +
    +
  • アトラス
  • +
  • カプコン
  • +
  • コナミ
  • +
  • フロム・ソフトウェア
  • +
+
+

Developer

+ +
    +
  • イニス(ギタルマン, 戦え応援団)
  • +
  • イメージエポック(セブンスドラゴン, アークライズファンタジア)
  • +
  • ラクジン(DSサガ2)
  • +
  • ゲームフリーク(ポケモン)
  • +
  • アートディンク(A列車で行こう)
  • +
+
+
+ +
+

クリ博フェスタ2011

+

主な募集職種

+
    +
  • プログラマー
  • +
  • プランナー => ポートフォリオ評価・道場
  • +
  • デザイナー
  • +
+ +

プログラマーのお仕事

+
    +
  • ゲームソフト開発
  • +
  • 開発環境構築(ツール・ライブラリ)
  • +
  • 試用版の設計
  • +
+ +
+ + +
+

クリ博フェスタ2011

+

やってると嬉しいこと(プログラマ)

+
    +
  • 3Dプログラミング
  • +
  • マルチスレッド
  • +
  • グラフィック関連
  • +
+ +

オススメ書籍

+
    +
  • Game Programming Gem
  • +
  • Real Time Rendering
  • +
+ +
+ + +
+

クリ博フェスタ2011

+

フロムのポートフォリオ講座

+
    +
  • デッサン・3Dモデル
  • +
  • 豪鬼のモデル持ち込み・自分の3Dモデル作成する猛者
  • +
  • ポートフォリオにストーリー・コンセプトを盛り込む
  • +
+ +

Developerのお話

+
    +
  • Publisherへの企画の提案
  • +
  • 3社中2社がPublishingに意欲
  • +
+ +
+ + +
+

エントリー中

+ +
    +
  • アイレム
  • +
  • カプコン
  • +
  • ゲームフリーク
  • +
  • コーエーテクモ
  • +
  • コナミ
  • +
  • スクウェア・エニックス
  • +
  • セガ
  • +
  • 日本一ソフトウェア
  • +
  • ハドソン
  • +
  • ハル研究所
  • +
  • バンダイナムコ
  • +
  • フロム・ソフトウェア
  • +
  • プラチナゲームス
  • +
  • レベルファイブ
  • +
+
+
+ + +
+

予定

+

Webアンケート(という名のES)

+
    +
  • セガ
  • +
  • コーエーテクモ
  • +
+ +

説明会・適性検査

+
    +
  • 2月8日(月) スクウェア・エニックス 自社説明会(ES提出?)
  • +
  • 2月9日(火) レベルファイブ 自社説明会・ES提出
  • +
  • 2月18日(木) プラチナゲームス 自社説明会
  • +
  • 2月19日(金) 任天堂 自社説明会
  • +
  • 2月22日(月) アイレム 適性検査
  • +
+
+ +
+ + diff -r 000000000000 -r dd58d6a69f56 semi10_04_20.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi10_04_20.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,133 @@ + + + + + +ゼミ資料 10/04/20 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + +
+ + +
+

Cerium を用いた
+Game Programming における
+テスト手法の提案

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ + +
+

研究背景・目的

+
    +
  • Cell 上のプログラムをテストしたい
  • +
  • 当研究室で開発した Cerium Game Engine を使用する
  • +
  • Task 単位での単体テストをする
  • +
  • 現行のCeriumをテストした状態の物と比較する
  • +
  • Task の依存関係・実行順序も考慮する
  • +
+
+ +
+

就活のこと

+

私がゲーム会社に入るには

+
    +
  • 基本的なゲーム制作技術
  • +
  • 3Dレンダリング技術優遇
  • +
  • and more...
  • +
+
+ +
+

就活のこと

+

目標

+
    +
  • iPhoneインターフェースを用いたパズルゲーム
  • +
  • Cgシェーダを用いた3Dポリゴンビューワ
  • +
  • PlayStation3上で動作する超弾帝
  • +
+

やっていること

+
    +
  • パズルゲーム
  • +
  • Cgによる鏡面反射・トゥーンレンダリング
  • +
  • 超弾帝
  • +
+
+ +
+

パズルゲーム(Fall_Blocks)

+

仕様

+
    +
  • ぷよぷよ的なルール
  • +
  • タッチパネルを用いた直感操作
  • +
  • 加速度センサーを用いたブロックの移動
  • +
  • フリックやピンチを用いた何か
  • +
+ +

実装

+
    +
  • set_move_collision
  • +
  • フリック・ピンチを定義したPad
  • +
+
+ +
+

就活のこと

+

開発・SE

+ +
    +
  • 富士通パブリックソリューションズ
  • +
  • ソフトウェア情報開発
  • +
+
+ +

ゲーム

+ +
    +
  • イメージエポック
  • +
  • ラクジン
  • +
  • 日本一ソフトウェア
  • +
  • アトラス
  • +
  • バンダイナムコ
  • +
  • ヘキサドライブ
  • +
+
+
+ +
+ + diff -r 000000000000 -r dd58d6a69f56 semi10_06_08.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi10_06_08.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,79 @@ + + + + + +ゼミ資料 10/06/08 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + +
+ + +
+

Cerium を用いた
+Game Programming における
+テスト手法の提案

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ + +
+

研究背景・目的

+
    +
  • Cell 上のプログラムをテストしたい
  • +
  • 当研究室で開発した Cerium Game Engine を使用する
  • +
  • Task 単位での単体テストをする
  • +
  • Input データと Output データを比較する
  • +
  • ゲームならではのテスト(Collisionなど)も実施
  • +
  • Task の依存関係・実行順序も考慮する
  • +
  • 視覚的にわかりやすいテスト環境を
  • +
  • 最終的に上記を考慮した Test Framework を作る
  • +
+
+ +
+

就活のこと

+
    +
  • 内定1社
  • +
  • 進行中1社
  • +
+以上 +
+ +
+ + diff -r 000000000000 -r dd58d6a69f56 semi10_07_13.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi10_07_13.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,106 @@ + + + + + +ゼミ資料 10/07/13 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + +
+ + +
+

Cerium を用いた
+Game Programming における
+テスト手法の提案

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ + +
+

研究背景・目的

+
    +
  • Cerium を使った Game Program のバグ取りを簡単にしたい
  • +
  • Task 単位での単体テストをする
  • +
  • Input データと Output データを比較する
  • +
  • ゲームならではのテスト(Collisionなど)も実施
  • +
  • Task の依存関係・実行順序も考慮する
  • +
  • 最終的に上記を考慮した Test Framework を作る
  • +
+
+ +
+

就活のこと

+
    +
  • 本命内定(東京都品川区東品川)
  • +
  • 就活終了
  • +
+
+ +
+

研究のこと

+
    +
  • とりあえず Super Dandy の移植開発はカイトと共同
  • +
  • テスト関連の書籍や論文読み
  • +
  • テスト
  • +
  • 学会発表での流れの構築
  • +
+
+ +
+

予定しているテスト対象

+
    +
  • Property の値
  • +
  • SPE に送っている Task
  • +
  • 各 Object の Collision
  • +
  • Dandy を作る過程で発生した API
  • +
+
+ +
+

課題

+
    +
  • 元の Program を壊さずにテストできるか
  • +
  • 値やメモリのチェック
  • +
  • 全体テスト(視覚的?)
  • +
  • そもそもどんな風に研究に落とし込むか
  • +
+
+ +
+ + diff -r 000000000000 -r dd58d6a69f56 semi10_07_20.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi10_07_20.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,94 @@ + + + + + +ゼミ資料 10/07/20 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + +
+ + +
+

Cerium を用いた
+Game Programming における
+テスト手法の提案

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ + +
+

研究背景・目的

+
    +
  • Cerium を使った Game Program のバグ取りの手助けをしたい
  • +
  • Task 単位での単体テストをする
  • +
  • Input データと Output データを比較する
  • +
  • ゲームならではのテスト(Collisionなど)も実施
  • +
  • Task の依存関係・実行順序も考慮する
  • +
  • 最終的に上記を考慮した Test Framework を作る
  • +
+
+ +
+

Task List

+
    +
  • OpenGL version
  • +
  • Dandy の Test
  • +
+
+ +
+

Dandy の OpenGL version

+
    +
  • C で記述
  • +
  • 2面ボス以降も動作確認
  • +
  • XMLファイルを使用していない
  • +
  • OpenGLを保持したまま木構造で格納->新しいSceneGraph?
  • +
+
+ +
+

Dandy の Test

+
    +
  • 参考書読み読み
  • +
  • どうやって研究として落としこむの?
  • +
+
+ +
+ + diff -r 000000000000 -r dd58d6a69f56 semi10_07_27.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi10_07_27.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,146 @@ + + + + + +ゼミ資料 10/07/27 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + +
+ + +
+

Cerium を用いた
+Game Programming における
+テスト手法の提案

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ + +
+

研究背景・目的

+
    +
  • 学生実験において PlayStation3 を用いた Game Program の作成を行っている
  • +
  • Cell 用の Program の記述をする必要がある
  • +
  • Sequential なProgram に比べて動作の保証が難しい
  • +
  • Cell 上で動作するGame Program の信頼性を上げたい
  • +
  • Cerium を使った Game Program のテストを行う
  • +
  • Task 単位での単体テストをする
  • +
  • Input データと Output データを比較する
  • +
  • Task の依存関係・実行順序も考慮する
  • +
  • 最終的に上記を考慮した Test Framework を作る
  • +
+
+ +
+

今週やったこと

+
    +
  • Cerium OpenGL Ver
  • +
+
+ +
+

仕様

+
    +
  • OpenGL を用いてレンダリングを行う
  • +
  • MacOSX上での高速な動作を目的とする
  • +
  • Viewer と ViewerDevice 一体型
  • +
  • 通常の計算(Move, Collision)はそのまま
  • +
  • 描画部分は Task を使わず、OpenGL で SceneGraph から直に描画
  • +
+
+ +
+

プロセス

+
    +
  • SceneGraphの走査 -> CreatePolygonFromSceneGraphを参照
  • +
  • OpenGLによる描画 -> testglを参照
  • +
  • task生成、レンダリング部分をカット
  • +
+
+ +
+

SceneGraph

+
    +
  • coord_xyz[]
  • +
  • coord_tex[]
  • +
  • normal[]
  • +
+
+ +
+

OpenGL

+
    +
  • glVertex3f
  • +
  • glTexCoord2f
  • +
  • glNormal3f
  • +
+
+ +
+

task生成・レンダリング部分のカット

+
    +
  • mainLoop -> initLoop -> post2runLoop -> run_loop -> ... -> post2runLoop
  • +
  • mainLoop -> run_loop -> obj_draw -> mainLoop
  • +
+
+ +
+

今後の予定

+
    +
  • Textureの生成
  • +
  • SceneGraphの中にSDL_Surface型のtexture_image
  • +
  • SDL_Surface -> OpenGLが可能
  • +
+
+ +
+

もくじ

+
    +
  • 研究背景・目的
  • +
  • Cerium とは
  • +
  • Cerium を用いた Game Program の仕組み
  • +
  • Game Program のテスト手法
  • +
  • テスト
  • +
  • 考察
  • +
  • 参考文献
  • +
+
+ +
+ + diff -r 000000000000 -r dd58d6a69f56 semi10_08_03.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi10_08_03.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,127 @@ + + + + + +ゼミ資料 10/08/03 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + +
+ + +
+

Cerium を用いた
+Game Programming における
+テスト手法の提案

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ + +
+

研究背景・目的

+
    +
  • 学生実験において PlayStation3 を用いた Game Program の作成を行っている
  • +
  • Cell 用の Program の記述をする必要がある
  • +
  • Sequential なProgram に比べて動作の保証が難しい
  • +
  • Cell 上で動作するGame Program の信頼性を上げたい
  • +
  • Cerium を使った Game Program のテストを行う
  • +
  • Task 単位での単体テストをする
  • +
  • Input データと Output データを比較する
  • +
  • Task の依存関係・実行順序も考慮する
  • +
  • 最終的に上記を考慮した Test Framework を作る
  • +
+
+ +
+

今週やったこと

+
    +
  • Cerium OpenGL Ver
  • +
  • Super Dandy task Ver
  • +
+
+ +
+

Cerium OpenGL Ver できたこと

+
    +
  • 動作確認
  • +
  • 描画位置最適化
  • +
  • 光源追加
  • +
+
+ +
+

Cerium OpenGL Ver これから

+
    +
  • 動作し続けると重くなる
  • +
  • ループ中でSDL_GL_LoadTextureを呼び出しているのが原因
  • +
  • SDL_GL_LoadTextureは最初の一回だけ呼ぶようにする
  • +
  • ビデオモードによりSDL_GL_LoadTextureを呼ぶかどうかを判断する
  • +
+
+ +
+

Cerium OpenGL Ver これから

+
    +
  • glBlendFunc, glEnable(GL_BLEND)を用いても透過処理できない
  • +
  • ポリゴンRGBAのみで描画すると透過がうまくいかないことがあるらしい
  • +
  • ポリゴンRGBAxテクスチャRGBAで描画などをやったがダメだった
  • +
  • どうやら違う問題らしい?テクスチャRGBAを疑ってみる
  • +
+
+ +
+

Super Dandy task Ver

+
    +
  • 間違った箇所を参照するバグを修正
  • +
  • 描画が正常に行われない
  • +
  • set_move_task〜set_game_taskが問題?バグ取り続行
  • +
+
+ +
+

今後の予定

+
    +
  • Super Dandy の1面or2面の実装
  • +
  • バグ取り
  • +
  • 参考文献読み
  • +
  • 予稿制作
  • +
+
+ +
+ + diff -r 000000000000 -r dd58d6a69f56 semi10_08_10.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi10_08_10.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,159 @@ + + + + + +ゼミ資料 10/08/10 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + +
+ + +
+

Cerium を用いた
+Game Programming における
+テスト手法の提案

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ + +
+

研究背景・目的

+
    +
  • 我々は学生実験においてPlayStation3を用いたGameProgramの作成を行っている
  • +
  • PlayStation3上の開発ではCell Architectureを考慮した並列プログラミングが必要である
  • +
  • そこで当研究室ではCerium Game Engineを開発した
  • +
  • CeriumではObjectの描画やMove,Collisionを全てTaskという単位で管理している
  • +
  • しかしSequentialなProgramに比べて期待した動作を保証する事が難しい
  • +
  • 本研究ではCeriumを用いたGameProgramの信頼性を上げることを目的とする
  • +
  • Task単位での単体テストを行う
  • +
  • Input DataとOutput Dataの比較を行う
  • +
  • Taskの依存関係・実行順序も考慮する
  • +
  • 最終的には上記のテストから得られた結果を元にTest Frameworkの作成を行う
  • +
+
+ +
+

今週やったこと

+
    +
  • Cerium OpenGL の透過処理
  • +
  • Super Dandy
  • +
+
+ +
+

Cerium OpenGL の透過処理

+
    +
  • 透過処理完了
  • +
  • 以下の箇所にコードを追加
  • +
    +  glEnable(GL_DEPTH_TEST);
    +  glEnable(GL_ALPHA_TEST);
    +  glAlphaFunc(GL_GREATER, 0);
    +  glDepthFunc(GL_LESS);
    +  glShadeModel(GL_SMOOTH);
    +
    +
+
+ +
+

Super Dandy

+
    +
  • EXC_BAD_ACCESSなバグの処理
  • +
  • PropertyにcreateSceneGraphでもらったアドレスを格納->使用していたのが原因
  • +
  • allExecuteでSceneGraphの再生成をする為、上記のアドレスは使えない
  • +
  • 毎フレームSceneGraphのアドレスを取ってくる必要がある
  • +
  • とりあえずMove関数でSceneGraphのアドレスをPropertyに格納してみる
  • +
  • TaskでPropertyの値を計算
  • +
  • post_funcでPropertyの値をSceneGraphに反映させる
  • +
+
+ +
+

Super Dandy

+
    +
  • 描画に反映されていない
  • +
  • 毎フレームSceneGraphの座標を加算しているが反映されていない
  • +
  • 処理の順序が以下のようになっている気がする
  • +
      +
    1. allExecute(SceneGraphの破棄&生成)
    2. +
    3. 描画
    4. +
    5. post_funcで反映
    6. +
    +
+
+ +
+

Super Dandy

+
    +
  • allExecute&全Taskの実行順序を調べてみる
  • +
      +
        +
      1. DataAllocate
      2. +
      3. LoadTexture
      4. +
      5. allExecute
      6. +
      7. GameTask
      8. +
      9. CreatePolygonFromSceneGraph
      10. +
      11. GameTask->post_func
      12. +
      13. CreateSpan
      14. +
      15. DataUpdate
      16. +
      17. allExecute
      18. +
      19. GameTask
      20. +
      21. CreatePolygonFromSceneGraph
      22. +
      23. TitleMove->post_func
      24. +
      25. CreateSpan
      26. +
      27. DataUpdate
      28. +
      29. DrawSpanたくさん
      30. +
      31. allExecute
      32. +
      +
    +
+
+ +
+

Super Dandy

+
    +
  • post_funcがTaskの直後に実行されていない(バグ?しかしFifo)
  • +
  • post_funcじゃなくてMove関数で反映させれば関係ない(しかし1フレーム遅れる)
  • +
  • DrawTaskとGameTaskを一緒に管理できる仕組みが欲しい
  • +
  • DrawTask->wait_for(GameTask)とか出来ると良い
  • +
+
+ +
+ + diff -r 000000000000 -r dd58d6a69f56 semi10_10_12.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi10_10_12.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,118 @@ + + + + + +ゼミ資料 10/10/12 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + +
+ + +
+

Cerium を用いた
+Game Programming における
+テスト手法の提案

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ + +
+

研究背景・目的

+
    +
  • 我々は学生実験においてPlayStation3を用いたGameProgramの作成を行っている
  • +
  • PlayStation3上の開発ではCell Architectureを考慮した並列プログラミングが必要である
  • +
  • そこで当研究室ではCerium Game Engineを開発した
  • +
  • CeriumではObjectの描画やMove,Collisionを全てTaskという単位で管理している
  • +
  • しかしSequentialなProgramに比べて期待した動作を保証する事が難しい
  • +
  • 本研究ではCeriumを用いたGameProgramの信頼性を上げることを目的とする
  • +
  • Task単位の単体テスト
  • +
  • Input DataとOutput Dataの比較
  • +
  • Taskの依存関係・実行順序
  • +
  • 可視化?
  • +
+
+ +
+

学会発表について

+
    +
  • 発表締切:10月20日 ディペンダブルコンピューティング研究会[鳥取](2011年12月10日)
  • +
  • 発表締切:11月5日 コンピュータシステム研究会[東京](1月17日 - 1月18日)
  • +
  • 発表締切:11月15日 コンカレント工学研究会[山口](2011年1月20日 - 1月21日)
  • +
  • 発表締切:1月7日 ネットワークシステム研究会[沖縄](2011年3月3日 - 3月4日)
  • +
  • 発表締切:未定 ソフトウェアサイエンス研究会[沖縄](2011年3月7日 - 3月8日)
  • +
+
+*発表締切順 +
+ +
+

学会発表について

+
    +
  • 発表締切:10月20日 ディペンダブルコンピューティング研究会[鳥取](2011年12月10日)
  • + +
  • 発表締切:11月5日 コンピュータシステム研究会[東京](1月17日 - 1月18日)
  • +
  • 発表締切:11月15日 コンカレント工学研究会[山口](2011年1月20日 - 1月21日)
  • +
    + +
  • 発表締切:1月7日 ネットワークシステム研究会[沖縄](2011年3月3日 - 3月4日)
  • +
  • 発表締切:未定 ソフトウェアサイエンス研究会[沖縄](2011年3月7日 - 3月8日)
  • +
    +
+
+ +
+

Super Dandy

+
    +
  • dependency の追加
  • +dependency
    +
+
+ +
+

Super Dandy

+
    +
  • Pad の値を task に渡して計算する例題完了
  • +
  • 各 SceneGraph の move 関数で Property の値を SceneGraph に反映していた
  • +
  • 汎用的ではない
  • +
  • post_func で値の反映をしたい
  • +
+
+ +
+ + diff -r 000000000000 -r dd58d6a69f56 semi10_10_19.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi10_10_19.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,122 @@ + + + + + +ゼミ資料 10/10/19 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + +
+ + +
+

Cerium を用いた
+Game Programming における
+テスト手法の提案

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ + +
+

研究背景・目的

+
    +
  • 我々は学生実験においてPlayStation3を用いたGameProgramの作成を行っている
  • +
  • PlayStation3上の開発ではCell Architectureを考慮した並列プログラミングが必要である
  • +
  • そこで当研究室ではCerium Game Engineを開発した
  • +
  • CeriumではObjectの描画や動きを全てTaskという単位で管理している
  • +
  • しかしSequentialなProgramに比べて期待した動作を保証する事が難しい
  • +
  • 本研究ではCeriumを用いたGameProgramの信頼性を上げることを目的とする
  • +
  • Task単位の単体テスト
  • +
  • Input DataとOutput Dataの比較
  • +
  • Taskの依存関係・実行順序
  • +
  • 並列度の低い部分を知らせる
  • +
  • 可視化
  • +
+
+ +
+

超弾帝

+
    +
  • 色々なタイミングで Bad_Access になる問題の発生
  • +
  • メモリの allocate 時のサイズの指定が問題だった
  • +
  • メモリの allocate の不具合を解消
  • +
+
+ +
+

超弾帝

+
    +
  • Property の値が不正に変わる問題の発生
  • +
  • init 時、task 実行時、post_function 実行時でそれぞれ検証
  • +
  • init 時の data と task 実行時の inData、outData は正常
  • +
  • init 時の data と post_func 時の data の address は一致
  • +
  • post_func 時の data が異常
  • +
  • 何が原因かわからない…
  • +
  • TaskArray への対応を先にやる
  • +
+ +
+

超弾帝

+

前回の実装

+dependency
+
    +
  • GameTask 部分と CreatePorygonFromSG 部分が TaskArray 化できそう
  • +
  • とりあえず GameTask 部分を実装してみる
  • +
+
+ +
+

超弾帝

+
    +
  • GameTask をまとめる TaskArray を SceneGraphRoot に用意
  • +
  • Application ではまず TaskArray の init をする
  • +
  • あとは set_move_task で TaskArray に Task を追加してゆく
  • +
+
+ +
+

超弾帝

+
    +
  • ゲームには自機や複数の種類の敵がいる(Task の種類も様々)
  • +
  • 1つの TaskArray に色々な種類の Task が入るのか?
  • +
  • 入りそうだからとりあえず実装してみる
  • +
+
+ +
+ + diff -r 000000000000 -r dd58d6a69f56 semi10_10_26.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi10_10_26.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,170 @@ + + + + + +ゼミ資料 10/10/26 + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + +
+ + +
+

Cerium を用いた
+Game Programming における
+テスト手法の提案

+

小林 佑亮

+

琉球大学 理工学研究科 情報工学専攻

+

No.098581D

+
+ + + +
+

今週の作業内容

+
    +
  • Debug
  • +
  • TaskArray への対応
  • +
  • Dandy 移植のアプローチ考察
  • +
+
+ +
+

超弾帝

+

Debug

+
    +
  • TaskArray 使用 -> 謎の Bad Access
  • +
  • App->init で TaskArray を生成していた
  • +
  • App->init は一度しか呼ばれない
  • +
  • 毎フレーム TaskArray を生成する必要がある
  • +
  • Renderer 側で TaskArray 生成に必要な値(Task_id, Task_num, param, inData_num, outData_num) を保持しないといけない
  • +
  • 全部 SceneGraphRoot に持たせるのは嫌なので新しい class にまとめる
  • +
+
+ +
+

超弾帝

+

GTaskArray の作成

+
+
+
+class GTaskArray {
+public:
+    GTaskArray(void);
+    ~GTaskArray(void);
+
+    HTaskPtr game_task_array;
+    TaskPtr game_task;
+
+    int task_id;
+    int task_num;
+    int param_num;
+    int inData_num;
+    int outData_num;
+
+    void init(int id, int task, int param, int inData, int outData);
+    void create_task_array(TaskManager *manager);
+    void next_task_array(int id);
+    void finish();
+    HTaskPtr get_task_array(){return game_task_array;}
+};
+
+
+
+
+ +
+

超弾帝

+

TaskArray への対応

+
    +
  • SceneGraphRoot が GTaskArray をもつ
  • +
  • GTaskArray の init の有無によって TaskArray を使用するか判断
  • +
  • Application 側では最初の init と task の設定だけでおk
  • +
  • TaskArray を用いずに SimpleTask を使える API も作る?
  • +
+
+ +
+

超弾帝

+

SceneGraph の値の更新について

+
    +
  • 各 Task の post_func で更新
  • +
  • SPE に SceneGraph そのものを送る -> パラメータが汎用的でない
  • +
  • TaskArray の post_func で更新
  • +
+
+ +
+

超弾帝

+
  • 移植のアプローチ
  • +
      +
    • allExecute なので schedule, collision によって SceneGraph木 を書き換えていく
    • +
    • 同期をどうするか
    • +
    • Move->Collision->Rendering が望ましいが並列的でない
    • +
    • 過去書いたソース(PutEnemy, Move関数)は再利用できる、と信じている
    • +
    • 特に直書きパラメータは利用したい
    • +
    +
    + +
    +

    研究内容

    +

    どんな研究に落とし込む?

    +
      +
    • 可視化
    • +
    • 並列度, Dependency, SPE のLS
    • +
    • +
    +
    + +
    + + diff -r 000000000000 -r dd58d6a69f56 semi10_11_09.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi10_11_09.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,118 @@ + + + + + +ゼミ資料 10/11/09 + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + + +
    + + + +
    + + +
    +

    Cerium を用いた
    +Game Programming における
    +テスト手法の提案

    +

    小林 佑亮

    +

    琉球大学 理工学研究科 情報工学専攻

    +

    No.098581D

    +
    + + + +
    +

    今週の作業内容

    +
      +
    • SimpleTask 対応
    • +
    • Define
    • +
    +
    + +
    +

    SimpleTask 対応

    +
      +
    • set_gtask_array と set_game_task に分けた
    • +
    • TaskArray と SimpleTask で作れるようになった
    • +
    +
    + +
    +

    超弾帝

    +
      +
    • SimpleTask で実装
    • +
    • 取りあえず dependency とか pipeline とか考えない
    • +
    • 以前のバグは swap で解決
    • +
    +
    + +
    +

    超弾帝

    +
      +
    • ENEMY_STATUS_TABLE や DefSprite で初期化された値を Property に格納
    • +
    • Property はキャラクター毎の ID で参照 (過去のソース流用)
    • +
    +
    + +
    +

    超弾帝

    +
      +
    • Move は SPE で
    • +
    • Collision は PPE?
    • +
    • できれば SPE でやりたい
    • +
    • add_inData の数が可変
    • +
    • 汎用的な Task 生成 API が必要
    • +
    +
    + +
    + + diff -r 000000000000 -r dd58d6a69f56 semi10_12_14.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi10_12_14.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,99 @@ + + + + + +ゼミ資料 10/12/14 + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + + +
    + + + +
    + + +
    +

    Cerium を用いた
    +Game Programming における
    +テスト手法の提案

    +

    小林 佑亮

    +

    琉球大学 理工学研究科 情報工学専攻

    +

    No.098581D

    +
    + +
    +

    概要

    +
      +
    • 当研究室ではこれまで家庭用ゲーム機上での開発を行ってきた。過去には PlayStation や PlayStation2、 GameBoyAdvance を用いており、現在は PlayStation3(以下 PS3) て動作するゲーム開発を行っている。
    • +
    • PS3 の Archtecture である CellBroadbandEngine では複数の SPE を使用する並列プログラミングが求められている。
    • +
    • そこで当研究室では CeriumGameEngineを 開発した。Cerium では Program 動作や使用するデータを全て Task という単位で管理している。この Task を各 SPE に渡し、Pipeline で実行することで Program を動作させている
    • +
    • しかし Task の Dependency や データの同期の問題があり、Sequential に書いたコードと同じ動作を保証するのは難しい
    • +
      +
    • 本研究では Cerium を用いた GameProgram を使った実験を行い、期待した動作を保証できるテスト手法の提案をする。
    • +
    • また GameProgram の並列度やパフォーマンスを向上させる事を目的とする。
    • +
    +
    + +
    +

    Task Dandy

    +
      +
    • MoveとCollisionのTask化
    • +
    • 必要なパラメータを add_inDataし、set_post で値を更新
    • +
    • 送ったデータ量はCollisionで約7KB(Moveだともっと少ない)
    • +
    • SPEに置くバイナリデータは現状で約100KB
    • +
    • TaskのDependencyの設定が必要
    • +
    +
    + +
    +

    Task Dandy

    +
      +
    • Player、tokutenのTask化も
    • +
    • SPE内でのPutSprite, Putenemyの扱い
      +(入力されたデータを保持して返す、renew_task->post_func)
    • +
    • データ毎に最適化が必要
    • +
    • 1frame内に複数回書き換え&SPE間で共用->mainMem_alloc?
    • +
    • 共通のデータを使用するTaskは同じSPEで(Dataはglobal_alloc)
    • +
    +
    + +
    +

    論文内容

    +
      +
    • Task の Pipeline の図示(開始、終了時間を記録する)
    • +
    • Task の Dependency の可視化
    • +
    +
    + +
    + + diff -r 000000000000 -r dd58d6a69f56 semi10_12_21.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semi10_12_21.html Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,87 @@ + + + + + +ゼミ資料 10/12/21 + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + + +
    + + + +
    + + +
    +

    Cerium を用いた
    +Game Programming における
    +テスト手法の提案

    +

    小林 佑亮

    +

    琉球大学 理工学研究科 情報工学専攻

    +

    No.098581D

    +
    + +
    +

    概要

    +
      +
    • 当研究室ではこれまで家庭用ゲーム機上での開発を行ってきた。過去には PlayStation や PlayStation2、 GameBoyAdvance を用いており、現在は PlayStation3(以下 PS3) て動作するゲーム開発を行っている。
    • +
    • PS3 の Archtecture である CellBroadbandEngine では複数の SPE を使用する並列プログラミングが求められている。
    • +
    • そこで当研究室では CeriumGameEngineを 開発した。Cerium では Program 動作や使用するデータを全て Task という単位で管理している。この Task を各 SPE に渡し、Pipeline で実行することで Program を動作させている
    • +
    • Task には処理する CPU や Dependency を設定できる。
    • +
    • しかし現在、ゲーム開発に必要なパフォーマンスは発揮されていない。
    • +
      +
    • 本研究では Cerium 用に開発したゲームプログラムを用いてテストを行う。
    • +Task の Pipeline 処理、Dependency を確認できるテスト環境を用意し、それによって得られた結果を元に +パフォーマンスの向上を目指す。 + +
    +
    + +
    +

    研究会

    +
      +
    • 3月3日-3月4日 : ネットワークシステム研究会(申し込み締切り:1月7日)
    • +
    • 3月7日-3月8日 : ソフトウェアサイエンス研究会(申し込み締切り:1月19日)
    • +
    +
    + +
    +

    Pipeline

    +
      +
    • Task を送った時間とメールを受け取った時間、送ったSPE 番号
    • +
    • +
    +
    + +
    + + diff -r 000000000000 -r dd58d6a69f56 ui/default/blank.gif Binary file ui/default/blank.gif has changed diff -r 000000000000 -r dd58d6a69f56 ui/default/bodybg.gif Binary file ui/default/bodybg.gif has changed diff -r 000000000000 -r dd58d6a69f56 ui/default/framing.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/default/framing.css Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,23 @@ +/* The following styles size, place, and layer the slide components. + Edit these if you want to change the overall slide layout. + The commented lines can be uncommented (and modified, if necessary) + to help you with the rearrangement process. */ + +/* target = 1024x768 */ + +div#header, div#footer, .slide {width: 100%; top: 0; left: 0;} +div#header {top: 0; height: 3em; z-index: 1;} +div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;} +.slide {top: 0; width: 92%; padding: 3.5em 4% 4%; z-index: 2; list-style: none;} +div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;} +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; + margin: 0;} +#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em; z-index: 10;} +html>body #currentSlide {position: fixed;} + +/* +div#header {background: #FCC;} +div#footer {background: #CCF;} +div#controls {background: #BBD;} +div#currentSlide {background: #FFC;} +*/ diff -r 000000000000 -r dd58d6a69f56 ui/default/iepngfix.htc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/default/iepngfix.htc Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,42 @@ + + + + + \ No newline at end of file diff -r 000000000000 -r dd58d6a69f56 ui/default/opera.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/default/opera.css Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,7 @@ +/* DO NOT CHANGE THESE unless you really want to break Opera Show */ +.slide { + visibility: visible !important; + position: static !important; + page-break-before: always; +} +#slide0 {page-break-before: avoid;} diff -r 000000000000 -r dd58d6a69f56 ui/default/outline.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/default/outline.css Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,15 @@ +/* don't change this unless you want the layout stuff to show up in the outline view! */ + +.layout div, #footer *, #controlForm * {display: none;} +#footer, #controls, #controlForm, #navLinks, #toggle { + display: block; visibility: visible; margin: 0; padding: 0;} +#toggle {float: right; padding: 0.5em;} +html>body #toggle {position: fixed; top: 0; right: 0;} + +/* making the outline look pretty-ish */ + +#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;} +#slide0 h1 {padding-top: 1.5em;} +.slide h1 {margin: 1.5em 0 0; padding-top: 0.25em; + border-top: 1px solid #888; border-bottom: 1px solid #AAA;} +#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;} diff -r 000000000000 -r dd58d6a69f56 ui/default/pretty.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/default/pretty.css Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,86 @@ +/* Following are the presentation styles -- edit away! */ + +body {background: #FFF url(bodybg.gif) -16px 0 no-repeat; color: #000; font-size: 2em;} +:link, :visited {text-decoration: none; color: #00C;} +#controls :active {color: #88A !important;} +#controls :focus {outline: 1px dotted #227;} +h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;} +ul, pre {margin: 0; line-height: 1em;} +html, body {margin: 0; padding: 0;} + +blockquote, q {font-style: italic;} +blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em; text-align: center; font-size: 1em;} +blockquote p {margin: 0;} +blockquote i {font-style: normal;} +blockquote b {display: block; margin-top: 0.5em; font-weight: normal; font-size: smaller; font-style: normal;} +blockquote b i {font-style: italic;} + +kbd {font-weight: bold; font-size: 1em;} +sup {font-size: smaller; line-height: 1px;} + +.slide code {padding: 2px 0.25em; font-weight: bold; color: #533;} +.slide code.bad, code del {color: red;} +.slide code.old {color: silver;} +.slide pre {padding: 0; margin: 0.25em 0 0.5em 0.5em; color: #533; font-size: 90%;} +.slide pre code {display: block;} +.slide ul {margin-left: 5%; margin-right: 7%; list-style: disc;} +.slide li {margin-top: 0.75em; margin-right: 0;} +.slide ul ul {line-height: 1;} +.slide ul ul li {margin: .2em; font-size: 85%; list-style: square;} +.slide img.leader {display: block; margin: 0 auto;} + +div#header, div#footer {background: #005; color: #AAB; + font-family: Verdana, Helvetica, sans-serif;} +div#header {background: #005 url(bodybg.gif) -16px 0 no-repeat; + line-height: 1px;} +div#footer {font-size: 0.5em; font-weight: bold; padding: 1em 0;} +#footer h1, #footer h2 {display: block; padding: 0 1em;} +#footer h2 {font-style: italic;} + +div.long {font-size: 0.75em;} +.slide h1 {position: absolute; top: 0.7em; left: 87px; z-index: 1; + margin: 0; padding: 0.3em 0 0 50px; white-space: nowrap; + font: bold 150%/1em Helvetica, sans-serif; text-transform: capitalize; + color: #DDE; background: #005;} +.slide h3 {font-size: 130%;} +h1 abbr {font-variant: small-caps;} + +div#controls {position: absolute; left: 50%; bottom: 0; + width: 50%; + text-align: right; font: bold 0.9em Verdana, Helvetica, sans-serif;} +html>body div#controls {position: fixed; padding: 0 0 1em 0; + top: auto;} +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; + margin: 0; padding: 0;} +#controls #navLinks a {padding: 0; margin: 0 0.5em; + background: #005; border: none; color: #779; + cursor: pointer;} +#controls #navList {height: 1em;} +#controls #navList #jumplist {position: absolute; bottom: 0; right: 0; background: #DDD; color: #227;} + +#currentSlide {text-align: center; font-size: 0.5em; color: #449;} + +#slide0 {padding-top: 3.5em; font-size: 90%;} +#slide0 h1 {position: static; margin: 1em 0 0; padding: 0; + font: bold 2em Helvetica, sans-serif; white-space: normal; + color: #000; background: transparent;} +#slide0 h2 {font: bold italic 1em Helvetica, sans-serif; margin: 0.25em;} +#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;} +#slide0 h4 {margin-top: 0; font-size: 1em;} + +ul.urls {list-style: none; display: inline; margin: 0;} +.urls li {display: inline; margin: 0;} +.note {display: none;} +.external {border-bottom: 1px dotted gray;} +html>body .external {border-bottom: none;} +.external:after {content: " \274F"; font-size: smaller; color: #77B;} + +.incremental, .incremental *, .incremental *:after {color: #DDE; visibility: visible;} +img.incremental {visibility: hidden;} +.slide .current {color: #B02;} + + +/* diagnostics + +li:after {content: " [" attr(class) "]"; color: #F88;} + */ \ No newline at end of file diff -r 000000000000 -r dd58d6a69f56 ui/default/print.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/default/print.css Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,1 @@ +/* The following rule is necessary to have all slides appear in print! DO NOT REMOVE IT! */ .slide, ul {page-break-inside: avoid; visibility: visible !important;} h1 {page-break-after: avoid;} body {font-size: 12pt; background: white;} * {color: black;} #slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;} #slide0 h3 {margin: 0; padding: 0;} #slide0 h4 {margin: 0 0 0.5em; padding: 0;} #slide0 {margin-bottom: 3em;} h1 {border-top: 2pt solid gray; border-bottom: 1px dotted silver;} .extra {background: transparent !important;} div.extra, pre.extra, .example {font-size: 10pt; color: #333;} ul.extra a {font-weight: bold;} p.example {display: none;} #header {display: none;} #footer h1 {margin: 0; border-bottom: 1px solid; color: gray; font-style: italic;} #footer h2, #controls {display: none;} /* The following rule keeps the layout stuff out of print. Remove at your own risk! */ .layout, .layout * {display: none !important;} \ No newline at end of file diff -r 000000000000 -r dd58d6a69f56 ui/default/s5-core.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/default/s5-core.css Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,9 @@ +/* Do not edit or override these styles! The system will likely break if you do. */ + +div#header, div#footer, div#controls, .slide {position: absolute;} +html>body div#header, html>body div#footer, + html>body div#controls, html>body .slide {position: fixed;} +.handout {display: none;} +.layout {display: block;} +.slide, .hideme, .incremental {visibility: hidden;} +#slide0 {visibility: visible;} diff -r 000000000000 -r dd58d6a69f56 ui/default/slides.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/default/slides.css Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,3 @@ +@import url(s5-core.css); /* required to make the slide show run at all */ +@import url(framing.css); /* sets basic placement and size of slide components */ +@import url(pretty.css); /* stuff that makes the slides look better than blah */ \ No newline at end of file diff -r 000000000000 -r dd58d6a69f56 ui/default/slides.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/default/slides.js Tue Dec 28 14:42:48 2010 +0900 @@ -0,0 +1,553 @@ +// S5 v1.1 slides.js -- released into the Public Domain +// +// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for information +// about all the wonderful and talented contributors to this code! + +var undef; +var slideCSS = ''; +var snum = 0; +var smax = 1; +var incpos = 0; +var number = undef; +var s5mode = true; +var defaultView = 'slideshow'; +var controlVis = 'visible'; + +var isIE = navigator.appName == 'Microsoft Internet Explorer' && navigator.userAgent.indexOf('Opera') < 1 ? 1 : 0; +var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0; +var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0; + +function hasClass(object, className) { + if (!object.className) return false; + return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1); +} + +function hasValue(object, value) { + if (!object) return false; + return (object.search('(^|\\s)' + value + '(\\s|$)') != -1); +} + +function removeClass(object,className) { + if (!object) return; + object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2); +} + +function addClass(object,className) { + if (!object || hasClass(object, className)) return; + if (object.className) { + object.className += ' '+className; + } else { + object.className = className; + } +} + +function GetElementsWithClassName(elementName,className) { + var allElements = document.getElementsByTagName(elementName); + var elemColl = new Array(); + for (var i = 0; i< allElements.length; i++) { + if (hasClass(allElements[i], className)) { + elemColl[elemColl.length] = allElements[i]; + } + } + return elemColl; +} + +function isParentOrSelf(element, id) { + if (element == null || element.nodeName=='BODY') return false; + else if (element.id == id) return true; + else return isParentOrSelf(element.parentNode, id); +} + +function nodeValue(node) { + var result = ""; + if (node.nodeType == 1) { + var children = node.childNodes; + for (var i = 0; i < children.length; ++i) { + result += nodeValue(children[i]); + } + } + else if (node.nodeType == 3) { + result = node.nodeValue; + } + return(result); +} + +function slideLabel() { + var slideColl = GetElementsWithClassName('*','slide'); + var list = document.getElementById('jumplist'); + smax = slideColl.length; + for (var n = 0; n < smax; n++) { + var obj = slideColl[n]; + + var did = 'slide' + n.toString(); + obj.setAttribute('id',did); + if (isOp) continue; + + var otext = ''; + var menu = obj.firstChild; + if (!menu) continue; // to cope with empty slides + while (menu && menu.nodeType == 3) { + menu = menu.nextSibling; + } + if (!menu) continue; // to cope with slides with only text nodes + + var menunodes = menu.childNodes; + for (var o = 0; o < menunodes.length; o++) { + otext += nodeValue(menunodes[o]); + } + list.options[list.length] = new Option(n + ' : ' + otext, n); + } +} + +function currentSlide() { + var cs; + if (document.getElementById) { + cs = document.getElementById('currentSlide'); + } else { + cs = document.currentSlide; + } + cs.innerHTML = '' + snum + '<\/span> ' + + '\/<\/span> ' + + '' + (smax-1) + '<\/span>'; + if (snum == 0) { + cs.style.visibility = 'hidden'; + } else { + cs.style.visibility = 'visible'; + } +} + +function go(step) { + if (document.getElementById('slideProj').disabled || step == 0) return; + var jl = document.getElementById('jumplist'); + var cid = 'slide' + snum; + var ce = document.getElementById(cid); + if (incrementals[snum].length > 0) { + for (var i = 0; i < incrementals[snum].length; i++) { + removeClass(incrementals[snum][i], 'current'); + removeClass(incrementals[snum][i], 'incremental'); + } + } + if (step != 'j') { + snum += step; + lmax = smax - 1; + if (snum > lmax) snum = lmax; + if (snum < 0) snum = 0; + } else + snum = parseInt(jl.value); + var nid = 'slide' + snum; + var ne = document.getElementById(nid); + if (!ne) { + ne = document.getElementById('slide0'); + snum = 0; + } + if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;} + if (incrementals[snum].length > 0 && incpos == 0) { + for (var i = 0; i < incrementals[snum].length; i++) { + if (hasClass(incrementals[snum][i], 'current')) + incpos = i + 1; + else + addClass(incrementals[snum][i], 'incremental'); + } + } + if (incrementals[snum].length > 0 && incpos > 0) + addClass(incrementals[snum][incpos - 1], 'current'); + ce.style.visibility = 'hidden'; + ne.style.visibility = 'visible'; + jl.selectedIndex = snum; + currentSlide(); + number = 0; +} + +function goTo(target) { + if (target >= smax || target == snum) return; + go(target - snum); +} + +function subgo(step) { + if (step > 0) { + removeClass(incrementals[snum][incpos - 1],'current'); + removeClass(incrementals[snum][incpos], 'incremental'); + addClass(incrementals[snum][incpos],'current'); + incpos++; + } else { + incpos--; + removeClass(incrementals[snum][incpos],'current'); + addClass(incrementals[snum][incpos], 'incremental'); + addClass(incrementals[snum][incpos - 1],'current'); + } +} + +function toggle() { + var slideColl = GetElementsWithClassName('*','slide'); + var slides = document.getElementById('slideProj'); + var outline = document.getElementById('outlineStyle'); + if (!slides.disabled) { + slides.disabled = true; + outline.disabled = false; + s5mode = false; + fontSize('1em'); + for (var n = 0; n < smax; n++) { + var slide = slideColl[n]; + slide.style.visibility = 'visible'; + } + } else { + slides.disabled = false; + outline.disabled = true; + s5mode = true; + fontScale(); + for (var n = 0; n < smax; n++) { + var slide = slideColl[n]; + slide.style.visibility = 'hidden'; + } + slideColl[snum].style.visibility = 'visible'; + } +} + +function showHide(action) { + var obj = GetElementsWithClassName('*','hideme')[0]; + switch (action) { + case 's': obj.style.visibility = 'visible'; break; + case 'h': obj.style.visibility = 'hidden'; break; + case 'k': + if (obj.style.visibility != 'visible') { + obj.style.visibility = 'visible'; + } else { + obj.style.visibility = 'hidden'; + } + break; + } +} + +// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/) +function keys(key) { + if (!key) { + key = event; + key.which = key.keyCode; + } + if (key.which == 84) { + toggle(); + return; + } + if (s5mode) { + switch (key.which) { + case 10: // return + case 13: // enter + if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return; + if (key.target && isParentOrSelf(key.target, 'controls')) return; + if(number != undef) { + goTo(number); + break; + } + case 32: // spacebar + case 34: // page down + case 39: // rightkey + case 40: // downkey + if(number != undef) { + go(number); + } else if (!incrementals[snum] || incpos >= incrementals[snum].length) { + go(1); + } else { + subgo(1); + } + break; + case 33: // page up + case 37: // leftkey + case 38: // upkey + if(number != undef) { + go(-1 * number); + } else if (!incrementals[snum] || incpos <= 0) { + go(-1); + } else { + subgo(-1); + } + break; + case 36: // home + goTo(0); + break; + case 35: // end + goTo(smax-1); + break; + case 67: // c + showHide('k'); + break; + } + if (key.which < 48 || key.which > 57) { + number = undef; + } else { + if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return; + if (key.target && isParentOrSelf(key.target, 'controls')) return; + number = (((number != undef) ? number : 0) * 10) + (key.which - 48); + } + } + return false; +} + +function clicker(e) { + number = undef; + var target; + if (window.event) { + target = window.event.srcElement; + e = window.event; + } else target = e.target; + if (target.getAttribute('href') != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target,'object')) return true; + if (!e.which || e.which == 1) { + if (!incrementals[snum] || incpos >= incrementals[snum].length) { + go(1); + } else { + subgo(1); + } + } +} + +function findSlide(hash) { + var target = null; + var slides = GetElementsWithClassName('*','slide'); + for (var i = 0; i < slides.length; i++) { + var targetSlide = slides[i]; + if ( (targetSlide.name && targetSlide.name == hash) + || (targetSlide.id && targetSlide.id == hash) ) { + target = targetSlide; + break; + } + } + while(target != null && target.nodeName != 'BODY') { + if (hasClass(target, 'slide')) { + return parseInt(target.id.slice(5)); + } + target = target.parentNode; + } + return null; +} + +function slideJump() { + if (window.location.hash == null) return; + var sregex = /^#slide(\d+)$/; + var matches = sregex.exec(window.location.hash); + var dest = null; + if (matches != null) { + dest = parseInt(matches[1]); + } else { + dest = findSlide(window.location.hash.slice(1)); + } + if (dest != null) + go(dest - snum); +} + +function fixLinks() { + var thisUri = window.location.href; + thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length); + var aelements = document.getElementsByTagName('A'); + for (var i = 0; i < aelements.length; i++) { + var a = aelements[i].href; + var slideID = a.match('\#slide[0-9]{1,2}'); + if ((slideID) && (slideID[0].slice(0,1) == '#')) { + var dest = findSlide(slideID[0].slice(1)); + if (dest != null) { + if (aelements[i].addEventListener) { + aelements[i].addEventListener("click", new Function("e", + "if (document.getElementById('slideProj').disabled) return;" + + "go("+dest+" - snum); " + + "if (e.preventDefault) e.preventDefault();"), true); + } else if (aelements[i].attachEvent) { + aelements[i].attachEvent("onclick", new Function("", + "if (document.getElementById('slideProj').disabled) return;" + + "go("+dest+" - snum); " + + "event.returnValue = false;")); + } + } + } + } +} + +function externalLinks() { + if (!document.getElementsByTagName) return; + var anchors = document.getElementsByTagName('a'); + for (var i=0; i' + + '