PaperSloth’s diary

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

UE4 C++でfpsを取得する方法について

この記事は「Unreal Engine 4 (UE4) Advent Calendar 2018」16日目の記事です。
Unreal Engine 4 (UE4) Advent Calendar 2018 - Qiita

環境

UE4.20.3

FPSの取得、あるいは計算方法

UE4fpsの計算でググると真っ先に出てくるのが
Tick内で1.0f / DeltaTimeで計算する方法。
Blueprintからも計算できてお手軽。
あとはこれをログに吐くなり、Widgetで表示するなりして使う。

void AExampleActor::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
    float fps = 1.0f / DeltaTime;
    // ログ表示とかとか
}

fpsを単純に表示したい場合はConsole Commandから"stat fps"で表示ができる。
基本的にデバッグで使いたいというだけの場合はこちらを使うだろう。

しかし、stat fpsではできないことが2つある。
①Shippingでビルドした場合に確認できない(Shippingではコンソールコマンドを受け付けないため)
②Game内のUIでfpsの表示機能が作成できない
 PCゲームではfpsを表示するオプションがあったりする
 
fpsを計算したり、stat fpsで表示してみて気になるのは
Tickでの計算値とstat fpsで表示されるfpsの値に違いがある点。
これは計算方法が違うため結果が異なる。
f:id:PaperSloth:20181210145352p:plain

そこで、今回はこのstat fpsで表示される値の取得方法について紹介する。

そもそもエンジン側でfpsの値を保持しているで自分でわざわざ計算する必要もない。

stat fpsで表示される値

UnrealEngine.cpp内にstat fpsで表示されるfpsの定義がある。

ENGINE_API float GAverageFPS = 0.0f;

名前からも分かるようにこの値はグルーバル変数として定義されている。
この値はUnrealEngine.hのCalculateFPSTimings()内で計算されている。

C++側でのfpsの取得について

実際に使用する際はBlueprintFunctionLibraryにでもまとめてしまうと良いだろう。

#include "Engine.h"

float UExampleFunctionLibrary::GetAverageFps()
{
    extern ENGINE_API float GAverageFPS;
    return GAverageFPS;
}


また、stat fpsでは処理に何ms時間がかかったかも表示している。
こちらもグローバル変数で公開されているので取得することができる。

float UExampleFunctionLibrary::GetAverageMs()
{
    extern ENGINE_API float GAverageMS;
    return GAverageMS;
}

30fpsのゲームなら33.33ms
60fpsのゲームなら16.66ms
120fpsのゲームなら8.33ms

この時間内に処理を終える必要がある。


Widgetを作成し、fps, msを表示してみた結果が下記になる。
stat fpsで表示されている値と一致していることが分かる。
f:id:PaperSloth:20181210150145p:plain

この方法で取得した値であればShippingビルドでも使用することができる。