KoreanFoodie's Study

[언리얼] 언리얼 인사이트 : 언리얼 최적화 프로파일링 본문

Game Dev/Unreal C++ : Dev Log

[언리얼] 언리얼 인사이트 : 언리얼 최적화 프로파일링

GoldGiver 2023. 5. 12. 19:26

언리얼 인사이트

핵심 :

1. 언리얼 인사이트는 최적화를 위해 프로파일링을 쉽게 도와주는 유용한 툴이다.
2. 게임 쓰레드, 렌더 쓰레드 등 어디에서 병목 현상이 일어나는지를 파악하자
3. 모바일 기기로도 utrace 를 내보내어 분석을 할 수 있다!

 

언리얼 인사이트라는 툴을 통해 언리얼 최적화 및 프로파일링을 한 번 해 보자!

 

(만약 소스빌드에서 시작할 경우, UnrealInsight 모듈을 빌드하면 UnrealInsights.exe 파일이 생긴다. UnrealInsights-Win64-DebugGame 라는 이름일 수도 있음 😅)

애플리케이션을 실행하면 Trace Sessions(트레이스 세션) (1), Trace Store Directory(트레이스 스토어 디렉터리) (2) 제어, New Connection(새 연결) (3) 메뉴가 표시됨

트레이스 세션에는 사전 녹화된 세션 목록이 표시됨. 별 건 아니고... 2번의 디렉토리에 가보면 실제로 .utrace 파일이 있는데,

 

얘를 1번에 드래그 앤 드롭하면 분석을 시작할 수 있다.

라이브로 돌리고 있는 트레이스도 1 번 목록에 실시간으로 반영되며, File Size 가 바뀌는 것을 확인할 수 있다(Status 가 Live 임).

3번 메뉴는 사용자가 진행 중인 세션 IP 를 입력하여 프로파일링을 하는 기능이지만, 4.27 기준 개발 중이라, -tracehost=%ADDRESS% 명령줄 옵션을 사용하는 것이 권장된다.

 

이제 더블 클릭을 해서 utrace 를 열거나 오른쪽 하단 드롭다운 메뉴의 Open 이용해서 분석을 시작하자...

 

타이밍 인사이트 창에는 Frames(프레임) 패널 (1), Timing(타이밍) 패널 (2), Log(로그) 패널 (3), Timers and Counters(타이머 및 카운터) 탭 (4), Callers and Callees(호출자 및 피호출자) 패널 (5)이 포함됨

위와 같은 화면이 나올 것이다. 위의 화면을 보고 처음엔 어지러울 수 있는데... 매크로들을 잘 써서 필요한 정보를 잘 뽑아내자. 언리얼 인사이트 레퍼런스 문서를 참고해야 한다.

타이밍 인사이트 창의 핵심 기능은 단일 프레임 또는 기간을 선택하면 타이밍 패널을 하이라이트 및 확대하고 타이머 탭과 통계 카운터 탭의 데이터를 종합하여 해당 시간 동안 수집된 퍼포먼스 정보를 표시하는 것이다.

이를 위해서는 프레임 패널의 단일 프레임을 클릭하거나 타임 룰러(Time Ruler) 라 불리는 타이밍 패널 상단에서 스크럽 바 섹션을 클릭 및 드래그하면 된다! 

이제 각각의 패널에 대해 간략히 알아보자 😅

 

프레임 패널

프레임 패널은 프레임에 소요되는 총 시간을 바 그래프 형식으로 보여준다.

이 패널은 특정 레벨이 로드되었을 때의 프레임 속도 저하, 최적화되지 않은 씬의 표시, 개별 프레임이 느린 이유(예: 다수의 액터가 한꺼번에 스폰) 식별 등 일반적인 트렌드를 파악할 때 유용하다. 더 긴 막대는 더 긴 프레임을 나타내므로 이벤트가 발생하는 정확한 순간을 집어내고 데이터를 검토하여 어떤 작업이 원인인지 찾아내기가 쉽다.

커서를 막대 위로 가져가면 프레임의 인덱스와 실행 시간이 표시되는데, 막대를 클릭하면 해당 프레임의 데이터를 타이밍 패널, 타이머 탭, 통계 카운터 탭에 표시할 수 있다.

오.. 이거 진짜로 긴 바를 누르면, 확확 바뀌는게 아주 기분이 좋다 😆 뭔가 분석하고 있다는 느낌... 🤣

 

타이밍 패널 

(1) 타이밍 패널에서 타이머 이벤트에 마우스를 가져가면 나타나는 툴팁. (2) 같은 스레드에 배치된 이벤트 스택

프레임 패널은 세션 도중에 실행된 모든 타이머 이벤트에 대한 각 인스턴스를 시각적으로 보여준다.

전체 프레임의 개요를 보여주는 프레임 패널과 달리 타이밍 패널은 개별 트레이스 이벤트를 보여주고 시간 측정을 마이크로초의 정확도로 제공한다.

이 이벤트는 세로로 스택되어 범위를 나타내며 별도의 트랙을 사용하여 여러 스레드의 활동을 표시한다. 트랙 디스플레이 내에서 이벤트는 스레드로 생성되며 세로로 나뉘어 범위를 표시하고 시작 및 종료 시간에 따라 가로로 배치된다.

패널 왼쪽 상단 구석의 트랙(Tracks) 드롭다운 메뉴에서 연관된 스레드 그룹을 켜거나 끌 수 있다!

마우스 커서를 트랙의 블록으로 가져가면 해당 타이머 이벤트에 대한 정보가 나타나며, 이것을 클릭하면 타이머 탭에서 해당 이벤트의 위치가 표시되고 선택된다.

타이밍 패널로 작업할 때는 특정 시간 범위로 데이터를 모으는 것이 좋다. 마우스 포인터를 타임 룰러에서 클릭 및 드래그하여 검토하고자 하는 기간을 선택해 보자.

유사한 타이밍 이벤트는 하이라이트하고 나머지 모든 타이밍 이벤트는 흐린 색으로 표시한 모습.

또 다른 방법은 프레임 패널에서 프레임을 클릭하는 것이다. 이렇게 하면 선택된 시간 범위가 상단에 표시되는 전체 길이와 함께 파란색 오버레이로 나타나며, 타이머 탭과 카운터 탭은 이 시간 범위 내에 해당되는 데이터만 보여준다. F 키를 눌러서 선택된 시간 범위로 직접 확대하거나 패닝할 수 있다. F 키는... Expand 버튼 정도로 생각하면 될 것 같다 😄

 

타이머 탭

타이머 이름으로 그룹화된 타이머 탭 데이터

타이머 탭에는 타이머 패널에 선택된 녀석들이나 범위 내의 이벤트들이 나열된다.

 

카운터 탭

플랫으로 그룹화된 카운터 탭 데이터

카운터를 더블 클릭하면, 카운터에 대한 그래프 시리즈를 더할 때 그래프 트랙 시각화를 활성화할 수 있다!

 

STAT_PageAllocatorTree 그래프 트랙

 

 

로그 패널

로그 패널은 UE4 세션의 모든 로그(UE_LOG 호출로 생성)를 표시한다.

로그는 에디터 내의 출력 로그 창과 마찬가지로 길이와 카테고리로 걸러낼 수 있다. 또한 입력하는 텍스트와 일치하지 않는 모든 로그 메시지를 걸러내는 검색 박스도 제공된다. 필터 기능뿐 아니라, 행을 클릭하면 타임 패널이 해당 행의 텍스트가 로깅된 시간으로 패닝된다.

타이밍 패널에서 기간을 선택하면 해당 기간에 속하는 모든 로그 항목이 파란색으로 하이라이트된다. 반대로 한 항목을 선택하고 Shift 클릭으로 다른 항목을 선택하여 여러 로그 항목을 선택할 경우 타이밍 패널은 두 항목 간의 시간 범위를 하이라이트한다.

 

에셋 로딩 인사이트 창

에셋 로딩 퍼포먼스를 분석하기 위해 언리얼 인사이트 툴은 에셋 로딩 인사이트 창을 제공한다. 이 창에는 에셋 로딩과 관련된 이벤트에 초점을 맞추도록 환경설정된 타이밍 인사이트 보기의 특수 버전 타이밍 패널이 포함된다.

에셋 로딩 인사이트 창은 에셋 로딩과 관련된 퍼포먼스에 초점을 맞춘다. 여기에 나타난 세션은 '-loadtimetrace' 명령줄 옵션으로 녹화됨!

 

 

프로젝트 출력 커스터마이징하기

엔진이나 플러그인, 프로젝트 소스 코드를 약간 변경하면 특정 언리얼 인사이트 기능을 활성화 또는 비활성화할 수 있다. 커스텀 로깅도 추가할 수 있다.

 

로깅 활성화 또는 비활성화하기

어떤 영역이 로깅 데이터를 전송할지 제어하거나 전체 시스템을 비활성화하려면 엔진의 소스 코드를 편집하고 특정 매크로의 값을 변경하면 된다.

이 매크로는 엔진 전반에 분포되어 있으며, 보통 관련 기능의 헤더 파일 또는 모듈에서 찾을 수 있다. 이 매크로는 로깅이 켜진 영역에서는 '1' 값을, 꺼진 영역에서는 '0' 값을 사용하지만 항상 매크로가 빌드의 컨텍스트 내에서 적절한지를 우선 판정하는 조건문 내에서 정의된다. LOGTRACE_ENABLED`는 로그 메시지 트레이싱을 제어하는 매크로이다. Engine/Source/Runtime/Core/Public/Logging/LogTrace.h` 내의 다음 조건문을 확인해 보자!

#if !IS_PROGRAM && !UE_BUILD_SHIPPING && (PLATFORM_WINDOWS || PLATFORM_PS4 || PLATFORM_XBOXONE)
#define LOGTRACE_ENABLED 1
#else
#define LOGTRACE_ENABLED 0
#endif

LOGTRACE_ENABLED`는 언리얼 인사이트 시스템으로 로그를 보내는 것이 적합한 빌드인 경우 기본으로 '1'로 정의된다. 비활성화하려면 위 코드 둘째 줄을 바꿔서 LOGTRACE_ENABLED`를 '1' 이 아닌 '0'으로 정의하면 된다.

 

 

플랫폼 디테일

언리얼 인사이트를 사용하면 Android, PC 등 일부 플랫폼에서 트레이스 데이터를 수집할 수 있다.

 

Android

Android Debug Bridge(adb)를 사용하면 Android 툴이 TCP 트래픽을 USB 케이블로 리디렉션할 수 있다. 런타임 애플리케이션을 Android 디바이스에서 연결하려면 우선 adb가 USB로 디바이스에 생성된 TCP 연결을 통과하도 설정하면 된다.

// 언리얼 인사이트는 TCP 포트 1980을 수신함
adb.exe reverse tcp:1980 tcp:1980

 

파일

트레이스는 '-tracefile=PATH' 명령줄 실행인자를 사용하여 파일을 출력할 수 있다. `PATH`의 값은 PC, Android 등 트레이스되는 플랫폼에 따라 다르다.

 

PC

-tracefile=d:/foo/bar.utrace

 

Android

-tracefile=/sdcard/UE4Game/foobar.utrace

 

사용자 지정 경로도 작동하지만, '/sdcard/' 경로는 Android OS 버전과 디바이스 제조사에 따라 다를 수 있다!

 

참고 : 언리얼 공식 문서
Comments