언리얼 엔진에서 프로파일링 및 최적화는 게임 성능을 향상시키기 위한 필수 과정이다다. 프로파일링은 CPU, GPU, 메모리 사용량 등을 모니터링하고 분석하여 성능 병목 현상을 파악하는 작업이다. 이를 위해 언리얼 엔진이 제공하는 다양한 도구(예: Unreal Insights, Stat Commands, Session Frontend)를 사용하여 프로파일링 및 최적화를 진행하면 된다. 

 

목차

     

     


     

     

    최적화


     

     

    최적화란?

     

    최적화란 디바이스의 자원을 최대한 활용하는 것을 말한다.

     

    최적화는 프로파일링 결과를 바탕으로 게임의 효율성을 높이는 과정으로, 코드 최적화, 애셋 관리, LOD(Level of Detail) 설정, 메모리 관리 등이 포함된다. 

     

     

    [ 디자이스의 자원 ] 

    • CPU / GPU Cores, 메모리, Data Bus, Storage, Power
      • Multi-thread, CPU Cache, Memory management, Virtual memory paging, Bandwidth, Temperature, ...
      • Critical section, Cache miss, (Un)Managed Memory, Page fault, Low-power management, Throttling, ...

     

    프레임 드랍과 같은 최적화 관련 문제의 원인은 OS(Operating System. ex. Windows, Mac), 드라이버, 하드웨어 등에서 발생하고 개개인의 장비의 조건은 다르기 때문에 

     

    한 가지 해결책이 모든 플랫폼 · 모든 하드웨어의 문제를 완벽히 해결해주지 않는다.

     


     

     

    타겟 하드웨어

     

    어느 기기에서 돌아갈 것인가?

    : 게임을 개발할 때 타겟으로 돌아갈 기기를 설정해야 한다. 

    • 어떤 시장인가? 
      • ex. 중국, 인도, 북미, 아프리카 등등
    • 얼마나 하위 기종까지 돌아가게 할 것인가? 
      • ex. 구형 인텔 팬티엄 컴퓨터에서 돌아가게 할 것인가?
    • 플레이 가능한 수준허용 가능한 비주얼 퀄리티 는?
      • ex. 60 FPS, FHD 성능은 나와야 한다. 
    • 어느 정도의 자원을 테스트/서포트에 투입할 수 있나?
    • 최대한 다양한 하드웨어 검증을 통해, Bucket을 나누자 (Low / Medium / High / ... )
    • Bucket 내에서 가장 낮지만 가장 유명한 CPU/GPU를 선택

     

    최적화는 타겟 하드웨어와 성능 예산 Budget을 정확하게 알아야 가능하다.


     

     


    프로파일링


     

     

    프로파일링 

     

    문제를 해결하려면 문제를 정확히 알아야 한다.

    • 언리얼 엔진 프로파일링 툴
      • [콘솔명령어 ~ ] Stat Viewer / Stat 명령어 / ProfileGPU
    • 플랫폼 종속적인 / 외부 프로파일링 툴
      • [PC] VTune, Window Performance Tools, Graphics Performance Analyzer, ...
      • [Mobile] Xcode Instructment Tools, Android Profiler, ...
      • [Console] Razor, NV Services 등, 각 데브킷에 포함된 프로파일링 API 및 툴

     

     

    Stat Unit / UnitGraph

     

    Frame

    하나의 프레임 생성에 걸린 총 시간

    • Game, Draw(Rendering thread) & RHI on CPU / GPU on GPU
    • ' CPU 바운드 ' 문제인지, ' GPU 바운드 ' 문제인지 파악해야 한다.

     

     

    Framerate이 낮을 때, 가장 먼저 확인할 정보

    • 언리얼 프로파일링으로 수치 확인
    • 언리얼 엔진의 Thread 모델을 참고하여 프로파일링 한다.

    언리얼 엔진의 Thread 모델

     


     

     

     


    CPU 프로파일링


     

     

    Stat Dumphitches

     

    런타임 CPU Hitch 검출

    • 자동 Hitch 검출 후 콜스택 로깅
      • t.HitchFrameTimeThreshold 와 함께
        Hitch 판단 = 현재 프레임 타임 > 역치 Threshold
    • Hitch 검출 비용이 크지 않다.
    • 랜덤 Hitch / 의도치 않은 애셋 동기 로딩 판별에 유용하다.

     

     

    Stat Game 명령어 (~ stat game)

     

    게임 스레드의 부하 판단

    Stat Unit 결과 Game이 Framerate에 영향을 주었다면,
    어느 부분에서 부하가 많이 걸리는지 전반적인 사항을 확인할 수 있다. 

     

     

    스탯 데이터

    • Inclusinve:  자식의 스택을 포함한 총합을 고려한다.
    • Exclusive:   자식의 스탯을 제외한 본인만 고려한다.

     

    ~ Stat Game 콘솔 명령어로 실행하여 나온 화면


     

     

    Stat SceneRendering

     

    렌더 스레드 부하 판단

    • 렌더링 과정에서 느린 지점을 찾기에 좋은 시작점
    • 일반적인 렌더링 통계 정보 표시
    • 드로우 콜이 버짓을 넘겼는지 여부

     

    ※  Stat RHI = Triangles / 메모리 정보 표시

    ~ Stat SceneRendering 콘솔 명령어로 실행하여 나온 화면


     

     

    Stat RHI

     

    Stat RHI = Triangles / 메모리 정보 표시

      • Rendering Hardware Interface와 관련한 정보 확인
      • RHIT Thread의 부하
      • Primitive가 버짓을 넘겼는지 여부

    ~ Stat RHI 콘솔 명령어로 실행하여 나온 화면


     

     

    Stat DumpFrame [ -ms = 0.1 ]

     

    호출 프레임의 모든 스레드의 이벤트 덤프


    전반적으로 프레임 타임이 느릴때 유용하다.

    • 어느 Thread에서 문제인지 확인한다.


    로그와 콘솔에 덤프 결과 출력

    • 걸린 시간호출 횟수 정보를 확인한다.
    • -ms 인자로 지정된 값 이하의 이벤트는 필터링한다. 


     

     


    GPU 프로파일링


     

     

    Profile GPU

     

    GPU 타임 세부사항을 보여주는 언리얼 엔진 빌트인 툴이다.

    • GPU Timestamp 활용
    • GUI / 로그 형태:  r.ProfileGPU.ShowUI
    • GPU 부하 추적에 유용
    • 병목 추적하기
      • r.SetRes 혹은 r.ScreenPercentage 사용
        • 엄청난 성능 향상이있다면 Pixel bound
        • 변경 후 큰 성능 변화가 없다면 Vertex bound

     

     

    ※ 언리얼 엔진 공식문서:  랜더 패스별 최적화

    https://docs.unrealengine.com/en-US/Engine/Performance/GPU


     

     

    stat GPU

     

    GPU 성능에 대한 실시간 정보 확인

    • ProfileGPU와 달리, 계층 정보를 제공하지 않아 일반적인 정보 확인에 유용하다.
    • 주요 랜더링 작업에서 걸리는 시간 확인이 가능하다.

     

    ~ Stat GPU 콘솔 명령어로 실행하여 나온 화면

     


     

     

    렌더 리소스 뷰어

     

    GPU 메모리 최적화

    • 렌더 리소스 메모리 사용량 분석
    • "리프레시" 버튼으로 스냅샷 생성
    • 필터를 통한 빠른 검색이 가능하다.
      • 레지던트
      • 트랜잭션
      • 스트리밍
      • 렌더 타깃
      • 뎁스 스텐실
      • UAV
      • 레이 트레이싱 가속 구조체


     

     

    GPU 덤프 뷰어 툴 

     

    모든 플랫폼에서동작하는 그래픽스디버깅 툴  

    • GPU 덤프 생성 후 웹브라우저로 확인이 가능하다.
    • DumpGPU 콘솔 명령어  혹은  Ctrl + Shift + /

    .bat 파일을 실행하면 아래 이미지와 같은 창이 나온다.

     


     

     

     

    메모리 프로파일링


     

     

    Common Tools

     

    Memreport -full

    • 로그 파일에 메모리 사용량 로깅

     

    ListTextures [-CSV]

    • 일반 혹은 csv형태 로그 생성
    • Release 마다 Spreadsheet를 생성하여, 사용량 변화를 추적하는 식으로 사용하면 된다. 

     

    stat LLM / LLMFULL

    • LLM은 Low Level Memory Tracker의 약자다.
    • 모든 메모리 할당에 Tag 추가
      • 엔진 내 할당은 태깅 완료
    • 각 Tag 별로 카테고리화
      • 태그되지 않은 할당은 "Untagged" 카테고리로 간다.
    • 엔진 실행인자로 -llm [-llmcsv] 필요
      • -llmcsv:  주기적으로 스탯 파일 출력. LLM.LLMW 

     

     

    ~ Stat LLM FULL 콘솔 명령어로 실행하여 나온 화면


     

     

    통계 - Primitive Stats

     

    에디터 메인 메뉴 -> 창 -> 통계

     

    애셋에 대한 일반적인 정보 확인에 용이

    • 너무 큰 애셋
    • 포함되지 않아야 하는 애셋

     

    (메모리 내) 사이즈와 카운트, Tris 정보를 통해 더 최적화가 가능한 요소들을 확인한다.


     

     

    통계 = Texture Stats

     

    텍스쳐에 대한 일반적인 정보 확인에 용이

    • 잘못된 텍스쳐 그룹
    • 잘못된 LODBias
    • 압축되지 않은 텍스처
    • Mipmap을 생성하지 않은 텍스쳐
    • 잘못된 텍스쳐 디멘션