그동안 많은 게임 개발사에게 GPU 분석 및 성능 측정은 내부 아키텍처를 정확히 들여다보기 힘든 블랙박스 영역과 같았다. CPU 타임라인과 달리 GPU의 동작은 수면 아래서 움직였고, GPU 크래시가 발생하더라도 CPU에 리포트가 도달하기까지 최대 2초의 시차가 발생해 정확한 원인 파악이 극도로 까다로웠기 때문이다.

에픽게임즈 코리아의 박창현 디벨로퍼 릴레이션 리드는 '최신 언리얼 엔진의 GPU 프로파일링과 크래시 디버깅' 세션을 통해 이러한 까다로운 실무적 한계를 극복할 수 있는 구체적인 방법론을 공유했다. 언리얼 엔진의 최신 개선 사항부터 강력해진 프로파일링 도구 활용법, 실제 크래시 디버깅 사례에 이르기까지 프로그래머들을 위한 명확한 디버깅 파이프라인이 제시되었다.

강연의 첫 포문은 렌더 하드웨어 인터페이스(RHI)의 구조적 개선이 열었다. RHI는 렌더러와 플랫폼 API(D3D12, Vulkan, Metal 등)를 연결하는 교량 역할을 한다. 개발자는 언리얼 렌더러 코드를 한 번만 작성하면 RHI가 각 플랫폼에 맞춰 자동으로 변환해 준다.

이번 최신 언리얼 엔진 변경 사항의 핵심은 'RHI Breadcrumbs(빵 부스러기)'의 통합이다. Breadcrumbs 시스템은 렌더링 특정 시점마다 마커를 남겨 디버깅 시 길을 잃지 않도록 돕는 역할을 한다. 기존에는 여러 도구마다 데이터 스트림이 파편화되어 있었으나, 최신 엔진에서는 Stat GPU, ProfileGPU, Unreal Insights가 단일 데이터 스트림으로 통일되었다. 이를 통해 렌더 스레드, 포어그라운드 워커, GPU 프로파일링 간의 가독성이 획기적으로 높아졌다.

또한, RHI 제출(Submission) 파이프라인의 변경도 강조되었다. 기존 구조에서는 하나의 스레드가 변환(Translate), 제출(Submit), 동기화(Sync) 역할을 모두 담당하여 심각한 병목 현상이 발생했다. 특히 큐(Queue) 간 동기화를 위해 사용하는 펜스(Fence) 과정에서 한 큐가 다른 큐의 신호를 무한히 기다리는 '대기 상태(Wait Bubble)'가 잦았다.
이를 해결하기 위해 최신 언리얼 엔진(UE 5.6 기반 구조 등)에서는 각 역할을 완전히 분리했다. 여러 워커 스레드에서 RHI 커맨드를 병렬로 변환(Translate)하고, 전용 스레드가 GPU 큐에 빠르게 커맨드를 제출(Submit)하며, GPU 완료 신호를 인터럽트로 즉시 수신(Sync)하는 구조로 개선되어 CPU 병목 현상을 대폭 해소했다.
박창현 리드는 언리얼 엔진이 제공하는 3대 프로파일링 툴의 향상된 기능과 실무 팁을 소개했다.

Stat GPU은 멀티 큐 및 멀티 GPU를 인지하도록 개선되었다. Compute/Copy 큐가 별도 테이블로 분리되었으며, 현재 상태가 셰이더를 구동 중인 'Busy', 다른 GPU 큐를 기다리는 'Wait', 작업을 완료한 'Idle'인지 명확히 표기된다.
ProfileGPU 역시 마찬가지로 멀티 큐를 지원하며, RDG(RenderGraph) 개별 패스 이름을 직접 확인할 수 있고 결과 필터링 기능이 추가되었다.

언리얼 인사이트(Unreal Insights)는 GPU 타이밍 시각화가 대폭 강화되었다. GPU와 CPU 작업을 동일한 타임라인상에 시각화하며, GPU 큐당 하나의 행으로 표기된다. 특히 '펜스 화살표' 기능이 추가되어 어떤 큐가 누구를 대기시키고 있는지 한눈에 파악할 수 있다.
박 리드는 프로파일링 팁으로 'Single-thread Translate 병목'을 주의하라고 당부했다. 엔진 내부에서 immediate Command List를 직접적으로 사용하면 다중 병렬 변환이 불가능해져 RHI 스레드 하나에 작업이 집중된다. 이 경우 타임라인 상에 거대한 '버블(유휴 시간)'이 발생하므로 사용을 최소화해야 한다고 조언했다.

강연의 하이라이트는 원인 불명의 GPU 크래시(Device Removed 등)를 추적하는 디버깅 전략이었다. GPU는 CPU와 달리 수많은 스레드가 동시에 병렬 실행되므로 크래시 유발 지점을 찾기가 매우 어렵다. 박 리드는 주로 무한 루프나 무거운 셰이더로 인해 OS가 프로세스를 강제 종료하는 TDR(Timeout) 현상과 유효하지 않은 메모리 주소에 접근하는 Page Fault가 주 원인이라고 짚었다.

디버깅을 위해 최우선으로 그래픽 드라이버 최신화, 백그라운드 무거운 프로세스 종료 등 기본 점검(Sanity Check)을 마친 후, 엔진 실행 플래그(-gpucrashdebugging 또는 -gpubreadcrumb)를 활성화해 범위를 좁혀야 한다. 만약 멀티스레드 타이밍 이슈가 의심된다면 -onethread, RDG 병렬 스케줄링이 의심되면 -rdgimmediate, D3D 에러나 배리어(Barrier)가 의심된다면 -d3ddebug 플래그를 하나씩 추가하며 재현 조건을 단순화하는 교차 검증 전략이 권장되었다.
강연에서는 Breadcrumbs과 벤더 툴 등 최신 도구들을 활용한 구체적인 3가지 크래시 분석 사례가 공유되기도 했다.

박 리드는 "Finished 노드의 함정에 빠지지 말라"고 강조했다. 특정 하드웨어에서는 패스가 끝났다고 표기되어도 내부 메모리 해제가 지연될 수 있으므로, Breadcrumbs로 대략적인 범위를 좁힌 뒤 벤더사 정밀 툴을 병행하여 텍스처 자체가 유효한지 역추적해야 한다고 설명했다. 해당 건은 텍스처 동기화 규칙을 수정하여 해결되었다.
마지막으로 박창현 리드는 실제 라이브 서비스 중 대량으로 발생하는 GPU 크래시를 효율적으로 관리하기 위한 자동화 노하우를 공개했다.

수많은 유저로부터 들어오는 로그를 일일이 분석하는 것은 불가능에 가깝다. 이에 에픽게임즈 코리아 기술지원 팀은 백엔드 스크립트를 통해 Breadcrumbs 트리를 자동 분석하는 시스템을 제안했다. 의미 없는 완료(Finished) 노드는 자동으로 스크립트가 걸러내고, 실제 크래시 당시 작동 중이던 핵심 'Active 콜스택'만 필터링하는 방식이다.
특히 유저 데이터 정규화 과정이 핵심으로 꼽혔다. 로그 내에 포함된 메모리 주소나 오브젝트 ID 같은 모든 숫자를 'x' 문자로 치환한 뒤 해시(Hash) 값을 생성하면, 동일한 원인의 크래시가 수천 개의 개별 티켓으로 분산되는 대참사를 방지하고 Jira 티켓으로 그룹화하여 자동 생성할 수 있다.
박창현 리드는 "최신 언리얼 엔진의 통합 마커 시스템과 병렬 RHI 파이프라인은 GPU 분석의 강력한 근간이 된다"라며, "모든 도구가 같은 데이터를 참조하고, 크래시 시 렌더 스택이 보존되며, 펜스 버블과 Device Removed를 즉시 감지할 수 있게 된 만큼, 개발자분들이 이 투트랙 전략(Breadcrumbs 시스템+벤더사 제공 툴)을 적극 활용해 디버깅 스트레스를 덜어내시길 바란다"고 강연을 마쳤다.
[김규리 기자 gamemkt@chosun.com] [gamechosun.co.kr]
ⓒ기사의 저작권은 게임조선에 있습니다. 허락없이 무단으로 기사 내용 전제 및 다운로드 링크배포를 금지합니다.

몬길:스타다이브 

