Upload
dada246
View
2.755
Download
23
Embed Size (px)
DESCRIPTION
Heliumエンジンの設計と実装
Citation preview
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年らしい
• 代表作Resistance
Ratchet & Clank
Spyro the Dragon
Whitemoon Dreams
• 代表作Planet Legend
Warmachine
その他、コード提供者
• Rob Wyatt
→Dreamworks,Microsoft, Naughty Dog, Insomniac Gamesなどに在籍
Helium Project
• http://heliumproject.org/
• Overview
http://nocturnal.insomniacgames.com/index.php/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• Hash64
http://burtleburtle.net/bob/c/lookup8.c• MurmurHash
http://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.php/Inspect
SmartBuffer
• BufferSerializerでファイルに読み書きできるバッファ
• GDC2012で解説されていたものと似ている
http://gdcvault.com/play/1015319/Developing-Imperfect-Software-How-to
数学
• Float16
IEEE 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 layers Packageからファイルを読み込んで構築される
→ 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?
ご清聴ありがとうございました