언리얼 엔진에서 프로파일링은 게임의 성능을 분석하고 최적화하는 과정이다. 이를 통해 CPU, GPU, 메모리 사용량 등을 모니터링하여 성능 병목 현상을 파악할 수 있다. 프로파일링 결과를 바탕으로 코드를 최적화하고, 애셋을 관리하여 게임 성능을 향상시키는게 중요하다.

 

목차

     

     


     

     

    최적화

     


     

     

    최적화를 위해 병목지점을 찾자!

     

       
     CPU  AI, Physics, Blueprint, Tick, DrawCall
     GPU  Shadow, OverDraw, UI, Opaque, Lighting
     I / O  Sequence Play, Level loading, Texture loading
     네트워크  대역폭(BandWidth), 전송 지연
     메모리  GC, Out of Memory
     스로틀링 (throttling)  발열로 인한 가속

     

     

    DrawCall 에 영향을 주는 요소들

    • 가장 영향을 많이 주는 요소들:  메시(Mesh), 머터리얼(Material)
    • 그 밖에 영향을 주는 요소들:  셰이더(Shader), 트랜스폼(Transform), 조명(Lighting), 알파블랜딩(AlphaBlending)

     

    DrawCall 줄이는 방법

    • 여러개의 메시를 병합하여 하나의 액터로 만들다. 이렇게하면 여러개의 드로우콜을 1개의 드로우콜만 불린다.
    • 여러개의 텍스처를 한 장의 텍스처 시트로 통합하여 드로우콜 1개로 불리게 한다.
    • 컬링으로 불필요한 오브젝트 제거
    • LOD, HLOD
      • HLOD는 'LOD + 메시 병합'인 개념. 거리가 멀어지면 ' 로우폴(LowPoly) 메시와 머티리얼이 하나로 병합된 프록시 메시' 로 교체되어 폴리곤과 드로우콜이 모두 줄어들게 된다. 

     

    여러 최적화 기법을 활용하여 한 번에 렌더링 되는 고유한 오브젝트의 수를 줄여야 한다!!


     

     

    최적화 전후를 비교하기 위해 시작 시 성능 지표 설정하기

     

    1.  레퍼런스 하드웨어 선정하기  ex. 내 컴퓨터

    2.  목표 Frame Rate 설정하기  ex. 60 Hz (16.6ms) 

    3.  CPU 예산 편성 (ms 단위 사용)

    • ex. AI(5ms) + Animation(3ms) + Character(3ms) + Physics(5ms) + UI (5ms) + Particle(5ms) = 26ms

    4.  GPU 예산 편성 (ms 단위 사용)

    • Material Instance 수, Polygon 수, Dynamic Lighting 수
    • Post Process (DoF, Anti-Aliasing, V-Sync ...)

    5.  서버 당 수용가능한 동시 접속자 수 및 서버 운용비용 체크

    6.  Package Size, Memory 예산 편성

     


     

     

    프로파일링 시작하기

     

    1.  정확한 프로파일 결과를 얻기 위해 성능에 영향을 주는 변수들을 통제하자

    • PIE가 아닌 독립형 게임으로 실행
    • V-Sync OFF (r.vsync 0)
    • Smooth Framerate, Physics Sub Stepping, GC Verifty와 AI Logging을 OFF
    • Test 빌드나 Shipping 빌드로 실제 기기에서 프로파일링

     

    2. 큰 부분부터 작은 부분으로 범위를 좁히면서 프로파일링을 진행한다. 

    • 쉽게 시도해 볼 수 있는 간단한 방법부터 활용
    • Stat fps / Unit / Slow / Game / GPU / SceneRendering ...

     


     

     

     

     

    언리얼 엔진의 스레드 모델

     

    게임 스레드는 게임 로직을 처리하고, 렌더링 스레드는 그래픽 명령을 생성하며, RHI 스레드는 이 명령을 저수준으로 변환하여 GPU에 전달한다. 각 스레드는 게임 성능과 그래픽 품질을 최적화하는데 중요한 역할을 한다.


     

     

    게임 스레드 (Game Thread)

     

     

    • 역할: 게임 로직을 처리하는 메인 스레드.
    • 작업: 게임 상태 업데이트 (캐릭터 이동, 충돌 감지, AI 연산 등), 물리 연산, 이벤트 및 플레이어 입력 처리.
    • 중요성: 게임의 핵심 로직을 처리하며, 대부분의 게임 동작이 이 스레드에서 수행됨.

     

     

    렌더링 스레드 (Rendering Thread)

     

     

    • 역할: GPU에 전달할 렌더링 명령 생성.
    • 작업: 게임 스레드에서 전달된 데이터를 바탕으로 렌더링 명령 생성, 재질(Material) 및 셰이더(Shader) 설정, 화면에 표시될 객체의 변환(Transformation) 계산.
    • 중요성: 게임의 그래픽을 처리하여 화면에 출력되는 모든 시각적 요소를 관리.

     

     

    RHI 스레드 (RHI Thread)

     

     

    • 역할: 저수준 렌더링 명령을 GPU에 전달.
    • 작업: 렌더링 스레드에서 생성된 명령을 GPU가 이해할 수 있는 형태로 변환, DirectX, OpenGL, Vulkan 등의 그래픽 API 호출, GPU와의 통신 및 렌더링 명령 최적화.
    • 중요성: 렌더링 명령의 효율적 전달과 실행을 통해 그래픽 성능 최적화.

     


     

     

    참고자료

     

    https://www.youtube.com/watch?v=hGLIqru5wnI&t=1233s

    https://www.youtube.com/watch?v=LvFQyDeVfQg&list=PLyNJAZwmsbVu_awb5sZARSqbI3b4o8a4r&index=3