Unreal Engine은 높은 품질의 그래픽을 비교적 적은 설정만으로 구현할 수 있도록 다양한 렌더링 기능을 제공한다. 동적 그림자, 반사, 안티앨리어싱, 후처리, 간접광, 대기 표현과 같은 일반적인 기능부터 Unreal Engine 5에서 추가된 Nanite와 Lumen 같은 고급 렌더링 기능까지 폭넓게 지원한다.
개발자는 이러한 기능을 활용하여 다양한 장르의 게임을 높은 시각적 품질로 비교적 쉽게 제작할 수 있다.
하지만 이러한 범용성은 Unreal Engine의 강점인 동시에, 프로젝트에 따라서는 불필요한 복잡성을 증가시키고 전체적인 렌더링 비용을 높이는 원인이 될 수 있다. 엔진은 특정 장르나 플랫폼만을 대상으로 설계된 것이 아니라, 다양한 환경과 요구사항에 대응할 수 있도록 구성되어 있기 때문이다.
그 예로 별다른 기능을 추가하지 않은 빈 레벨에서도 화면 하나를 출력하기 위해 수많은 렌더 패스와 리소스 전환이 발생한다. 단순한 오브젝트 하나만 배치하더라도 깊이 버퍼 생성, 가시성 판정, 베이스 패스, 라이팅, 포스트 프로세싱, UI 합성 등 여러 단계가 순차적으로 수행된다.


실제로 현재 제작하고 있는 2D 기반 프로젝트를 Unreal Insights로 프로파일링해 보면, 화면 구성에 비해 상당히 많은 GPU 작업이 수행되는 것을 확인할 수 있다. 시각적으로는 단순한 장면처럼 보이지만 내부적으로는 여러 렌더 패스와 후처리 작업이 함께 실행되고 있다.
이러한 작업들이 모두 현재 프로젝트에 반드시 필요한 것은 아니다. 어떤 렌더 패스가 기본적으로 수행되고 있는지, 각 패스가 어떤 역할을 담당하는지 이해하지 못하면 불필요한 렌더링 비용을 구분하거나 최적화하기 어렵다.
따라서 이번 시리즈에서는 Unreal Engine의 렌더링 파이프라인을 직접 캡처하고 분석하면서, 하나의 프레임이 어떤 과정을 거쳐 최종 화면으로 출력되는지 살펴본다. 또한 각 렌더 패스의 역할과 생성되는 리소스를 확인하고, 프로젝트에서 실제로 필요한 작업과 제거하거나 단순화할 수 있는 작업을 구분하는 것을 목표로 한다.
Unreal Engine에서는 렌더링 성능을 분석하기 위한 여러 프로파일링 도구를 제공한다.
각 도구마다 보여주는 정보의 범위와 분석 깊이가 다르기 때문에, 하나의 도구만 사용하기보다 문제의 범위를 좁혀가며 단계적으로 사용하는 것이 좋다.
주로 사용되는 방식은 다음과 같다.
Stat GPU는 현재 프레임에서 수행되는 주요 GPU 작업과 각 작업에 소요된 시간을 화면에 표시하는 명령어이다.
Light, Shadow Depths, Lighting, Translucency, Post Processing과 같은 주요 렌더링 항목의 비용을 빠르고 간단하게 확인할 수 있다.

사용법은 콘솔창을 열고 다음 명령어를 입력하면 된다.
Stat GPU
Stat GPU는 실시간으로 갱신되므로 특정 장면에서 어떤 렌더링 작업의 비용이 높은지 빠르게 파악할 때 유용하다.
다만 세부적인 Draw Call이나 리소스의 상태까지는 볼 수 없어 어떤 항목이 문제인지 대략적인 범위를 찾는 용도로 사용하는 것이 좋다.
Profile GPU는 특정 프레임의 GPU 작업을 캡처하고, 렌더 패스별 실행 시간을 계층 구조로 보여주는 기능이다.
Stat GPU보다 더 세부적인 GPU 이벤트와 하위 패스를 확인할 수 있다.

사용법은 콘솔창을 열고 다음 명령어를 입력하면 된다.
ProfileGPU
Profile GPU는 단일 프레임을 기준으로 분석하기 때문에 순간적으로 발생한 성능 저하를 지속적으로 추적하기에는 한계가 있다. 하지만 특정 장면에서 어떤 렌더 패스가 병목인지 확인하거나, 엔진 렌더링 코드의 시작 지점을 찾을 때 유용하다.
또한 이러한 장면을 추적하기 위한 캡처 디버그 치트 로직을 만들어두면 테스트할 때 용이하다.
Unreal Insights는 Unreal Engine에서 발생하는 CPU, GPU, 메모리, 로딩, 네트워크 등의 실행 정보를 시간의 흐름에 따라 기록하고 분석하는 도구이다. 하나의 프레임만 보여주는 Profile GPU와 달리, 여러 프레임에서 발생한 성능 변화와 순간적인 프레임 드롭을 추적할 수 있다.
가장 많은 프로파링일 기능을 제공하는 도구이기도 하다.

Unreal Insights를 실행한 뒤 Trace를 시작하고 게임을 플레이하면 실행 중 발생한 이벤트가 기록된다.
기록을 종료한 후 생성된 Trace 세션을 열면 Game Thread, Render Thread, RHI Thread 등의 CPU 작업과 GPU 작업을 하나의 타임라인에서 비교할 수 있다.

Timing Insights에서는 특정 프레임을 확대하여 CPU와 GPU가 각각 어떤 작업을 수행했는지 확인할 수 있다.
이를 통해 긴 시간 동안 발생하는 성능 변화와 간헐적인 Hitch를 찾는 데 적합하다.
반면 개별 Draw Call에 연결된 셰이더, 텍스처, 버퍼와 같은 그래픽스 파이프라인 상태는 자세히 보여주지 않는다.
RenderDoc은 실행 중인 애플리케이션의 단일 프레임을 캡처하여 그래픽스 API 명령을 분석할 수 있는 프레임 디버거이다. Unreal Engine 내부에서 추상화된 렌더 패스뿐만 아니라 실제 GPU에 전달된 Draw, Dispatch, Copy 등의 명령을 확인할 수 있다.
Unreal Engine에서는 RenderDoc 플러그인을 활성화하여 에디터와 연동할 수 있다.
RenderDoc을 설치하지 않았다면, 아래 링크를 통해 설치를 한 후에 이용이 가능하다.
RenderDoc Downloads

플러그인을 활성화한 뒤, 프로젝트 세팅 - 플러그인 - RenderDoc - 스타트업 시 자동 어태치 설정을 체크하면 RenderDoc의 캡처 기능을 이용할 수 있다.
혹은 실행 구성에서 -AttachRenderDoc 명령줄을 붙이고 엔진을 실행하면 된다.

그럼 이제 에디터에서 RenderDoc Capture를 사용할 수 있는 아이콘이 표시된다.

분석할 장면을 실행한 뒤 RenderDoc의 Capture Frame 기능을 사용하면 현재 프레임이 캡처되고 RenderDoc에서 결과를 열 수 있다.

또는 RenderDoc을 독립적으로 실행한 뒤 Unreal Editor나 패키징된 게임 실행 파일을 지정하여 실행할 수도 있다. Unreal Engine 플러그인을 사용하지 않더라도 RenderDoc에서 직접 실행 파일을 연결하여 프레임을 캡처할 수 있다.
RenderDoc에서 프레임을 열면 Event Browser를 통해 해당 프레임에서 실행된 그래픽스 명령을 순서대로 확인할 수 있다. 특정 Draw Call을 선택하면 다음과 같은 정보를 분석할 수 있다.
| 도구 | 분석 단위 | 주요 확인 정보 | 장점 | 한계 | 주요 용도 |
|---|---|---|---|---|---|
| Stat GPU | 실시간 프레임 | 주요 렌더링 항목별 GPU 소요 시간 | 콘솔 명령어만으로 빠르게 확인할 수 있으며 실시간으로 갱신된다. | 세부 Draw Call이나 리소스 상태는 확인하기 어렵다. | 성능 비용이 높은 렌더링 항목을 빠르게 탐색할 때 사용한다. |
| Profile GPU | 단일 프레임 | 렌더 패스와 하위 GPU 이벤트별 실행 시간 | GPU 작업을 계층 구조로 확인할 수 있어 병목 렌더 패스를 찾기 쉽다. | 여러 프레임에서 반복되거나 순간적으로 발생하는 문제를 추적하기 어렵다. | 특정 장면에서 비용이 높은 렌더 패스를 분석할 때 사용한다. |
| Unreal Insights | 일정 시간 동안의 다중 프레임 | Game Thread, Render Thread, RHI Thread, GPU, 메모리, 로딩, 네트워크 작업 | CPU와 GPU 작업을 하나의 타임라인에서 비교할 수 있으며 간헐적인 Hitch를 추적하기 좋다. | 개별 Draw Call의 셰이더, 텍스처, 버퍼와 같은 그래픽스 상태는 자세히 확인하기 어렵다. | 장시간의 성능 변화와 프레임 드롭의 원인을 분석할 때 사용한다. |
| RenderDoc | 단일 프레임 | Draw, Dispatch, Copy 명령과 셰이더, 버퍼, 텍스처, 렌더 타깃 등의 파이프라인 상태 | 실제 그래픽스 API 수준의 명령과 리소스를 자세히 추적할 수 있다. | 캡처 결과가 복잡하며 전체적인 성능 흐름을 파악하기에는 적합하지 않다. | 특정 렌더 패스의 내부 동작과 Draw Call 단위의 렌더링 과정을 분석할 때 사용한다. |
각 도구는 서로 대체하는 관계라기보다 분석 범위를 점차 좁혀가는 과정에서 함께 사용되는 관계이다.
일반적으로 Stat GPU를 이용하여 비용이 높은 항목을 빠르게 찾고, Profile GPU로 해당 항목의 세부 렌더 패스를 확인한다. 여러 프레임에서 발생하는 성능 변화는 Unreal Insights로 추적하며, 특정 프레임의 실제 Draw Call과 그래픽스 리소스는 RenderDoc으로 분석한다.