PaperSloth’s diary

主にゲーム開発関連についての記事を書きます。

UE4 無駄なTickを省く方法

環境

・Unreal Engine4.20.3

Tickが動作しているActor一覧の確認

Console Commandの「dumpticks」でTickが動作しているActorやComponentの一覧が取得できます。
するとOutput Logに一覧が表示されます。
しかし、これだと通常のログと混ざって少し見にくいため、私はSession Frontendを使用しています。
f:id:PaperSloth:20181031225051p:plain

Session FrontEndはWindow -> Developer Tools -> Session Frontendから開けます。

試しにThirdPersonTemplate(Blueprint)で動作を試してみます。
画像が見にくいですが、概ね見るとすれば赤枠で囲った範囲かと思います。
f:id:PaperSloth:20181031225629p:plain

この中でも特にHUDを使用している人は少ないと思いますので、無駄にTickを走らせていることが分かります。

Tickを止める方法

①Blueprintの場合

Actor(例えばHUDやCharacterの場合)は
Actor Tickというカテゴリの中にStart with Tick Enabledというフラグがあるため
これをオフにすることで無効にできます。
f:id:PaperSloth:20181031225919p:plain

同様にComponentの場合も
Component Tickというカテゴリの中にStart with Tick Enabledというフラグがあるため
これをオフにすることで無効にできます。
f:id:PaperSloth:20181031230429p:plain

C++の場合

今回はActorを継承して新規作成したクラスを例に見てみます。


さて、このActorのctor内で

PrimaryActorTick.bCanEverTick = true;

とあるので、これをfalseにするだけでこのActorのTickを無効にすることができます。

AExampleTickActor::AExampleTickActor()
{
    PrimaryActorTick.bCanEverTick = false;
}

しかし、これには少し罠があります。
このActorを継承したBlueprintを作成しTickノードに何か処理を繋ぐとC++側もBlueprint側もTickが動いてしまいます。
ただし、Tickがゴーストノードの場合はTickが動くことはありません。

とはいえこんな不安な状態のまま開発を行いたくはありません。
その場合は、先程Blueprintで変更したのと同じStartWithTickEnabledをC++側からfalseにしてやりましょう。

AExampleTickActor::AExampleTickActor()
{
    PrimaryActorTick.bCanEverTick = false;
    // BlueprintでActorTickカテゴリにあるフラグ
    PrimaryActorTick.bStartWithTickEnabled = false;
}

これでこのActorのTickをしっかりと止めることができました。

追記

PrimaryActorTick.bCanEverTickのフラグですがAActorクラス内ではfalseになっています。
そのため、EmptyActorをLevelに配置した場合や
Actorを継承したBlueprintでもTickがゴーストノードの場合や削除されている場合はTickが呼び出されません。
明示的に呼び出しを無効化したい場合はStart With Tick Enabledをfalseにすることをオススメします。