64
Helium エンジンの設計と実装 @dada246

Heliumエンジンの設計と実装

  • Upload
    dada246

  • View
    2.755

  • Download
    23

Embed Size (px)

DESCRIPTION

Heliumエンジンの設計と実装

Citation preview

Page 1: Heliumエンジンの設計と実装

Heliumエンジンの設計と実装

@dada246

Page 2: Heliumエンジンの設計と実装

自己紹介

• ゲームプログラマやってます

• 得意分野 C++,C#,GPU,javascript,PHP• 低レベルから描画、 webまで幅広く書いてます

• Steam,Origin,iPhoneで海外ゲームを遊んでいます

Page 3: Heliumエンジンの設計と実装

はじめに

• 今回の話では、ゲーム画面は出ません

• Heliumエンジンはビルドしていません→コードを読んで理解した箇所を解説します

• ゲームエンジンが読めるって楽しいよね!

Page 4: Heliumエンジンの設計と実装

アジェンダ

• Heliumエンジンとは• 外部ライブラリ• 基礎ライブラリ• システム設計• 描画

Page 5: Heliumエンジンの設計と実装

Heliumエンジンとは

• オープンソースのゲームエンジン• githubで公開されているhttps://github.com/HeliumProject/Helium

• Insomniac GamesのオープンソースプロジェクトをベースにWhitemoon Dreamsが開発を引き継いだ

• Nocturnal Initiativeによると、初版は 2008年らしい

Page 6: Heliumエンジンの設計と実装

• 代表作Resistance

Ratchet & Clank

Spyro the Dragon

Page 7: Heliumエンジンの設計と実装

Whitemoon Dreams

• 代表作Planet Legend

Warmachine

Page 8: Heliumエンジンの設計と実装

その他、コード提供者

• Rob Wyatt

→Dreamworks,Microsoft, Naughty Dog, Insomniac Gamesなどに在籍

Page 9: Heliumエンジンの設計と実装

Helium Project

• http://heliumproject.org/

• Overview

http://nocturnal.insomniacgames.com/index.php/Helium

Page 10: Heliumエンジンの設計と実装

対象プラットフォーム• 言語: C++• OS:Windows(32bit,64bit)• グラフィックス :DirectX9• CPU:x86(32bit,64bit)• コンパイラ (CL,GCC,SNC)

• Posix関係のファイルは存在するが、未実装になっている

Page 11: Heliumエンジンの設計と実装

その他特徴

• 汎用的なゲームエンジン• 基礎機能のみ実装されている• マルチスレッド前提• Reflectionを使う• レベルエディタ用のコードも若干含まれている

• クラスが .cpp+.h+.inlで構成されている

Page 12: Heliumエンジンの設計と実装

全体構成

Page 13: Heliumエンジンの設計と実装

外部ライブラリ• オープンソースのゲームエンジンなので、 GPL関係のライブラリも駆使している

• boost• lua• libpng• zlib• Expat(XML Parser)• freetype(font engine)

Page 14: Heliumエンジンの設計と実装

外部ライブラリ

• 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)

Page 15: Heliumエンジンの設計と実装

ファイルフォーマット

• アニメーション: fbx• フォント: ttf• 設定ファイル: xml

Page 16: Heliumエンジンの設計と実装

アジェンダ

• Heliumエンジンとは• 外部ライブラリ• 基礎ライブラリ• システム設計• 描画

Page 17: Heliumエンジンの設計と実装

Container

• ArrayIterator• BitArray, DynArray• Map,Set• HashMap,HashSet• SortedMap, SortedSet• Pair• RbTree• Table• ObjectPool

Page 18: Heliumエンジンの設計と実装

Memory

• ArrayPtr• AutoPtr• エンディアン変換• SmartPtr• 参照カウンタ

Page 19: Heliumエンジンの設計と実装

Checksum

• Crc32• MD5• Hash64

http://burtleburtle.net/bob/c/lookup8.c• MurmurHash

http://tanjent.livejournal.com/756623.html

Page 20: Heliumエンジンの設計と実装

IPC(Inter Process Communication)

• プロセス間通信• Messageクラスをやりとりする• ファイル経由 or TCP経由• Workerで動作する

Page 21: Heliumエンジンの設計と実装

RCS(Revision Control System)

• Perforceをゲームエンジンから利用するためのクラス?

• Providerクラスを実装する必要がある

Page 22: Heliumエンジンの設計と実装

Inspect

• Buttonや CheckBox 、 ColorPickerなど GUI関係のクラス

• SceneGraph:: CreateToolで使われている→ゲーム内のデバッグ用 GUI表示かもしれない

http://nocturnal.insomniacgames.com/index.php/Inspect

Page 23: Heliumエンジンの設計と実装

SmartBuffer

• BufferSerializerでファイルに読み書きできるバッファ

• GDC2012で解説されていたものと似ている

http://gdcvault.com/play/1015319/Developing-Imperfect-Software-How-to

Page 24: Heliumエンジンの設計と実装

数学

• Float16

IEEE 754-2008 の 15bit浮動小数点 (half)を実装している

Page 25: Heliumエンジンの設計と実装

EulerOrder

• Graphics Gems IV(1994年 ) Ken Shoemakeの実装を元にしている

• オイラー角の X、 Y、 Zの掛け順を Enumに閉じ込めたもの

→Matrix3の回転計算が汎用的に書ける

Page 26: Heliumエンジンの設計と実装

図形

• AlignedBox• AngleAxis

• Linear• Bspline• CatmullRom

Page 27: Heliumエンジンの設計と実装

衝突形状• FPU実装と SIMD実装が用意されている

• AABB• OBB• Line• Frustum• BoundingSphere→point listの中にある最小球を求める関数などがある

Page 28: Heliumエンジンの設計と実装

SIMD

• _mm_load_psといった SSEによる実装

• Vector、Matrix 、 Quaternionなど基本的なものは SOAでも提供されている

• SSE関数をラップした Loadと Storeが用意されている

• typedef __m128 Register 型でアクセスする

Page 29: Heliumエンジンの設計と実装

テスト

• GoogleTestを利用

• jobや string、map、 socket、数学関係など基礎部品をテストする

• ソートなどのベンチマークも計測する

Page 30: Heliumエンジンの設計と実装

メモリ管理

• dlmalloc(by Doug Lea)か nedmalloc(by Niall Douglas)を使用する

• http://www.nedprod.com/programs/portable/nedmalloc/

• https://github.com/ned14/nedmalloc

→マルチスレッドでロックフリーなメモリアロケータ

Page 31: Heliumエンジンの設計と実装

DynamicMemoryHeap

• dlmallocや nedmallocにクリティカルセクションによるロックと、メモリトラッキング機能を付けたもの→メモリ確保時のアドレスを記録しておくhash_map< void*, void* Addresses[ BACKTRACE_DEPTH_MAX ] >

Page 32: Heliumエンジンの設計と実装

アジェンダ

• Heliumエンジンとは• 外部ライブラリ• 基礎ライブラリ• システム設計• 描画

Page 33: Heliumエンジンの設計と実装

Entity関係

• World,Layer,Entityが存在する

Page 34: Heliumエンジンの設計と実装

World

• Layerと GraphicsSceneを保持している• Entityの生成を行う

• TickCountや Update処理はWorldManagerが行う

Page 35: Heliumエンジンの設計と実装

Layer

• Entityを保持している• Packageを管理している

• 以下の 2種類がある→ Level layers Packageからファイルを読み込んで構築される

→ Dynamic layersレベルエディタで動的に変更出来る

Page 36: Heliumエンジンの設計と実装

Entity

• Position、 Rotation、 Scaleを保持している

• Skinモデルや Rigidモデルで使われる

Page 37: Heliumエンジンの設計と実装

Update

• マルチスレッドを考慮して Updateが 3段階にわかれている

Page 38: Heliumエンジンの設計と実装

NonCopyableクラス

• コピーコンストラクタを privateにしたクラス

• WorldManagerなどで継承して使う

Page 39: Heliumエンジンの設計と実装

GameObject

• フラグや名前、 IDを保持するクラス

• 以下のクラスの基底になっている• Package• Resource• ResourceHandler• Entity• Layer• World• GraphicsConfig• GraphicsScene

Page 40: Heliumエンジンの設計と実装

Reflect::Object

• staticフィールドとして Classクラスを保持する→型情報を扱うクラス

• ReflectionにはStructureクラスやEnumerationクラスもある

Page 41: Heliumエンジンの設計と実装

PackageLoader

• データの読み込み単位• PackageLoaderは抽象クラス

• GameObjectLoader• XmlPackageLoader• CacheObjectLoader• CachePackageLoader• EditorObjectLoader(tools only)

 

Page 42: Heliumエンジンの設計と実装

マルチスレッド

• .jobdefに xmlで入出力バッファなどの設定を記述

• .cppに jobの処理を記述して JobManagerで実行する

• TBBを使う

Page 43: Heliumエンジンの設計と実装

jobの種類

• SortJob• WorldManagerUpdate• EntityPreUpdate• EntityPostUpdate

• その他グラフィックス用に幾つか

Page 44: Heliumエンジンの設計と実装

Condition

• スレッドの同期オブジェクト• Win32はWaitForSingleObjectで実装

• Posixは pthread_cond_waitなどで実装↓を参考にしているらしいhttp://www.cs.wustl.edu/~schmidt/win32-cv-

2.html

Page 45: Heliumエンジンの設計と実装

アジェンダ

• Heliumエンジンとは• 外部ライブラリ• 基礎ライブラリ• システム設計• 描画

Page 46: Heliumエンジンの設計と実装

描画周り

• SceneGraph• Renderingクラス群• RenderingD3D9

Page 47: Heliumエンジンの設計と実装

SceneGraph

• Dependency Graphで構成される

• ノードや階層構造は Reflectionの仕組みを使って、 XMLやバイナリファイルに読み書き出来る

→ Reflect::ArchiveXML, Reflect::ArchiveBinary

Page 48: Heliumエンジンの設計と実装

HierarchyNode

• AlignedBoxも持っている

Page 49: Heliumエンジンの設計と実装

Traverser

• HierarchyNodeを辿って処理するクラス

• HierarchyChildTraverser→SceneGraphをダンプするためにノード情報を収集する

• HierarchyRenderTraverser→描画する• HierarchyPickTraverser→特定の Box内にあるノードを取得する

Page 50: Heliumエンジンの設計と実装

Statistics

• Frame Numberや Triangle Countをデバッグ表示するクラス

Page 51: Heliumエンジンの設計と実装

プリミティブ• Axes• Capsule• Circle• Cone• Cube• Cylinder• Frame• Grid• Locator• Pointer• Radius• Rings• Sphere

Page 52: Heliumエンジンの設計と実装

Renderingクラス群

• 描画 APIのラッパー• InputLayoutや BlendStateなど、 DirectX10の設計を取り入れている

Page 53: Heliumエンジンの設計と実装

Renderingクラス• Index Buffer , Vertex Buffer• Input Layout• Vertex Shader , Pixel Shader• Constant Buffer• Surface• Texture• 各種 RenderState…

Page 54: Heliumエンジンの設計と実装

RRenderResource

• 参照カウントによるリソース管理

Page 55: Heliumエンジンの設計と実装

RenderCommandProxy

• BeginSceneや EndScene、 SetIndexBufferなど、描画 APIをまとめたもの

Page 56: Heliumエンジンの設計と実装

RenderCommandList

• リスト構造ではなく、RenderCommandProxyを Allocateするためのもの

Page 57: Heliumエンジンの設計と実装

RenderingD3D9

• DirectX9 APIを Renderingクラスに合わせてラップしたもの

• 各種 Bufferや Shaderなど基本的なものは揃っている

Page 58: Heliumエンジンの設計と実装

CommandProxy

• ImmediateCommandProxy

→IDirect3DDevice9を直接呼ぶ

• DeferredCommandProxy

→描画コマンドを D3D9ClearCommandの様にクラス化して Listに蓄積した後、まとめて IDirect3DDevice9を呼ぶ

Page 59: Heliumエンジンの設計と実装

Fence

• IDirect3DQuery9のラッパー• シェーダー定数の設定時やコマンドバッファのキック時に使う

Page 60: Heliumエンジンの設計と実装

D3D9DynamicTexture2d

• D3D9Surfaceをテクスチャとして使うためのクラス

Page 61: Heliumエンジンの設計と実装

まとめ

• ゲームエンジンを学習するには良いコード→設計や外部ライブラリ含め、モダンな作りになっている→明らかにトップレベルのゲームプログラマが書いたコード

• たまにはゲームエンジンを読んでみてはいかが?

Page 62: Heliumエンジンの設計と実装

今回解説しきれなかった箇所

• C++ Reflection• Instrumenting Profiler• Debugging Helpers• Perforce Integration• Build

Page 63: Heliumエンジンの設計と実装

Question?

Page 64: Heliumエンジンの設計と実装

ご清聴ありがとうございました