Doom3 commentary

3,276 views

Published on

Doom3 commentary

Published in: Technology
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,276
On SlideShare
0
From Embeds
0
Number of Embeds
52
Actions
Shares
0
Downloads
41
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

Doom3 commentary

  1. 1. Doom3コード解説(イベントシステムとカスタム RTTI) @DADA246
  2. 2. 自己紹介• 名前:多田 航@DADA246• ゲームプログラマやってます• 得意分野 C++,C#,GPU,javascript,PHP• 描画関係とかCIとか
  3. 3. 自己紹介• 海外ゲーム歴PC9801版Test Driveが最初?その後Doom、Diablo、StarCraft、 NetStormから始まり、今ではSteam、Origin、iPhoneで海外ゲームを遊んでいます秋葉原で輸入ゲームも良く買ってます
  4. 4. アジェンダ• Doom3ゲーム概要• Doom3コード概要• idLib• エンティティ• カスタムRTTI• イベントシステム• まとめ
  5. 5. Doom3とは?• id softwareが開発したFPS• 2004/8発売• マルチプラットフォーム(Windows、Mac、 Linux)• メインプログラマはJohn Carmack• 2011/10にソースコードが公開されたhttps://github.com/TTimo/doom3.gpl
  6. 6. Doom3の特徴• 狭い通路• 懐中電灯と武器を切り替えるスタイル• ステンシルシャドウ• いくつかのカットシーン• スクリプトドリブンのレベルデザイン• コンソールウィンドウによるパラメータ 調整→idの伝統
  7. 7. John Carmack• id Software設立者の一人で、 FPSの生みの親• wolfenstein、Doom、Quake、 Rageなど数々のゲームを開発• id Softwareのゲームはほとん どJohn Carmackが一人で書い ていると言われている
  8. 8. Doom3のコードを読んでみる• Visual Studioで開く→neodoom.sln• Visual Studio Expressでビルドするためにはコード からATLを外す必要がある→チャレンジしてみましたがビルド出来ませんでした…• ソースコードはGPLでもテクスチャなどのリソー スは公開されていません。Doom3を買う必要が あります
  9. 9. コーディングスタイル• C++• stl、boostは不使用• 例外、標準RTTIは不使用• シンプルなテンプレート→2004年のコンパイラ事情や、John Carmackが書いたコードということで、移植性と処理速度を重視していると思われる(なにしろDoomを書いたプログラマーであり…そもそもQuake3まではC言語だった)
  10. 10. コーディングスタイル• C++の基本を押さえた書き方→constの徹底→最低限のvirtual→プリコンパイル済みヘッダー→クラスの前方宣言• レガシーな書き方も残っている→変数宣言を関数の先頭で行っている→名前空間を使っていない
  11. 11. 全体構成• Game→機種共通コード。別verとしてGame-d3xpがある• DoomDll→機種依存コード。exeが出力されるのはコレ
  12. 12. idLib• ゲームタイトルに依存しない処理を集めたラ イブラリ• エンディアンスワップ• 色定義• タイマー• Key/value dictionary• ローカライズ用辞書• 汎用ファイルフォーマット
  13. 13. idLib• ハッシュ(CRC32,MD4,MD5)• テキスト(CmdArgs,Base64)• コンテナ(2分探索,btree,ハッシュテーブル, リスト,リンクリスト,キュー,スタック,文字 列リスト, Vector Set …)→STLの代わり
  14. 14. 数学• ベクトル• 行列• 角度• クォオータニオン• 複素数• 乱数(線形合同法)• Lcp(Box Constrained Mixed Linear Complementarity Problem solver)• Polynormal(Polynomial of arbitrary degree with real coefficients)
  15. 15. ジオメトリ• DrawVert• JointTransform• Surface• Surface_Patch(Bezier patch surface)• Surface_Polytope(多面体)• Surface_SweptSpline• TraceModel(コリジョン用モデル)• Winding(任意凸形状)• Winding2D
  16. 16. ODE(常微分方程式)• Euler法• 4次のルンゲクッタ法
  17. 17. 衝突形状• AABB,OBB,視錐台,球• operatorオーバーロードを活用したシンプ ルなコード
  18. 18. プリュッカー座標系• a way to assign six homogenous coordinates to each line in projective 3-space(wikipedia)ら しいですが、詳細は理解していません。• 衝突判定に6次元座標を使う?
  19. 19. SIMD• Simd_GenericでC++の汎用実装をしつつ、一部 関数をSIMDに置き換えている• 以下の実装がある• 3DNow!• AltiVec• MMX• SSE• SSE2• SSE3(2004年 Doom3発売年)
  20. 20. SIMD• 処理負荷を計測する「テスト」が関数ご と用意されている• 四則演算の他にTransformVertsなどの描画 演算や、UpSamplePCMTo44kHzなどのサウ ンド処理が実装されている
  21. 21. アロケータ• MemoryBlock• DynamicAllocator• ページアロケータ→大きめのメモリ確保はページ単位小さめのメモリ確保はメモリプール(MemoryBlock)で行う
  22. 22. TypeInfoプロジェクト• Type Info Generator→NoGameTypeInfo.hを生成する
  23. 23. CurlLib• Daniel StenbergのcURL(クライアントサイド URL転送ライブラリ)• http://curl.haxx.se• ファイルシステムで使われている
  24. 24. アジェンダ• Doom3ゲーム概要• Doom3コード概要• idLib• エンティティ• カスタムRTTI• イベントシステム• まとめ
  25. 25. エンティティ• ゲームオブジェクトはエンティティと呼ばれ、以下の種類が ある• idAnimatedEntity(アニメーションするもの。ActorやPlayer)• idTestModel• idEntityFx• idAFAttachment(Articulated figure:多関節形状)• idAFEntity_Generic• idCursor3D• idWeapon(武器)• idLight(光源)• idBeam• idFuncEmitter• …
  26. 26. エンティティの例• idWeapon(武器制御)• 武器のOn/Offや、サウンド などの他のモジュールの処 理を行っている
  27. 27. idTypeInfo• カスタムRTTI• idClassでstaticな情報を扱うために存在する• 他のクラスからは直接触られず、idClass経由 で利用される
  28. 28. idTypeInfo主なフィールド• クラス名→文字列版とint版が用意されている→int版は通信対戦時のパケットに使う• 継承元のクラス名• イベント(メソッドを関数ポインタにしたもの。 後述)• セーブ、ロード時に使う関数ポインタ
  29. 29. idTypeInfoの使い道• クラス名の管理→クラス名からインスタンスを生成する→デバッグ表示、エラー表示にクラス名を入れる• 他のクラスと基底クラスが同じかどうか判 別• イベントの管理
  30. 30. idClass• idTypeInfoをstaticで所持している• イベントを実行する• セーブ、ロードもある
  31. 31. idClass主なメソッド• CreateInstance• GetClassname• ListClasses_f→ “Classname”, “Superclass”, “Type”, “Subclasses”の表示• Spawn→エンティティ出現時に呼ばれる
  32. 32. idClassイベント関連• PostEventMS( const idEventDef *ev, int time )• PostEventSec( const idEventDef *ev, float time )• ProcessEvent( const idEventDef *ev )→各種イベント(関数ポインタ)の実行。後述
  33. 33. idClass staticフィールド• static int idClass::memused→クラスインスタンスの総メモリ使用量• static int idClass::numobjects→クラスインスタンスの総数
  34. 34. フィールド初期化忘れ対策• idClass::CreateInstance→newするときにメモリ領域に0xcdcdcdcdを書いておく→コンストラクタが走った後、メモリ領域に0xcdcdcdcdがあるかどうかを調べて、フィールドの初期化忘れを見つけるDebugビルドでのみ上記チェックを行う
  35. 35. idEntity• 様々な処理が集まっている• thinking(物理更新やUpdate処理など)• visuals(描画処理)• animation• sound• entity binding(エンティティの親子関係)• physics• damage(体力を減らしたり)• scripting(スクリプトの処理、シグナル管理)• gui(GUIに命令を出す)• targets(別のエンティティのシグナルを送る)
  36. 36. idAnimatedEntity• idEntityにアニメーション(idAnimator)を加 えたもの• idAnimator→複数チャンネルのモーションブレンドや、親子構造が書いてあるが、詳細は割愛
  37. 37. おさらい• idWeapon
  38. 38. 他のエンティティ• idLight(光源制御クラス)• 光源の方向や色を保持している• On/Offやフェードも出来る• クラス階層がシンプル
  39. 39. エンティティの一括管理• エンティティはidGameLocalで一括管理さ れている• idGameLocalでは全エンティティを所持す る他、エンティティの作成、削除、検索 ができる
  40. 40. idGameLocal• 様々なモジュールの集合クラス• Entity(全エンティティの管理)• Random• Program(スクリプト)• Clipping• Physics• PVS(potential visible set)• MultiPlayerGame• SmokeParticles• カメラ• ゲームの種類などの汎用情報• …
  41. 41. idGameLocal• 様々なメソッドを持つ• Entityの出現、削除、検索• ネットワーク対戦情報• セーブ、ロード• ユーザー情報• Draw• ゲームのリセット• Printf• マップのロード• AAS(area system)
  42. 42. エンティティの検索• 名前で検索 const char * name; idEntity* ent = gameLocal.FindEntity( name );• Key Value Dictionaryで検索 const char * key; gameLocal.GetTargets(Key Value Dictionary, Entity, key );
  43. 43. エンティティの検索• クリッピング結果の取得trace_t tr;//トレース結果用変数gameLocal.clip.TracePoint( tr,線分の開始地点,線分の終了地点, …);idEntity* ent = gameLocal.GetTraceEntity( tr );//エンティティの取得ent->Signal( SIG_TOUCH );//シグナルの発行ent->ProcessEvent( &EV_Touch, …);//イベントの実行
  44. 44. エンティティ生成• idTypeInfoで型指定してエンティティを生 成できるworldModel = static_cast< idAnimatedEntity * > ( gameLocal.SpawnEntityType( idAnimatedEntity::Type, NULL ) );
  45. 45. アジェンダ• Doom3ゲーム概要• Doom3コード概要• idLib• エンティティ• カスタムRTTI• イベントシステム• まとめ
  46. 46. イベントシステム• C++の関数をスクリプトから呼ぶためのも の• idEventとidEventDefで構成されている
  47. 47. イベントを使った処理• idWeaponで直接関数を呼 ばずにイベント (idClass::ProcessEvent)を経 由している
  48. 48. イベントの登録• 各種エンティティの先頭でidEventDefを宣 言 idEventDef EV_Weapon_Next( "nextWeapon" ); const …• その後マクロで関数をイベントに登録す CLASS_DECLARATION( idAnimatedEntity, idWeapon ) る EVENT( EV_Weapon_Next,idWeapon::Event_Next ) END_CLASS
  49. 49. イベントの呼び出し• idClass::ProcessEventを呼ぶと、イベント登 録された関数が呼ばれる idEntity *other; other->ProcessEvent( &EV_Touch, this, &collision );
  50. 50. スクリプト• イベントはスクリプトクラスでも使われ ている• Script_Compiler• Script_Interpreter• Script_Program• Script_Thread
  51. 51. スクリプトからのイベント呼び 出し• スクリプトからidInterpreter::CallEventでイ ベントを呼べる• idWeapon::Event_Clearといったメソッドを 直接呼び出さないでイベントを経由して いるのはスクリプトのため?
  52. 52. まとめ• Doom3を読んでみました• 海外ゲームの基礎システムに興味を持って 頂ければ幸いです
  53. 53. 解説していないコード• スクリプトコンパイラ• ファイルシステム• 物理• アニメーション• Dedicated Server• 描画(renderEntity,qgl)• …
  54. 54. Question?
  55. 55. ご清聴ありがとうございました

×