Categories: Uncategorized

언리얼엔진 프레임이 떨어질 때 stat unit 부터 켜는 이유, Game·Draw·GPU 숫자 읽는 법 (UE 5.8 기준)

씬이 무거워져서 프레임이 30 아래로 떨어지면 대부분 먼저 그래픽 옵션부터 낮춰 봅니다. 그림자 품질을 내리고, 루멘을 끄고, 해상도를 줄입니다. 그런데 이렇게 해도 프레임이 거의 그대로인 경우가 있습니다. 원인이 GPU가 아니라 블루프린트 로직이나 드로우콜처럼 CPU 쪽에 있었기 때문입니다.

그래서 성능을 손대기 전에 "어디가 막혀 있는지"를 먼저 확인해야 합니다. 이 판단에 가장 빠르게 쓰는 명령이 stat unit 입니다. 이 글은 Epic 공식 문서(5.8판)의 설명을 기준으로, 숫자를 어떻게 읽고 그다음 무엇을 켜야 하는지 순서대로 정리했습니다.

stat unit 이 보여주는 숫자와 뜻

GPT이미지 · 설명용 생성 장면이며 실제 언리얼 화면이나 성능 측정 결과가 아닙니다.
AI 생성 개념 이미지이며 실제 화면이나 현장 사진이 아닙니다. 도식의 수치는 설명용 예시이며 실측 결과가 아닙니다.

콘솔(~ 키)을 열고 아래를 입력합니다.

stat unit

화면 오른쪽에 밀리초(ms) 단위 숫자가 나타납니다. 공식 문서 기준으로 각 항목의 뜻은 이렇습니다.

항목 의미 이 값이 Frame 과 비슷하면
Frame 한 프레임을 만드는 데 걸린 전체 시간 기준값
Game 게임 스레드 시간(게임 로직, 블루프린트, 애니메이션 갱신 등) 게임 스레드 병목 가능성
Draw 렌더 스레드 시간(무엇을 그릴지 준비해 GPU에 넘기는 작업) 렌더 스레드 병목 가능성
GPU 그래픽카드가 장면을 그리는 데 걸린 시간 GPU 병목 가능성
RHIT RHI 스레드 시간. 보통 프레임에 동기화되어 Frame 과 비슷하게 나옴 단독 판단 기준으로 쓰지 않음
DynRes 동적 해상도가 켜져 있을 때 기본·보조 화면 비율(Primary·Secondary Screen Percentage) 해상도가 자동으로 깎이고 있는지 확인

핵심은 Frame 과 가장 가까운 값을 찾는 것입니다. 문서도 "Frame 시간이 Game 시간에 가까우면 게임 스레드가, Draw 시간에 가까우면 렌더 스레드가 병목일 가능성이 크다"고 설명합니다. 세 스레드는 동시에 돌아가기 때문에 가장 느린 하나가 전체 프레임 시간을 결정합니다. 가장 느린 쪽을 줄이지 않으면 다른 쪽을 아무리 줄여도 프레임은 거의 오르지 않는 이유가 여기에 있습니다.

참고로 목표 프레임을 ms 로 바꾸면 판단이 쉬워집니다. 60fps 는 약 16.7ms, 30fps 는 약 33.3ms 입니다. Frame 이 25ms 라면 60fps 목표까지 약 8ms 를 줄여야 한다는 뜻입니다.

측정 전에 맞춰야 할 조건

GPT이미지 · 설명용 생성 장면이며 실제 언리얼 화면이나 성능 측정 결과가 아닙니다.
AI 생성 개념 이미지이며 실제 화면이나 현장 사진이 아닙니다. 도식의 수치는 설명용 예시이며 실측 결과가 아닙니다.

숫자가 믿을 만하려면 측정 환경부터 정리해야 합니다.

  1. 디버그 빌드가 아닌 환경에서 잽니다. 공식 문서도 "디버그가 아닌 빌드로 게임을 실행해" 병목을 판단하라고 안내합니다. 에디터 뷰포트에서 잰 값에는 에디터 자체의 부담이 섞이므로, 가능하면 Standalone Game 이나 Development 패키지로 확인합니다.
  2. 수직동기화(VSync)나 프레임 제한이 걸려 있으면 Frame 이 16.7ms 같은 값에 붙어서 실제 여유를 알 수 없습니다. 측정할 때는 제한을 풀고 봅니다.
  3. 같은 위치, 같은 카메라 방향에서 비교합니다. 시점만 바뀌어도 화면에 들어오는 오브젝트 수가 달라져 숫자가 크게 흔들립니다.

한 순간의 숫자는 튀기 쉬우므로 그래프로 보는 것도 방법입니다.

stat unitgraph

이 명령은 stat unit 값을 시간 흐름 그래프로 보여 줍니다. 특정 순간에만 튀는 스파이크(히치)인지, 계속 높은 상태인지 구분할 때 유용합니다.

병목별로 다음에 켤 명령

어느 쪽이 느린지 가려졌다면 그 영역을 더 자세히 봅니다.

GPU 가 Frame 에 가까울 때

stat gpu

GPU 작업을 패스별 시간으로 보여 줍니다. 그림자, 루멘, 반투명, 후처리 중 어디가 큰지 확인한 뒤 해당 기능의 품질이나 범위를 조정합니다. 한 프레임을 더 자세히 쪼개 보고 싶다면 ProfileGPU 명령을 씁니다. Epic 공식 콘솔 변수 문서에 따르면 ProfileGPU 결과는 로그·콘솔에도 기록되므로, 창이 뜨지 않으면 출력 로그(Output Log)를 확인합니다.

Draw 가 Frame 에 가까울 때

stat scenerendering

공식 문서는 이 명령을 "렌더링에서 느린 영역을 찾는 좋은 출발점"이라고 설명합니다. 드로우콜 수와 보이는 메시 수를 보고, 너무 많다면 액터 병합이나 인스턴싱, 거리별 컬링을 검토합니다.

Game 이 Frame 에 가까울 때
그래픽 설정은 거의 효과가 없습니다. 매 프레임 실행되는 Tick 이벤트, 많은 캐릭터의 애니메이션 갱신, 물리 처리 등 로직 쪽을 의심합니다. 이 경우에는 Unreal Insights 로 함수 단위 시간을 보는 것이 다음 단계입니다.

화면에 켜 둔 통계를 모두 끌 때는 아래를 씁니다.

stat none

자주 하는 오해 세 가지

첫째, 프레임이 낮으면 무조건 그래픽카드 문제라고 보는 경우입니다. 위에서 본 것처럼 Game 이 가장 크면 그래픽 옵션을 낮춰도 개선이 거의 없습니다.

둘째, stat fps 만 보고 판단하는 경우입니다. stat fps 는 결과(초당 프레임)만 보여 줄 뿐 원인은 알려 주지 않습니다. 원인을 가르려면 stat unit 이 필요합니다.

셋째, GPU 값이 Frame 보다 작으니 GPU 는 여유가 있다고 단정하는 경우입니다. 동적 해상도가 켜져 있으면 엔진이 해상도를 자동으로 낮춰 GPU 시간을 맞추고 있을 수 있습니다. DynRes의 Primary Screen Percentage가 100%보다 낮으면 기본 렌더링 해상도를 낮춘 상태라는 뜻입니다. Secondary Screen Percentage와 함께 확인합니다.

정리하면 순서는 간단합니다. stat unit 으로 Frame 과 가장 가까운 값을 찾고, GPU 면 stat gpu, Draw 면 stat scenerendering, Game 이면 로직 쪽 프로파일링으로 넘어갑니다. 이 순서를 지키면 효과 없는 옵션을 하나씩 끄며 시간을 쓰는 일을 줄일 수 있습니다.

자주 묻는 질문

Game, Draw, GPU 가 모두 비슷하게 높으면 어디부터 봐야 하나요?

세 값이 비슷하면 어느 한쪽만 줄여도 다른 쪽이 곧바로 새 병목이 됩니다. 이럴 때는 화면에 보이는 오브젝트 수 자체를 줄이는 작업(컬링 거리, LOD, 인스턴싱)이 CPU 두 스레드와 GPU 에 동시에 영향을 주기 때문에 먼저 검토할 만합니다.

에디터 뷰포트에서 잰 값과 패키지 빌드 값이 크게 다릅니다. 어느 쪽을 믿어야 하나요?

최종 사용자가 경험하는 성능은 패키지 빌드 쪽에 가깝습니다. 에디터는 편집 도구 자체의 부담이 더해지므로 대략적인 경향 확인용으로 쓰고, 목표 프레임 달성 여부는 Development 패키지나 Standalone 실행에서 확인하는 것이 정확합니다.

stat 명령이 화면에 안 뜹니다.

배포(Shipping) 빌드는 일반적으로 콘솔과 통계 표시가 비활성화되어 있습니다. 에디터, Standalone, Development 빌드에서 사용하세요. 이미 켜 둔 다른 stat 창에 가려진 경우도 있으니 stat none 으로 모두 끈 뒤 다시 켜 보는 것도 방법입니다.


용어 설명

  • 게임 스레드(Game Thread): 게임 규칙, 블루프린트, 입력, 애니메이션 갱신 같은 로직을 처리하는 CPU 작업 흐름.
  • 렌더 스레드(Render Thread): 어떤 오브젝트를 어떤 순서로 그릴지 정리해 GPU 에 넘기는 CPU 작업 흐름. stat unit 에서는 Draw 로 표시된다.
  • RHI(Rendering Hardware Interface): DirectX·Vulkan 같은 그래픽 API 와 엔진 사이를 잇는 계층.
  • 병목(Bottleneck): 전체 속도를 결정하는 가장 느린 구간.
  • 드로우콜(Draw Call): CPU 가 GPU 에 "이 물체를 그려라"라고 보내는 명령 한 번. 많을수록 렌더 스레드 부담이 커진다.
  • 동적 해상도(Dynamic Resolution): 프레임 시간을 맞추려고 렌더링 해상도를 자동으로 조정하는 기능.
  • 히치(Hitch): 특정 순간에만 프레임이 크게 튀는 현상.
  • Unreal Insights: 함수·스레드 단위로 시간을 기록해 분석하는 언리얼 공식 프로파일링 도구.

근거 출처

unrealtechlog

Recent Posts

언리얼엔진 HighResShot, 화면보다 큰 스크린샷을 원하는 크기로 뽑는 명령어 정리 (UE 5.8 기준)

포트폴리오 이미지나 기획서에 넣을 컷을 뷰포트에서 캡처하면 모니터 해상도 이상으로는 커지지 않습니다. 1920×1080 모니터에서 작업하면…

1주 ago

무비 렌더 큐 샘플 수, 스페이셜과 템포럴 중 어디를 올릴지 정하는 법

이해를 돕기 위한 주제 이미지▲ 스페이셜은 위치를, 템포럴은 셔터 시간을 나눈다 무비 렌더 큐로 뽑았는데…

4주 ago

노출 고정과 포토메트릭 조명 단위 — 밝기가 출렁이지 않는 씬 만들기

라이트 강도를 바꿨는데 화면 밝기가 예상과 다르거나, 카메라 방향에 따라 화면이 서서히 밝아진다면 자동 노출을…

1개월 ago

개인 작업용 렌더 워크스테이션, 돈을 어디에 쓸지

장비를 새로 맞출 때 예산은 정해져 있습니다. 문제는 어디에 몰아줄지죠. 커뮤니티 글을 보면 다들 다른…

1개월 ago

외주 견적에서 자주 빠지는 항목들

견적을 잘못 내면 작업 내내 손해라는 감각이 따라다닙니다. 금액을 낮게 불러서가 아니라, 들어갈 일을 빠뜨려서…

1개월 ago

신입 3D 아티스트의 첫 6개월, 무엇이 실제로 평가되나

첫 직장에 들어가면 실력으로 평가받을 거라 생각합니다. 반은 맞습니다. 나머지 반은 다른 것들이고, 그 다른…

1개월 ago