Helium ゲームエンジン
チワーッス
主にUE4関係のことを記事にしていこうと思ってるのですが、今回は関係ないです。
あと、自分でプログラムとか動かしながら同時進行でブログ書いていくので、かなり雑でまとまりのない記事になるかと思いますが御容赦下さい。
FC2ブログから引っ越してきた理由は、標準でMarkdownサポートしているからです。 FC2でマークダウンやろうとするとソースコード載せる時とか結構めんどくさいんすよね。
で、本題です。
ゲームエンジンってめっちゃクールだよね!
ありとあらゆる技術と芸術の融合体であるゲームを作り上げるゲームエンジンですが、そんなゲームエンジンがどうやって作られているのかずっと前から知りたくて、ちょこちょこゲームエンジンアーキテクチャについて書かれてる本とか読んだりしてるわけですが、、、
ロクに大規模なアプリケーション作ったことない人間としては、 もちろん構成のイメージすら浮かばないわけで、、、
で、一つのゲームエンジンをガッツリ見ていこうかなと思ってます。 お気に入りのUnreal Engineのソースコードで勉強するのもいいと思うんですけど、 初めは、Heliumエンジンっていうのを見ていこうかなと思います。 理由は、オープンソースっていうことと、スライドシェアのあるスライド を見て、「ゲームエンジンを学習するには良いコード」って書かれていたっていうことと、名前がカッコいい、それだけです。
Heliumエンジンで作られた有名なゲームに、
「ラチェット&クランク」とかあります。
それじゃあ、勉強していきます。
まず、初めにですね、日本語の情報サイトは皆無でした。
まぁ、これはHeliumエンジンに限らず、ゲームエンジンのソースをレビューする人なんて
ほとんどいないでしょっていう。
英語のサイトだったら少しあるっぽいですけど、 とりあえずGitHubのREADME.mdさらっと読みます(英語読めないけど)。
以下mdの簡単な訳とコメント
Github
Heliumは十分な機能を有するオープンソースゲームエンジンを目指す。
馴染みのあるDCCのUIと使いやすいデザインを活用。
FBXのような実績のある製造を使ってるコンテンツをインポート?
Documentation
Introduction
- 歴史
- アーキテクチャ
- 構成
System
- アセットローダー
- コンポーネント
(このあたりは大事そうなのでまた後で)
Resources
Building
ヘリウムはpramake5を使ってビルドされる。Premakeはluaスクリプトをインタープリットして、 特定のプラットフォームのIDEプロジェクトファイルを生成する。
(premakeとかcmakeとか知れた。IDEのプロジェクトファイル作れるの強い)
Prerequisites(事前にいるもの)
All Platforms
- FBX SDK
- XCode Command Line Tools
- GCC6
Compile
まず初めに、俺らのソースツリーをgitから引っ張ってこい。 そして、
git submodule update --init --recursive
コマンドにより、 全てのサブモジュールを取れることを確かめろ。 次に、premakeを使って、プロジェクトファイルを生成しろ。 premakeの適切なビルドはリポジトリーに含まれてる。 windows上なら、visualstudioのプロジェクトを生成する。 OSXとLINUX上なら、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に問題がありそう。
でも、Windows10って元からDirectX入ってるんじゃなかったっけ?
調べたら、DirectX SDKはVS2012以降?ならWindowsSDKに統合されてるっぽくて、じゃあなんだろって思ってさらに調べると Windows10 SDK っていうのがあり、そいつインストールしたらできました。win10アプリ開発には Windows 10 SDK がいるってことかな。
エラーすごい出てるけど、まぁ、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の実装が進行中です。グラフィックスとは別に、プロジェクト全体は、Linux、MacOSX、およびWindows上で均等に立っています。
(by Google翻訳)
いやー、Google翻訳進化したね(笑)
感想ですけど、めちゃ面白いっすね
Geoff Evans、Andy Burke、Mike Acton が Nocturnalっていうゲームエンジンを作った。 で、そのグループの何人かが抜けて、WhiteMoonに加入したと。で、WhiteMoonでLunarっていうエンジン作ってる人がいて、で、LunarとNocturnalの相性がいいって分かって、合体したのがHeliumだと。
次、構成見ます
Code Organization
ヘリウムモジュールはコア、ツール、ランタイムの3つのカテゴリに分類。
ツールモジュール
- コンテンツ作成のためのエディタとコマンドライン
ランタイムモジュール
- コンソールディスクにバンドル or アプリストア経由で配布するため のゲームエンジンの資産パイプラインフリービルド
Libraries
ヘリウムはたくさんのモジュールで構成されてる。
Core
Engine: Tools + Runtime
- Engine/EngineJobs
- ベースアセットパイプラインの実装。アセットタイプは下位プロジェクト
- キャッシュベースアセットローディング(製品のシッピングに使われたり、デバイスに埋め込まれることを想定,開発中じゃない)
- ジョブ(ほとんど使わない、タスクと混同しない)
- Framework/FrameworkImpl
- Component system
- World and Entity classes
- Task system
- Engine/EngineJobs
- Components/Middleware Integrations
Applications
- Game
- 完全に処理されたゲームデータをロードする最終的なゲームを実行するためのApp(現在はExampleGame / ExampleMainを参照)
- Editor
- Editorは、ユーザ向けのコンテンツ作成アプリであるwxWidgetsアプリケーションです。すべてのwxWidgets依存コードはEditorプロジェクトに限定されています。QtやプラットフォームロックされたUIアプリケーション(iPad、Androidなど)を構築したい場合は、可能な限りコアロジックをライブラリに組み込んでいます。
- 検査 - エディタにReflectionを統合
- エディタ - エディタ
- エディタサポート - TOOLSビルドでは、ここのクラスのほとんどがrawコンテンツ(.fbxファイルなど)を処理し、実行時に使用するためにそれらをキャッシュするために登録されています
- エディタシーン - シーン管理のための古いロジック。これは多くの場合、コンポーネントワークフローに合わせてカットされているか、少なくとも大きく変更されている可能性があります
- Application - わかりませんが、これはすべてのツールが望む準低レベルのユーティリティ(PERFORCEチェックアウトの起動やファイルの変更のためのディスクの監視など)
- PreprocessingPc - これはおそらくEditorSupportに移されるべきです
- Editorは、ユーザ向けのコンテンツ作成アプリであるwxWidgetsアプリケーションです。すべてのwxWidgets依存コードはEditorプロジェクトに限定されています。QtやプラットフォームロックされたUIアプリケーション(iPad、Androidなど)を構築したい場合は、可能な限りコアロジックをライブラリに組み込んでいます。
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まじかいーーー
とりあえず、ビルド成功まで成功したから、後で調べます。
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が生成されて、中に実行ファイルできてる。
残念ながら、どれも破損してるか不完全とかで実行できませんでした。
一旦ギブアップ
よくよく考えて見れば、一年近くコミットされてないプロジェクトってだけで無理があったか
まぁやってみないと分からないからね。最初は、最悪自分でソースコード編集してビルドができなくてもいいかなって思ってたけど、途中で、どうせなら自分で編集したのを動かせるプロジェクトで勉強したいって思った。
やっぱり、Unreal Engine4でやろうかな。コミットもかなりActiveだし。
あと、Atomic Game Engine も気になってる。コミットもActive。