Heliumエンジンの設計と実装

3,436 views
3,288 views

Published on

Heliumエンジンの設計と実装

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

No Downloads
Views
Total views
3,436
On SlideShare
0
From Embeds
0
Number of Embeds
64
Actions
Shares
0
Downloads
21
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Heliumエンジンの設計と実装

  1. 1. Helium エンジンの設計と実装 @dada246
  2. 2. 自己紹介• ゲームプログラマやってます• 得意分野 C++,C#,GPU,javascript,PHP• 低レベルから描画、 web まで幅広く書いて ます• Steam,Origin,iPhone で海外ゲームを遊んでい ます
  3. 3. はじめに• 今回の話では、ゲーム画面は出ません• Helium エンジンはビルドしていません→ コードを読んで理解した箇所を解説しま す• ゲームエンジンが読めるって楽しいよ ね!
  4. 4. アジェンダ• Helium エンジンとは• 外部ライブラリ• 基礎ライブラリ• システム設計• 描画
  5. 5. Helium エンジンとは• オープンソースのゲームエンジン• github で公開されているhttps://github.com/HeliumProject/Helium• Insomniac Games のオープンソースプロジェク トをベースに Whitemoon Dreams が開発を引き 継いだ• Nocturnal Initiative によると、初版は 2008 年ら しい
  6. 6. • 代表作ResistanceRatchet & ClankSpyro the Dragon
  7. 7. Whitemoon Dreams• 代表作Planet LegendWarmachine
  8. 8. その他、コード提供者• Rob Wyatt→Dreamworks,Microsoft, Naughty Dog, Insomniac Games などに在籍
  9. 9. Helium Project• http://heliumproject.org/• Overviewhttp://nocturnal.insomniacgames.com/index.ph p/Helium
  10. 10. 対象プラットフォーム• 言語: C++• OS:Windows(32bit,64bit)• グラフィックス :DirectX9• CPU:x86(32bit,64bit)• コンパイラ (CL,GCC,SNC)• Posix 関係のファイルは存在するが、未実 装になっている
  11. 11. その他特徴• 汎用的なゲームエンジン• 基礎機能のみ実装されている• マルチスレッド前提• Reflection を使う• レベルエディタ用のコードも若干含まれ ている• クラスが .cpp+.h+.inl で構成されている
  12. 12. 全体構成
  13. 13. 外部ライブラリ• オープンソースのゲームエンジンなの で、 GPL 関係のライブラリも駆使している• boost• lua• libpng• zlib• Expat(XML Parser)• freetype(font engine)
  14. 14. 外部ライブラリ• TBB(Intel Threading Building Blocks)• wxWidgets(A cross-platform GUI and tools library for GTK)• nvtt(nvidia-texture-tools)• P4API.NET(Perforce for the .NET)
  15. 15. ファイルフォーマット• アニメーション: fbx• フォント: ttf• 設定ファイル: xml
  16. 16. アジェンダ• Helium エンジンとは• 外部ライブラリ• 基礎ライブラリ• システム設計• 描画
  17. 17. Container• ArrayIterator• BitArray, DynArray• Map,Set• HashMap,HashSet• SortedMap, SortedSet• Pair• RbTree• Table• ObjectPool
  18. 18. Memory• ArrayPtr• AutoPtr• エンディアン変換• SmartPtr• 参照カウンタ
  19. 19. Checksum• Crc32• MD5• Hash64http://burtleburtle.net/bob/c/lookup8.c• MurmurHashhttp://tanjent.livejournal.com/756623.html
  20. 20. IPC(Inter Process Communication)• プロセス間通信• Message クラスをやりとりする• ファイル経由 or TCP 経由• Worker で動作する
  21. 21. RCS(Revision Control System)• Perforce をゲームエンジンから利用するた めのクラス?• Provider クラスを実装する必要がある
  22. 22. Inspect• Button や CheckBox 、 ColorPicker など GUI 関係のクラス• SceneGraph:: CreateTool で使われている→ ゲーム内のデバッグ用 GUI 表示かもしれ ないhttp://nocturnal.insomniacgames.com/index.ph p/Inspect
  23. 23. SmartBuffer• BufferSerializer でファイルに読み書きでき るバッファ• GDC2012 で解説されていたものと似てい るhttp://gdcvault.com/play/1015319/Developing- Imperfect-Software-How-to
  24. 24. 数学• Float16IEEE 754-2008 の 15bit 浮動小数点 (half) を実 装している
  25. 25. EulerOrder• Graphics Gems IV(1994 年 ) Ken Shoemake の 実装を元にしている• オイラー角の X 、 Y 、 Z の掛け順を Enum に閉じ込めたもの→Matrix3 の回転計算が汎用的に書ける
  26. 26. 図形• AlignedBox• AngleAxis• Linear• Bspline• CatmullRom
  27. 27. 衝突形状• FPU 実装と SIMD 実装が用意されている• AABB• OBB• Line• Frustum• BoundingSphere→point list の中にある最小球を求める関数など がある
  28. 28. SIMD• _mm_load_ps といった SSE による実装• Vector 、 Matrix 、 Quaternion など基本的 なものは SOA でも提供されている• SSE 関数をラップした Load と Store が用意 されている• typedef __m128 Register 型でアクセスする
  29. 29. テスト• GoogleTest を利用• job や string 、 map 、 socket 、数学関係な ど基礎部品をテストする• ソートなどのベンチマークも計測する
  30. 30. メモリ管理• dlmalloc(by Doug Lea) か nedmalloc(by Niall Douglas) を使用する• http://www.nedprod.com/programs/portable/ nedmalloc/• https://github.com/ned14/nedmalloc→ マルチスレッドでロックフリーなメモリア ロケータ
  31. 31. DynamicMemoryHeap• dlmalloc や nedmalloc にクリティカルセク ションによるロックと、メモリトラッキン グ機能を付けたもの→ メモリ確保時のアドレスを記録しておくhash_map< void*, void* Addresses[ BACKTRACE_DEPTH_MAX ] >
  32. 32. アジェンダ• Helium エンジンとは• 外部ライブラリ• 基礎ライブラリ• システム設計• 描画
  33. 33. Entity 関係• World,Layer,Entity が存在する
  34. 34. World• Layer と GraphicsScene を保持している• Entity の生成を行う• TickCount や Update 処理は WorldManager が行う
  35. 35. Layer• Entity を保持している• Package を管理している• 以下の 2 種類がある→ Level layersPackage からファイルを読み込んで構築される→ Dynamic layersレベルエディタで動的に変更出来る
  36. 36. Entity• Position 、 Rotation 、 Scale を保持してい る• Skin モデルや Rigid モデルで使われる
  37. 37. Update• マルチスレッドを考慮して Update が 3 段 階にわかれている
  38. 38. NonCopyable クラス• コピーコンストラクタを private にしたク ラス• WorldManager などで継承して使う
  39. 39. GameObject• フラグや名前、 ID を保持するクラス• 以下のクラスの基底になっている• Package• Resource• ResourceHandler• Entity• Layer• World• GraphicsConfig• GraphicsScene
  40. 40. Reflect::Object• static フィールドとして Class クラスを保持 する→ 型情報を扱うクラス• Reflection にはStructure クラスやEnumeration クラスもある
  41. 41. PackageLoader• データの読み込み単位• PackageLoader は抽象クラス• GameObjectLoader• XmlPackageLoader• CacheObjectLoader• CachePackageLoader• EditorObjectLoader(tools only) 
  42. 42. マルチスレッド• .jobdef に xml で入出力バッファなどの設 定を記述• .cpp に job の処理を記述して JobManager で実行する• TBB を使う
  43. 43. job の種類• SortJob• WorldManagerUpdate• EntityPreUpdate• EntityPostUpdate• その他グラフィックス用に幾つか
  44. 44. Condition• スレッドの同期オブジェクト• Win32 は WaitForSingleObject で実装• Posix は pthread_cond_wait などで実装↓ を参考にしているらしいhttp://www.cs.wustl.edu/~schmidt/win32-cv- 2.html
  45. 45. アジェンダ• Helium エンジンとは• 外部ライブラリ• 基礎ライブラリ• システム設計• 描画
  46. 46. 描画周り• SceneGraph• Rendering クラス群• RenderingD3D9
  47. 47. SceneGraph• Dependency Graph で構成される• ノードや階層構造は Reflection の仕組みを 使って、 XML やバイナリファイルに読み 書き出来る→ Reflect::ArchiveXML, Reflect::ArchiveBinary
  48. 48. HierarchyNode• AlignedBox も持っている
  49. 49. Traverser• HierarchyNode を辿って処理するクラス• HierarchyChildTraverser→SceneGraph をダンプするためにノード情報を 収集する• HierarchyRenderTraverser→ 描画する• HierarchyPickTraverser→ 特定の Box 内にあるノードを取得する
  50. 50. Statistics• Frame Number や Triangle Count をデバッグ 表示するクラス
  51. 51. プリミティブ• Axes• Capsule• Circle• Cone• Cube• Cylinder• Frame• Grid• Locator• Pointer• Radius• Rings• Sphere
  52. 52. Rendering クラス群• 描画 API のラッパー• InputLayout や BlendState など、 DirectX10 の 設計を取り入れている
  53. 53. Rendering クラス• Index Buffer , Vertex Buffer• Input Layout• Vertex Shader , Pixel Shader• Constant Buffer• Surface• Texture• 各種 RenderState…
  54. 54. RRenderResource• 参照カウントによるリソース管理
  55. 55. RenderCommandProxy• BeginScene や EndScene 、 SetIndexBuffer な ど、描画 API をまとめたもの
  56. 56. RenderCommandList• リスト構造ではなく、 RenderCommandProxy を Allocate するため のもの
  57. 57. RenderingD3D9• DirectX9 API を Rendering クラスに合わせて ラップしたもの• 各種 Buffer や Shader など基本的なものは 揃っている
  58. 58. CommandProxy• ImmediateCommandProxy→IDirect3DDevice9 を直接呼ぶ• DeferredCommandProxy→ 描画コマンドを D3D9ClearCommand の 様にクラス化して List に蓄積した後、 まとめて IDirect3DDevice9 を呼ぶ
  59. 59. Fence• IDirect3DQuery9 のラッパー• シェーダー定数の設定時やコマンドバッ ファのキック時に使う
  60. 60. D3D9DynamicTexture2d• D3D9Surface をテクスチャとして使うた めのクラス
  61. 61. まとめ• ゲームエンジンを学習するには良いコー ド→ 設計や外部ライブラリ含め、モダンな作 りになっている→ 明らかにトップレベルのゲームプログラ マが書いたコード• たまにはゲームエンジンを読んでみては いかが?
  62. 62. 今回解説しきれなかった箇所• C++ Reflection• Instrumenting Profiler• Debugging Helpers• Perforce Integration• Build
  63. 63. Question?
  64. 64. ご清聴ありがとうございました

×