게임 개발/Unreal Engine

[UE5] 최적화를 위한 프로파일링 개요 및 편의 기능들

지노윈 2023. 4. 23. 12:42
반응형

큰 범위 병목 지점 찾기

프로파일링은 큰 범위에서부터 시작하여 점차 범위를 좁혀가며 분석하는 것이 효율적입니다.

먼저 언리얼 엔진에서 제공하는 콘솔 명령어를 사용하여 큰 범위의 병목 지점을 쉽게 찾을 수 있습니다.

가장 먼저 확인해야 할 것은 어떤 쓰레드에서 병목 현상이 발생하는지, 혹은 GPU에서 발생하는지를 파악하는 것입니다.

이를 가장 잘 확인할 수 있는 방법은 'stat unit' 명령어를 사용하는 것입니다. stat unit은 항목을 구분하여 병목 지점을 쉽게 찾을 수 있도록 큰 범위로 보여줍니다.

 → 대부분의 경우 분석 시작의 처음은 'stat unit' 

또한, stat unitgraph 콘솔 명령어를 사용하여 실시간 그래프와 함께 동일한 지표를 표시할 수도 있습니다.

 

60프레임을 목표로 한다면 Frame 시간이 16.66ms보다 작아야 하며,

30프레임을 목표로 한다면 Frame 시간이 33.33ms보다 작아야 겠습니다.

최적화는 배경, 캐릭터, 애니메이션, 이펙트, 물리, 애니메이션, UI, 게임 로직 등등이 각각 버짓을 정하고 이 버짓들의 총합이 목표로하는 Frame 시간내에 도달하도록 하는 것입니다.

 

근본적으로는 게임이 구동되는 하드웨어에 따라서 그래픽스 퀄리티를 조절해주어야 목표 프레임을 달성 할 수 있습니다.

stat unit

Frame가 가장 근접한 항목이 병목 지점일 확률이 높습니다.

Frame 게임의 한 프레임을 생성하는 데 소요된 총 시간입니다.
Game 게임 쓰레드에서 사용된 시간입니다.
값이 Frame 시간과 유사하면, 게임 성능은 게임 쓰레드에 의해 병목이 발생한 것으로 보입니다.
Draw 드로우: 렌더링 쓰레드에서 사용된 시간입니다.
값이 Frame 시간과 유사하면, 게임 성능은 렌더링 쓰레드에 의해 병목이 발생한 것으로 보입니다.
GPU GPU: 씬 렌더링에 사용된 GPU에서 소요된 시간입니다.
GPU 시간은 Frame 시간에 동기화되므로 유사합니다.
RHIT 렌더링 하드웨어 인터페이스 쓰레드에서 소요된 시간입니다.(예: OpenGL, D3D12)
Frame 시간과 유사할 것으로 예상됩니다.
DynRes 동적 해상도가 지원되는 경우, 현재 Dynamic Resolution 해상도를 표시합니다.
Draws 현재 DrawPrimitive 호출 수입니다.
Prims 현재 그려지는 삼각형 수입니다.

프로파일링을 위한 콘솔 명령어

  • stat fps
  • stat unit
  • stat unitGraph
  • stat gpu
  • stat game
  • stat slow
    • 느린 부분 보여줌. cpu stall은 일하고 있지 않고 기다리는 시간임.
  • stat SceneRendering
    • 드로우콜 수, 그림자/데칼/포스트 프로세싱/라이팅 등과 같은 각각의 시간을 알 수 있음.

stat 관련 편의 기능 구현

stat fps, stat unit 정보를 on/off

 

순차적으로 stat game, stat sceneRendering, stat gpu, stat slow를 on/off

병목의 원인 찾기위해 표시를 꺼보자

문제를 찾는 가장 쉬운 방법은 씬에 표시되는 기능들을 끄는 것입니다.

화면에는 많은 요소들이 썪여서 있다면 'show ~'또는 'ShowFlag.~' 명령어로 표시를 on/off 할 수 있습니다.

구체적인 표시 on/off는 다음 페이지 참고해주세요.
https://docs.unrealengine.com/5.1/ko/viewport-show-flags-in-unreal-engine/

언리얼 엔진은 정말 많은 보기 옵션들을 제공해주고 있습니다.

 

명령어 예)

  • show <애셋유형>
  • showFlag.<애셋유형> 0/1
    • 예) showflag.staticmeshes, showflag.skeletalmeshes, showflag.particles 

순차적으로 showflag.staticmeshes, showflag.skeletalmeshes, showflag.particles를 실행하여 스태틱 매쉬, 스켈레탈 메쉬, 파티클 들을 on/off

한 프레임씩 보기

순간적으로 프레임이 높아지는 경우 천천히 한 프레임씩 보면서 분석하는 것이 유용할 경우가 있습니다.

P : 멈추기, O : 한 프레임씩 진행시키며 멈추어서 보기

최적화 뷰모드 활용

참고 : https://docs.unrealengine.com/5.1/ko/viewport-modes-in-unreal-engine/

  • 라이트 복잡도
    • 씬라이팅 비용을 시각화 함
    • 콘솔 명령 : viewmode lightcomplexity
    • 설치한 라이트가 겹쳐 있을 수록 그 복잡도가 올라가고 더 많은 퍼포먼스 비용이 생깁니다.

  • 라이트맵 밀도
    • 라이트맵에 쓰이는 텍셀 밀도를 시각화 함
    • 라이트맵을 사용하지 않을 경우에는 패스

  • 셰이더 복잡도
    • 셰이더의 GPU 비용을 시각화 함
    • 콘솔 명령 : viewmode shadercomplexity
    • 렌더링 되는 것들 중에 어떤 것이 셰이더 복잡도가 높어서 퍼포먼스 비용을 발생 시키는지 알 수 있습니다.

  • 쿼드 오버드로
    • 오버드로를 시각화 함
      • 렌더링 할때 3D 화면에 그려진 것을 2D화면에 밀어 넣어 보여 주는 것입니다.
      • 그러면 픽셀하나에 폴리곤이 여러번 그려지게 될 수 있습니다. 즉, 여러개의 픽셀을 계산해서 하나로 그려지는데 이것은 곧 오버헤드입니다.
    • 콘솔 명령어 : viewmode quadoverdraw
    • LOD가 필요한 메시를 알아내는데 유용함
  • LOD 배색
    • 내가 원하는 LOD가 제대로 표시하는지 확인하기 쉽도록합니다. 
    • 색깔별 LOD 레벨
    • 콘솔 명령어 : viewmode LODColoration

프로파일링 툴

언리얼 엔진이 제공하는 프로파일링 도구들이 많지만 그 중에서도 다음의 도구는 매우 유용하며 다른 글을 통해서 자세히 다룰 수 있도록 하겠습니다.

  • Unreal Insight
    • CPU 병목 구체적인 확인할 수 있습니다.
  • GPU 시각화 툴
    • 실행 : ctrl + shift + , 
    • 베이스 패스, 라이트, 섀도, 포스트 프로세싱 비용을 알아내기 좋습니다.
    • GPU가 어떤 비중으로 퍼포먼스 비용을 사용하고 있는지 한 눈에 알 수 있습니다.

[게임 개발/Unreal Engine] - [UE5] 최적화 프로파일링 사전 준비

  •