KK PROJEKT RED 勉強ブログ

ゲーム好き技術系大学生のメモのようなもの

Helium ゲームエンジン

チワーッス

Helium


主にUE4関係のことを記事にしていこうと思ってるのですが、今回は関係ないです。

あと、自分でプログラムとか動かしながら同時進行でブログ書いていくので、かなり雑でまとまりのない記事になるかと思いますが御容赦下さい。

FC2ブログから引っ越してきた理由は、標準でMarkdownサポートしているからです。 FC2でマークダウンやろうとするとソースコード載せる時とか結構めんどくさいんすよね。

で、本題です。

ゲームエンジンってめっちゃクールだよね!

ありとあらゆる技術と芸術の融合体であるゲームを作り上げるゲームエンジンですが、そんなゲームエンジンがどうやって作られているのかずっと前から知りたくて、ちょこちょこゲームエンジンアーキテクチャについて書かれてる本とか読んだりしてるわけですが、、、

ロクに大規模なアプリケーション作ったことない人間としては、 もちろん構成のイメージすら浮かばないわけで、、、

で、一つのゲームエンジンをガッツリ見ていこうかなと思ってます。 お気に入りのUnreal Engineソースコードで勉強するのもいいと思うんですけど、 初めは、Heliumエンジンっていうのを見ていこうかなと思います。 理由は、オープンソースっていうことと、スライドシェアのあるスライド を見て、「ゲームエンジンを学習するには良いコード」って書かれていたっていうことと、名前がカッコいい、それだけです。

Heliumエンジンで作られた有名なゲームに、

ラチェット&クランク」とかあります。

それじゃあ、勉強していきます。

まず、初めにですね、日本語の情報サイトは皆無でした。
まぁ、これはHeliumエンジンに限らず、ゲームエンジンのソースをレビューする人なんて ほとんどいないでしょっていう。

英語のサイトだったら少しあるっぽいですけど、 とりあえずGitHubのREADME.mdさらっと読みます(英語読めないけど)。

Helium Engine(Github)




以下mdの簡単な訳とコメント


Github

Heliumは十分な機能を有するオープンソースゲームエンジンを目指す。
馴染みのあるDCCのUIと使いやすいデザインを活用。
FBXのような実績のある製造を使ってるコンテンツをインポート?

Documentation

Introduction

System

(このあたりは大事そうなのでまた後で)

Resources

  • ウェブサイト
  • ギットハブ
  • Google グループ
  • IRC

(google グループとかIRCとか初めて知った。)

Building

ヘリウムはpramake5を使ってビルドされる。Premakeはluaスクリプトをインタープリットして、 特定のプラットフォームのIDEプロジェクトファイルを生成する。

(premakeとかcmakeとか知れた。IDEのプロジェクトファイル作れるの強い)

Prerequisites(事前にいるもの)

All Platforms

Windows

OSX

  • XCode Command Line Tools

Linux

  • GCC6

Compile

まず初めに、俺らのソースツリーをgitから引っ張ってこい。 そして、

git submodule update --init --recursive

コマンドにより、 全てのサブモジュールを取れることを確かめろ。 次に、premakeを使って、プロジェクトファイルを生成しろ。 premakeの適切なビルドはリポジトリーに含まれてる。 windows上なら、visualstudioのプロジェクトを生成する。 OSXLINUX上なら、makeファイルを生成するpremakeを作れ。

(これで、モジュール類全部アップデートできる。.gitmoduleっていうファイルに何のモジュールがあるか記述されてる。
恐らくgit submodule addコマンドで追加したモジュール)

Caveats

OSX上では、スペースのある"FBX SDK"で依存チェックエラーが出るかも、、、、





とりあえず、一通りやってみる。

アーキテクチャとか構成とかはちょっと後回しにして、コマンド実行します。

下のコマンドとかで、Cloneして

git clone https://github.com/HeliumProject/Helium.git

モジュールを最新にして、

git submodule update --init --recursive
$ cd Dependencies
$ ../premake.sh gmake

を、実行(Macで)するとできるはずだが、以下のように失敗。。。

checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether clang accepts -g... yes
checking for clang option to accept ISO C89... none needed
checking whether we are using the Intel C compiler... no
checking how to run the C preprocessor... clang -E
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking whether clang needs -traditional... no
checking whether we are using the GNU C++ compiler... yes
checking whether clang++ accepts -g... yes
checking whether we are using the Intel C++ compiler... no
checking whether we are using the Metrowerks C++ compiler... no
checking whether we are using the IBM xlC C++ compiler... no
checking for ar... ar
checking for SDK directory /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.plat
form/Developer/SDKs/MacOSX10.11.sdk... configure: error: in `/Users/名前/Desktop/Heliu
m-Engine/Helium-master_git/Helium/Dependencies/wxWidgets/macbuild-debug-unicode-64':
configure: error: not found
See `config.log' for more details
$

config.logを読んでみても、ネットで調べてみても解決策は、、、、、、

気を取り直して、windowsでやってみることに、 先ほどと同じ要領でpremake実行すると、

Error: c:/Users/k/Desktop/helium/Helium/Helium.lua:180: attempt to concatenate a nil value

途中でこんなの出て失敗。 “Helium.lua"の180行目を見ると

os.getenv( "DXSDK_DIR" ) .. "Include"

どうやらDirectXに問題がありそう。

そういえば、DirectX SDKが必要なんだっけ。

でも、Windows10って元からDirectX入ってるんじゃなかったっけ?

調べたら、DirectX SDKはVS2012以降?ならWindowsSDKに統合されてるっぽくて、じゃあなんだろって思ってさらに調べると Windows10 SDK っていうのがあり、そいつインストールしたらできました。win10アプリ開発には Windows 10 SDK がいるってことかな。

Helium VisualStudio Solution

エラーすごい出てるけど、まぁ、visual studio でクラスビュー見れてとりあえず満足(笑)

で、もう一回 Macで試したら、なんといけた!笑

git submodule update --init --recursive

これしてなかったです笑!

で、

make -j8

これして、

                .
                .
                .

==== Building Helium-Runtime-Bullet (debug_x64) ====
==== Building Helium-Runtime-Ois (debug_x64) ====
==== Building Helium-Runtime-Framework (debug_x64) ====
==== Building Helium-Runtime-FrameworkImpl (debug_x64) ====
==== Building Helium-Runtime-ExampleGame (debug_x64) ====
==== Building Helium-Runtime-ExampleMain_PhysicsDemo (debug_x64) ====
Linking Helium-Runtime-ExampleMain_PhysicsDemo
ld: warning: directory not found for option '-L/usr/lib64'
ld: warning: directory not found for option '-L/Applications/Autodesk/FBX SDK/2016.1.2/lib/clang/debug'
ld: library not found for -lfbxsdk
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [Bin/Debug/Helium.app/Contents/MacOS/Helium-Runtime-ExampleMain_PhysicsDemo] Error 1
make: *** [Helium-Runtime-ExampleMain_PhysicsDemo] Error 2

FBX SDKが見つからないというエラー、、、じゃない?

キーワード
Helium-Runtime-ExampleMain_PhysicsDemo
FBX SDK

FBS SDKを入れたら直るといいんだが

インストールして、もう一回make実行

==== Building Helium-Runtime-ExampleMain_PhysicsDemo (debug_x64) ====
Linking Helium-Runtime-ExampleMain_PhysicsDemo
ld: warning: directory not found for option '-L/usr/lib64'
ld: library not found for -lbullet
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [Bin/Debug/Helium.app/Contents/MacOS/Helium-Runtime-ExampleMain_PhysicsDemo] Error 1
make: *** [Helium-Runtime-ExampleMain_PhysicsDemo] Error 2

FBX SDKのところが消えて、bulletとかいうのが出てきた。

bullet入ってんのに見つからないらしい。
だめだ、Macの方は深みにハマりそう。
windowsでやろう。

じゃあ、歴史とかに戻ります。

History

Nocturnal

Helium は “Insomniac Games' Nocturnal Initiative” から直接生まれた。

Nocturnal Initiativeは、Geoff Evans、Andy Burke、Mike Actonによって、ソースコードの共有と実績のあるゲーム開発テクニックを通じて、実績のあるゲーム開発技術をコミュニティと共有する手段として作成されました。 GDCサンフランシスコ2008で発表されました。Nocturnalで共有されているすべてのソースコードは、実証済みのライブラリ(およびライブラリをサポートする2つのユーティリティ)でした。 Insomniacを離れた後、Geoff Evans、Andy Burke、Rachel Mark、Paul Haileは、以前にNocturnal Initiativeからリリースされたコードを繰り返し盗みました。 Insomniacを出発した直後に、チームはWhiteMoon Dreams、Inc.に加わりました

Lunar

WhiteMoon Dreamsは、独自の次世代内部ゲームエンジンLunarを開発していました。 Lunarは主に、Liquid Entertainment社の元技術エンジニアであるTed Cipicchioによって書かれました。 Lunarは、基本的なプラットフォームの抽象化、資産ツリー、FBX SDKを介したコンテンツ処理、エンティティシステム、ジョブ管理に主に焦点を当て、(Direct3D 9実装を含む)グラフィックスのためのうまく設計されたプラットフォーム抽象化を含みました。 WhiteMoonに参加した直後に、NocturnalのツールがLunarとよく噛み合って、Helium Projectが生まれたことが明らかになりました。

Helium

WhiteMoon DreamsのLunarに対する寛大なサポートは、技術の独立した開発のために新しい名前を必要としました。ヘリウムは、夜行性とルナールの両方から区別されるプロジェクトとして生まれました。 2010年の夏と秋にかけて、ヘリウムのリファクタリングと改善が行われ、ユニコードのサポートが向上し、エディタのUIコンポーネントが改善され、クロスプラットフォームのサポートが改善されました。すぐにWhiteMoonは会社としての目標の乱れを起こし、チームの多くは他の機会に移った。

次の年(現在まで)、ヘリウムはGeoff Evans、Philip Degarmo、Matt Stineによって開発され続けています。彼らは空いた時間にC ++ Reflectionシステム(Nocturnalから)をLunar Assetパイプラインに統合することに成功しました。真のクロスプラットフォームグラフィックスのサポートのためにOpenGLの実装が進行中です。グラフィックスとは別に、プロジェクト全体は、LinuxMacOSX、およびWindows上で均等に立っています。

(by Google翻訳)

いやー、Google翻訳進化したね(笑)

感想ですけど、めちゃ面白いっすね

Geoff Evans、Andy Burke、Mike Acton が Nocturnalっていうゲームエンジンを作った。 で、そのグループの何人かが抜けて、WhiteMoonに加入したと。で、WhiteMoonでLunarっていうエンジン作ってる人がいて、で、LunarとNocturnalの相性がいいって分かって、合体したのがHeliumだと。

次、構成見ます

Code Organization

ヘリウムモジュールはコア、ツール、ランタイムの3つのカテゴリに分類。

  • ツールモジュール

  • ランタイムモジュール

    • コンソールディスクにバンドル or アプリストア経由で配布するため のゲームエンジンの資産パイプラインフリービルド

Libraries

ヘリウムはたくさんのモジュールで構成されてる。

  • Core

    • Platform - プラットフォーム固有な機能を抽象化
    • Foundation - プラットフォームに依存しないコード
    • Reflect - C++リフレクションの強力な実装
      • リフレクションってのは、プログラムの実行過程でプログラムの構造を読み取ったり書き換えること。
        c,c++コンパイラ言語だから、標準では用意されてないけど、それを実現するやつっぽい。
    • Persist - Reflectを使ってオブジェクトを持続させる?
    • Inspect - Reflectを使ってオブジェクトプロパティUIの生成
    • Application - ワークステーションアプリ用のユーティリティlib
    • Math/MathSimd - 数学ユーティリティコード、C++simdの最適化
  • Engine: Tools + Runtime

    • Engine/EngineJobs
      • ベースアセットパイプラインの実装。アセットタイプは下位プロジェクト
      • キャッシュベースアセットローディング(製品のシッピングに使われたり、デバイスに埋め込まれることを想定,開発中じゃない)
      • ジョブ(ほとんど使わない、タスクと混同しない)
    • Framework/FrameworkImpl
      • Component system
      • World and Entity classes
      • Task system
  • Components/Middleware Integrations
    • Bullet - Bullet物理エンジン
    • OIS - OIS 入力システム
    • Rendering, RenderingD3D9, RenderingGL - Rendering 抽象レイヤー と D3D9実装
    • Graphics, GraphicsJobs, GraphicsTypes
      • 俺らのパイプラインのほとんどがここに実装されてる。 (textures, shaders, etc.)
      • ハイレベルレンダリング(レンダリングプロジェクトのトップに座ってる)
    • Windowing - ウィンドウをつくって描画できる
    • ExampleGame - 現在作成中、これは現在開発中のエグザンプルのためのサンドボックスである。
    • FrameworkWin - PC上で動かすためにエンジンをセットアップする実装クラス。もっと多くのプラットフォームが必要だから。

Applications

  • Game
    • 完全に処理されたゲームデータをロードする最終的なゲームを実行するためのApp(現在はExampleGame / ExampleMainを参照)
  • Editor
    • Editorは、ユーザ向けのコンテンツ作成アプリであるwxWidgetsアプリケーションです。すべてのwxWidgets依存コードはEditorプロジェクトに限定されています。QtやプラットフォームロックされたUIアプリケーション(iPadAndroidなど)を構築したい場合は、可能な限りコアロジックをライブラリに組み込んでいます。
      • 検査 - エディタにReflectionを統合
      • エディタ - エディタ
      • エディタサポート - TOOLSビルドでは、ここのクラスのほとんどがrawコンテンツ(.fbxファイルなど)を処理し、実行時に使用するためにそれらをキャッシュするために登録されています
      • エディタシーン - シーン管理のための古いロジック。これは多くの場合、コンポーネントワークフローに合わせてカットされているか、少なくとも大きく変更されている可能性があります
      • Application - わかりませんが、これはすべてのツールが望む準低レベルのユーティリティ(PERFORCEチェックアウトの起動やファイルの変更のためのディスクの監視など)
      • PreprocessingPc - これはおそらくEditorSupportに移されるべきです

Game Modules

  • 注:デモ固有のコードはExampleGameプロジェクトにあります
  • ExampleMain_PhysicsDemo - bulletの統合とレンダリングをデモンストレーションするために、いくつかの箱と球をplaneにドロップする
  • ExampleMain_ShapeShooter - あなたが何かをクリックする(作業中である)ことによって撃つことができるプレイヤー制御アバターのデモ
  • TestApp - テスト中にコード用のスクラッチパッド。重要じゃない。
  • EmptyGame and EmptyMain - Helium上にbuildingし始めるなら、最も早いのがこれらのプロジェクトをコピーする(あるいは、必要に応じて使う)。これにより、ゲームプレイシステムの起動と実行が可能になり、独自のコンポーネント、タスク、アートアセットを追加する準備が整う。


まぁ、ちょいちょい意味不明な箇所がありますけど、なんとなくわかった。

さっきの続きで、ビルドチャレンジ

で、windowsの方で、

git submodule update --init --recursive

この、コマンドの履歴が無いことに気づいた(汗)

で、そのあとに、premakeして〜、って思ったら、さらにやばいことに気づいた。
もともと、下のコマンドがマニュアルにあって、で、パッと見でなぜか、 上でやってることと下でやってることが一緒だと早とちりして下だけ実行してた(笑)
よく見ると、、、、よく見ないでもソリューションファイルの名前が違うことがわかる。

cd Dependencies
..\premake vs2015
start Dependencies.sln

cd ..
premake vs2015
start Helium.sln

このコマンドの実行にはVSの開発者コマンドプロンプトで行う必要があるらしい。
で、上から順番に実行していくと、、、おおお、成功したっぽい。 で、2つのソリューションそれぞれビルドすると、、、成功!
しかしまだ、安心できない。ランタイムエラーが出ないことを願って、 実行すると、、、、

はい、

ランタイムエラぁぁぁぁぁーーーーーー、dllまじかいーーー ランタイムエラー1 ランタイムエラー1

とりあえず、ビルド成功まで成功したから、後で調べます。

Macに戻ります。で、もう一度最初からやります(笑)

$ git clone git clone https://github.com/HeliumProject/Helium.git
$ git submodule update --init --recursive
$ cd Dependencies
$ ../premake.sh gmake

で、やはり、これでました。

checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether clang accepts -g... yes
checking for clang option to accept ISO C89... none needed
checking whether we are using the Intel C compiler... no
checking how to run the C preprocessor... clang -E
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking whether clang needs -traditional... no
checking whether we are using the GNU C++ compiler... yes
checking whether clang++ accepts -g... yes
checking whether we are using the Intel C++ compiler... no
checking whether we are using the Metrowerks C++ compiler... no
checking whether we are using the IBM xlC C++ compiler... no
checking for ar... ar
checking for SDK directory /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.plat
form/Developer/SDKs/MacOSX10.11.sdk... configure: error: in `/Users/名前/Desktop/Heliu
m-Engine/Helium-master_git/Helium/Dependencies/wxWidgets/macbuild-debug-unicode-64':
configure: error: not found
See `config.log' for more details
$

先ほどは、git submodule もう一回やっただできたと思ってたけど、気のせいだったようです。
で、ネットで調べると似たようなエラーを発見
clangのバージョンとかが関わってそうだ。
とりあえず、最新のバージョンにアップデートするためにxcodeをアップデート、をするために、OSを El Capitan から macOS Sierraにアップデート

するとwxWidgetsのqt/qtkitがいないって言われる。 調べるとsierraからqtkitを扱わないようになったらしく。 調べると、QuickTimerをAVFoundation Frameworkで置き換えてって言ってる。
で、エラーのでてたファイルだけ入れ替えはやっぱりダメで、wxWidgets丸ごと入れ替えました。

そしたら、

$ cd Dependencies
$ ../premake.sh gmake

は成功した。
で、

$ cd ..
$ ./premake gmake

も成功したが、 make -j8でこんなエラー

Platform/ProcessPosix.cpp:105:58: error: 'syscall' is deprecated: first deprecated in macOS 10.12
      - syscall(2) is unsupported; please switch to a supported interface. For SYS_kdebug_trace
      use kdebug_signpost(). [-Werror,-Wdeprecated-declarations]
        result << GetProcessName() << "_" << getpid() << "_" << syscall(SYS_gettid);
                                                                ^
/usr/include/unistd.h:733:6: note: 'syscall' has been explicitly marked deprecated here
int      syscall(int, ...);
         ^
1 error generated.
make[1]: *** [Build/x64/Debug/Helium-Runtime-Platform/ProcessPosix.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [Helium-Runtime-Platform] Error 2

中国語のサイトに同じようなエラーがあった。MacOS SDK10.11をぶち込めって感じかな。 ここからダウンロードして

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/

にぶち込む。 しかし、変わらない。再起動しても変わらない。

うーん、詰んだか?

いやいや、まだ早い。大体いつもこういうのあったら、 HDバックアップとって、真っ新なPCでやる。これで成功した試しが結構ある。

リカバリーーーー

よしゃ、やるぞ。Xcodeのバージョンを8.0から、8.2.1にアップデートして

$ git clone git clone https://github.com/HeliumProject/Helium.git
$ git submodule update --init --recursive
$ cd Dependencies
$ ../premake.sh gmake
checking for ar... ar
checking for SDK directory /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk... configure: error: in `/Users/kinoshita/Desktop/workspace/Helium/Dependencies/wxWidgets/macbuild-debug-unicode-64':
configure: error: not found
See `config.log' for more details
kk-no-MacBook-Air:Dependencies kinoshita$

で、10.11のSDK入れてもう一回やってみると、、、

なんと成功!さらに, make -j8も成功

そして、

cd ..
./premake.sh gmake

成功

make -j8

ここで、

==== Building Helium-Runtime-ExampleMain_PhysicsDemo (debug_x64) ====
Creating Build/x64/Debug/Helium-Runtime-ExampleMain_PhysicsDemo
ExampleMainPch.cpp
ExampleMainWin.cpp
Linking Helium-Runtime-ExampleMain_PhysicsDemo
ld: warning: directory not found for option '-L/usr/lib64'
ld: warning: directory not found for option '-L/Applications/Autodesk/FBX SDK/2016.1.2/lib/clang/debug'
ld: library not found for -lfbxsdk
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [Bin/Debug/Helium.app/Contents/MacOS/Helium-Runtime-ExampleMain_PhysicsDemo] Error 1
make: *** [Helium-Runtime-ExampleMain_PhysicsDemo] Error 2

はい、めっちゃ見たことアルーーーーーーーー

とりあえず、FBX SDK入れてもう一回する。 一応もう一回premake

で、make -j8

これで、嫌な結果はbulletがないって言われるやつ(笑)

でも、あれ、、、、いけた?

Linking Helium-Tools-Editor
ld: warning: directory not found for option '-L/usr/lib64'

最後にこんなワー二ングは出てたけど、エラーは出なかったぞ?

./Binが生成されて、中に実行ファイルできてる。
ランタイムエラー1

残念ながら、どれも破損してるか不完全とかで実行できませんでした。

一旦ギブアップ

よくよく考えて見れば、一年近くコミットされてないプロジェクトってだけで無理があったか

まぁやってみないと分からないからね。最初は、最悪自分でソースコード編集してビルドができなくてもいいかなって思ってたけど、途中で、どうせなら自分で編集したのを動かせるプロジェクトで勉強したいって思った。

やっぱり、Unreal Engine4でやろうかな。コミットもかなりActiveだし。
あと、Atomic Game Engine も気になってる。コミットもActive。

今回はこんなところです。人に見せれるようなものじゃない雑な記事になりましたが(笑)

英語の情報をインプットする抵抗が無くなりつつある

やっぱり、水泳でいう潜水のようなトライアンドエラー作業は楽しい!