Unreal Engine 4 でC++メインで開発するために

コンパイルシステム

モジュール

ビルド単位を分割して管理しています. 1システム=1モジュールぐらいの粒度で理解しておくと, ビルドシステムが意図していることとの差異もなさそうです. モジュール単位で, サブシステムや機能の可視性を管理できます.

Unity

モジュール単位で, 全ての実装ファイルをひとつにまとめてビルドする機能です. 古代のコンパイラだとコンパイル単位を超えた最適化は許されないので, それなりに意味はありそうです.

ディレクトリ構造

ビルドシステムと深く結び付いているため非常に重要です. モジュールの場合で説明します.

基本は次のようなツリーを最初に作成するといいです.

Module Root
  Classes
  Private
  Public

それぞれの機能は, 次のようになります. 機能と言っているのは, このように配置しないと容易にリンクエラーになるなど, ビルドシステムに強く結び付いているためです(大事なことなので). ClassesPublicの違いはわかりません(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:真面目に追う).