언리얼 스크립트 프로파일링

언리얼 스크립트의 함수호출 프로파일링에 대해 다룬다.

클래스

스크립트 프로파일링은 FScriptCallGraph 클래스에 의해 수행된다.

UnStack.h
struct FScriptCallGraph
{
    ...
 
    void Reset( DWORD InSoftMemoryLimit = 0 );           // 수집된 정보를 리셋하고 다시 수집한다.
    void Serialize( FArchive& Ar );                      // 수집된 정보를 파일로 저장
    void Tick( FLOAT DeltaTime );                        // 틱
 
    ...
 
    TArray<PTRINT>    Data;                              // 스크립트 함수 호출에 대한 정보를 담을 배열
};

정보 수집

이 클래스는 처음엔 인스턴스를 생성하지 않다가 인게임에서 특정 커맨드를 입력하면 인스턴스가 생성되고 프로파일링을 시작한다.

UnGame.cpp
void UGameEngine::Tick( FLOAT DeltaSeconds )
{
    ...
 
    if ( GScriptCallGraph )
    {
        GScriptCallGraph->Tick( DeltaSeconds );   // 인스턴스가 있다면 정보를 수집한다.
    }
 
    ...
}

위에서 언급한 특정 커맨드는 아래와 같다. 틸트(`) sk 탭(TAB) 을 누르고 아래 커맨드를 입력한다.

  • PROFILESCRIPT START : 프로파일링 시작
  • PROFILESCRIPT STOP : 프로파일링 종료
  • PROFILESCRIPT RESET : 기존 정보를 버리고 다시 프로파일링

위 커맨드를 수행하는 코드는 아래와 같다.

UnObj.cpp
UBOOL UObject::StaticExec( const TCHAR* Cmd, FOutputDevice& Ar )
{
    ...
 
    else if (
        ParseCommand( &Str, TEXT("PROFILESCRIPT") ) ||        // PROFILESCRIPT 나
        ParseCommand( &Str, TEXT("SCRIPTPROFILER") ) )        // SCRIPTPROFILER 커맨드를 입력하고
    {
        if ( ParseCommand( &Str, TEXT("START") ) )            // 파라메터가 START 라면
        {
            ... // GScriptCallGraph 인스턴스 생성
        }
        else if ( ParseCommand( &Str, TEXT("STOP") ) )        // 파라메터가 STOP 라면
        {
            ... // GScriptCallGraph 인스턴스 소멸
        }
        else if ( ParseCommand( &Str, TEXT("RESET") ) )       // 파라메터가 RESET 이라면
        {
            ... // 리셋
        }
    }
 
    ...
}

프로파일링 정보 확인

프로파일링을 하면 [ProjectName]\Profiling\Script\[MapName]-PC-[날짜]-[시간]\ 디렉토리 하위에 .uprof 파일이 생성된다.

이 파일은 스크립트 함수 호출에 대한 프로파일링 정보를 담고 있다.

Binaries\ueScriptProfiler.exe 를 실행하여 이 파일을 열고 각종 정보를 조회할 수 있다. 자세한 사항은 여기서 확인

참조