Unreal Engine 4 でC++メインで開発するために
コンパイルシステム
モジュール
ビルド単位を分割して管理しています. 1システム=1モジュールぐらいの粒度で理解しておくと, ビルドシステムが意図していることとの差異もなさそうです. モジュール単位で, サブシステムや機能の可視性を管理できます.
Unity
モジュール単位で, 全ての実装ファイルをひとつにまとめてビルドする機能です. 古代のコンパイラだとコンパイル単位を超えた最適化は許されないので, それなりに意味はありそうです.
ディレクトリ構造
ビルドシステムと深く結び付いているため非常に重要です. モジュールの場合で説明します.
基本は次のようなツリーを最初に作成するといいです.
Module Root
Classes
Private
Public
それぞれの機能は, 次のようになります. 機能と言っているのは, このように配置しないと容易にリンクエラーになるなど, ビルドシステムに強く結び付いているためです(大事なことなので).
ClassesとPublicの違いはわかりません(TODO:調べろ).
| Name | Description |
|---|---|
| Classes | 公開するクラス, 機能が入ったヘッダファイル |
| Private | 公開しないクラス, 機能の入ったヘッダファイル, 全ての実装ファイル |
| Public | 公開するクラス, 機能が入ったヘッダファイル |
言語機能
名前空間
Unity ビルドがあるため, 無名名前空間は厳禁です.
標準ライブラリ
メモリ管理
メモリ管理の最下層はFMemory::Malloc/Freeで, アルゴリズムはGenericPlatformMemory.hで定義される次のいずれかになります.
(GenericPlatformMemory.hから引用)
| Name | Description |
|---|---|
| Ansi | Default C allocator |
| Stomp | Allocator to check for memory stomping |
| TBB | Thread Building Blocks malloc |
| Jemalloc | Linux/FreeBSD malloc |
| Binned | Older binned malloc |
| Binned2 | Newer binned malloc |
| Binned3 | Newer VM-based binned malloc, 64 bit only |
| Platform | Custom platform specific allocator |
| Mimalloc | Microsoft’s malloc |
標準ライブラリのmalloc/freeを使用すると管理情報が別になる可能性があるため, FMemoryだけを使うようにします.
string.h, memory.hにあるプリミティブなメモリ操作系もFMemory経由で使用します.
new/deleteはoverride箇所を見つけられませんでしたが, 観測した範囲ではFMemory::Malloc/Freeを通っています.
(私のような)他人を信じない方は, プロジェクト固有のラッパーを作成した方がいいと思います.
文字列
FString/FName/FTextの違いは次のようです.
| Name | Description |
|---|---|
| FString | ソフトウェア内で使う文字列 |
| FName | システム内のIDとして使うimmutableな文字列 |
| FText | UI等でユーザに表示・編集される文字列 |
最下層はFStringに行きつきます(TODO:真面目に追う). さらにFStringはTArrayを使っているため, Small String(Size) Optimizationがありません. コピー発生には十分に気を付ける必要があります.
多言語対応は, 基本的にはMicrosoftのTCHARを参考にしたシステムになっているようです. 文字列リテラルはTEXTで囲むなどです(TODO:一覧でまとめる).
全てwchar_tになるわけではなく, 例えばAndroidではchar16_tになります. 内部文字コードはUTF-16と考えられます(TODO:真面目に追う).