Heliumエンジンの設計と実装
Upcoming SlideShare
Loading in...5
×
 

Heliumエンジンの設計と実装

on

  • 2,843 views

Heliumエンジンの設計と実装

Heliumエンジンの設計と実装

Statistics

Views

Total Views
2,843
Views on SlideShare
2,840
Embed Views
3

Actions

Likes
2
Downloads
16
Comments
0

1 Embed 3

https://twitter.com 3

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Heliumエンジンの設計と実装 Heliumエンジンの設計と実装 Presentation Transcript

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