## 테크 아티스트를 위한 언리얼 엔진 자동화 성능 테스트 가이드
**발표자:** Matt Ostile (테크 아티스트)
---
### 🌟 **시작하기 전에**
* **휴대폰 매너:** 휴대폰은 **무음**으로 설정해 주세요.
* **자료 공유:** 슬라이드 사진 촬영은 필요 없습니다. 발표 후 **QR 코드**를 통해 링크트리와 EDC 아티클로 연결되며, 해당 아티클에서 자세한 내용을 확인하고 숙지할 수 있습니다.
* **설문 참여:** Cvent 앱에서 **설문 조사**를 작성해 주시기 바랍니다. 여러분의 피드백은 매년 쇼를 더욱 개선하는 데 큰 도움이 됩니다.
---
### 🚀 **본격적인 이야기**
이 발표는 언리얼 엔진의 **자동화된 성능 테스트 진입 장벽을 낮추기 위한 노력**에 대한 내용입니다. 많은 에픽게임즈 동료들의 도움으로 이를 실현하고자 합니다.
---
### 💡 **성능, 그것은 곧 기능이다**
* 성능은 **프로덕션 후반부에 남겨둘 수 있는 요소가 아닙니다.** UI, VFX, 오디오와 마찬가지로 처음부터 고려해야 합니다.
* **측정하지 않으면 알 수 없습니다.** 성능이 얼마나 좋거나 나쁜지 알 수 없으면 개선할 수 없습니다.
* **프로파일링 우선:** 최적화할 부분을 정확히 파악하기 위해 **먼저 프로파일링**해야 합니다.
---
### 📈 **성능 테스트의 중요성**
* **조기 테스트:** 게임 개발 과정에서 변경 사항이 발생하므로 **일찍 테스트**하여 문제를 조기에 발견해야 합니다.
* **잦은 테스트:** 월간, 마일스톤, 분기별 테스트로는 부족합니다. **매일** 성능을 점검해야 합니다.
* *잦은 테스트 시:* 회귀(regression)를 빠르게 감지하고 수정하여 성능을 원상 복구할 수 있습니다.
* *후반부 테스트 시:* 수정해야 할 범위가 넓어지고, 많은 요소를 포기하거나 변경해야 할 수 있습니다. 이는 **시간과 비용 낭비**로 이어집니다.
* **일관된 테스트:** 변경 사항이 실제로 성능 향상을 가져왔는지 **재현 가능한 방법**으로 테스트해야 합니다.
* **실기기 테스트:** 특정 플랫폼 및 하드웨어 개발 시, **항상 동일한 실기기에서 테스트**하여 결과의 일관성을 확보해야 합니다.
* *예시:* PC 게임 개발 시, 개발 머신이 아닌 **최소/권장 사양 PC**에서 테스트하는 것이 좋습니다.
---
### 💰 **성능 예산 설정**
* 단순히 "16ms 달성"을 넘어, **특정 기능(모션 블러, TSR, 나나이트, 루멘 등)을 켜고도 16ms를 달성**하는 것을 목표로 해야 합니다.
* 이는 프로덕션 프로세스의 일부가 되어야 합니다.
* **초기 단계에서 모든 기능을 켜고** 시각적인 결과와 성능 수치를 확인하여 가장 중요한 요소에 대한 예산을 설정해야 합니다.
* *예시:* 트랜슬루선시(translucency) 예산을 1ms로 설정하고, 이를 초과할 경우 최적화합니다.
---
### 🗣️ **성능을 '기능'으로 만드는 방법**
* 프로듀서와 같은 언어로 접근할 수 있습니다.
* **사용자 스토리 활용:** "플레이어로서 이 기능을 60fps로 즐기고 싶다."
* **수락 기준 추가:** "이 기능은 재미있어야 하며, GPU 사용량이 1ms를 초과해서는 안 된다."
* 이렇게 하면 **Jira 티켓이 수락 기준을 모두 충족할 때까지 닫히지 않습니다.**
---
### ❓ **자동화 성능 테스트의 문제점**
* **테크 아티스트의 역할:** 많은 경우 성능 문제는 테크 아티스트에게 돌아옵니다.
* **자동화 현황:**
* 자동화된 성능 테스트를 이미 수행 중인 개발자는 **매우 적습니다.**
* 수동으로 테스트하는 경우도 상당수 존재합니다.
* 전혀 테스트하지 않는 경우도 많습니다.
* **자동화의 복잡성:**
* 빌드 생성
* 기기에 빌드 설치
* 기기에서 테스트 실행
* 결과 수집
* 결과 처리
* 결과 공유
* 이 모든 과정을 **빌드 머신에서 수행**해야 합니다.
---
### 🛠️ **에픽의 자동화 도구 및 시스템**
* **빌드 생성:** **Build Graph** (XML 기반 스크립트 빌드 자동화 시스템)
* **기기 설치 및 테스트 실행:** **Unreal Automation Tool (UAT)** 및 **Gauntlet** (UE 프로젝트 세션 실행 및 테스트, 결과 검증 프레임워크)
* Gauntlet Test Controller (C++): 런타임 기능 테스트, 특히 네트워킹 관련 자동화 작업 실행
* **결과 수집:** **Gauntlet** (CSV 프로파일러, Unreal Insights 결과 처리)
* **빌드 머신:** **Horde** (JSON 기반 잡 템플릿)
**문제점:** 이러한 시스템은 **C++ 또는 C# 전문 지식을 요구**하며, 이는 일반적인 테크 아티스트의 기술 스택과 다릅니다.
---
### 🗺️ **자동화 테스트 여정: 과거부터 현재까지**
#### **1. 완전 수동 프로세스 (생산 현장에서 사용)**
* **8 AM:** QA 팀이 마지막으로 안정적인 빌드를 다운로드하여 로컬 개발 키트에 배포.
* **각 맵/카메라별:** 콘솔 명령어로 특정 위치로 이동하여 GPU 타이밍 기록 후 스프레드시트에 작성.
* **최종 스프레드시트:** 이해 관계자에게 이메일로 공유.
* **10 AM:** 테크 아티스트가 이메일을 확인하고 회귀 지점 파악, 안정적인 빌드 다운로드 및 배포.
* **이후:** 회귀 조사, 점심 식사, 해결 방안 모색.
**점수:** 빌드 생성 (부분 인정), 기기 설치/테스트 실행/결과 수집/처리/공유 (수동). 빌드 머신 자동화 없음.
#### **2. 블루프린트를 활용한 개선 (2020년, Quixel 특별 프로젝트)**
* **카메라 액터 태그:** `perf camera`로 태그된 카메라 액터 배치.
* **각 카메라별:** `Set View Target with Blend`를 사용하여 이동.
* **Unreal Insights:** 블루프린트 노드로 트레이스 재개 및 일시 중지.
* **결과 분석:** Unreal Insights 인터페이스에서 각 청크(카메라별)의 평균 GPU 타이밍 확인 및 스프레드시트에 기록.
**점수:** 빌드 생성/기기 설치 (수동), 기기 테스트 실행 (부분 자동화), 결과 수집 (수동), 결과 처리 (스프레드시트), 공유 (수동). 빌드 머신 자동화 없음.
#### **3. 명령줄 및 리전 활용 (UE5 업그레이드 시)**
* **게임 모드와 함께 맵 열기:** 명령줄에서 특정 게임 모드로 프로젝트 실행 가능.
* **Unreal Insights 리전:** 여러 프레임에 걸쳐 임의의 이벤트를 표시.
* 콘솔 명령, C++ 매크로, 블루프린트 노드로 시작/종료 가능.
* 트레이스 분석 시 가시성 향상.
* **Unreal Insights CLI:** 명령줄에서 타이머 통계 내보내기 가능.
* CSV 형식으로 결과 추출.
* Python으로 결과 처리 자동화 가능.
**점수:** 빌드 생성/기기 설치 (수동), 테스트 실행 (빠른 자동화), 결과 수집 (수동), 결과 처리 (자동화), 공유 (Google Sheets). 빌드 머신 자동화 없음.
---
### ✨ **새로운 프레임워크: 'The Epic Way'**
* **문제:** 기존 방법은 복잡하고, 코드 복사/붙여넣기 및 이름 바꾸기 등의 번거로움이 많았습니다.
* **목표:** **"빌드 머신 보일러플레이트 스크립트"**를 넘어, 통합된 프레임워크 구축.
* **핵심:** 빌드 생성부터 결과 공유까지 **일관된 계약(contract)**을 정의합니다.
* **기능:**
* 빌드 생성
* 빌드 기기 배포
* 기기에서 테스트 실행
* 기기에서 결과 수집
* 결과 일부 처리 (공유 가능한 형태로)
* **모든 과정을 빌드 머신에서 수행** (Horde 또는 기타 빌드 머신)
* **현재 상태:**
* **5.6 버전에서 실험적으로 사용 가능**, 5.7에서 개선 예정.
* **실험적(Experimental)** 단계이므로 API 변경 가능성 있음.
* **빌드 머신에서 작동**하도록 설계됨.
* **UE 5.5 버전에서 코드 존재**, 5.6부터 사용 권장.
---
### 💻 **프레임워크 구성 요소**
1. **Build Graph:** 빌드 설정 자동화.
2. **Gauntlet & Gauntlet Test Controllers:** 테스트 실행 및 결과 수집.
* **Test Controllers:** 데이터 수집 조건을 정의합니다.
* **Static Camera:** 고정된 카메라 위치에서 GPU 성능 측정 (GPU 성능 측정에 유리).
* **Sequencer:** 시퀀스 재생 (환경 GPU 성능 측정에 유리).
* **Replay Runs:** 네트워크 트래픽 녹화 및 재생 (멀티플레이어 게임 플레이 경험 측정에 유리).
* **Fullscreen Material Test:** 재질의 렌더링 시간 측정.
* **Map Sequence Combo:** 여러 맵에서 동일 시퀀스 또는 동일 맵에서 다른 시퀀스 실행 설정.
3. **Project Launcher (5.6+):** 에디터 내에서 테스트 실행 가능.
4. **PerfReport Tool:** CSV 결과 분석 및 요약 HTML 보고서 생성.
---
### 🚀 **실행 방법**
* **UAT 명령줄:** `runuat.bat automated-perf-test add-automated-perf-test-project -project="Path/To/Your/Project"`
* 플러그인 활성화, 빌드 그래프, Gauntlet 설정 XML, 로컬 실행용 배치/쉘 스크립트 생성.
* **로컬 실행:** 생성된 배치 파일(`run_local_tests.bat`) 실행.
* **Horde 실행:** Horde 잡 템플릿 생성 (선택 사항).
* **Project Launcher (5.7+):** 에디터 내에서 'Tools' -> 'New Project Launcher'를 통해 테스트 실행 프로파일 생성 및 실행.
---
### 📊 **주요 측정 지표 (Metrics)**
* **Miss Vsync Percent:** 타겟 프레임률을 놓친 비율.
* **Dynamic Resolution Percentage:** (지원 플랫폼) 릴리스 환경과 유사하며, 프레임 비용을 나타내는 지표.
* **Hitches per Minute:** 1분당 발생하는 급격한 성능 저하 횟수.
* **Timer Averages (ms):** `stat unit` 등에서 나오는 밀리초 단위 평균 시간.
---
### 🏆 **자동화 성능 테스트 점수표**
* **빌드 생성:** O
* **기기 배포:** O
* **기기 테스트 실행:** O
* **결과 수집:** O
* **결과 처리:** O
* **결과 공유:** O (생성된 보고서)
* **빌드 머신 실행:** O (Horde 연동 시)
---
### 📢 **피드백 요청**
* **지금 바로 사용해 보세요!**
* **여러분의 피드백이 중요합니다.** 언리얼 엔진 자동화 성능 테스트 프레임워크에 필요한 기능에 대해 알려주세요.
* **문의 방법:** 발표 후 직접 문의, 블루스카이(Bluesky), 또는 편지를 이용해 주세요.
* **목표:** 더 많은 사람들이 쉽게 성능 테스트를 수행할 수 있도록 만들어, 개발 과정 전반에 걸쳐 성능을 관리하고 출시 직전의 스트레스를 줄이는 것입니다.