사례로 배우는 성능 최적화와 프로파일링

Date:     Updated:

카테고리:

Chapter 1 프로파일리을 위한 기초 체력 다지기

  • 최적화 관련 기존 발표들 ( 00 : 47 )
  • 프로파일링 이후 문제가 있으면 바로 최적화 하기 ( 01 : 35 )
  • 병목 지점을 먼저 찾아야 한다 ( 02 : 13 )
  • CPU( AI, 물리, 블루프린트 Tick, 드로 콜 )
  • GPU( 그림자, 오버드로, UI, 반투명, 라이팅 )
  • I/O( 영상 재생, 레벨 로딩, 텍스처 로딩 )
  • 네트워크( 대역폭, 전송 지연 )
  • 메모리( GC, Out of Memory )
  • 발열로 인한 가속( throttling )
  • 레퍼런스 하드웨어 선정 ( 02 : 34 )
  • 목표 Frame Rate 설정 : 30Hz(33.3ms) or 60Hz(16.6ms)
  • CPU 예산 편성( AI, Animation, Character, Physics, UI, Particles )
  • GPU 예산 편성은 아트팀의 제작 가이드라인이 필요함( 머티리얼 인스트럭션 수, 폴리곤 수, 동적 라이트 개수, 포스트 프로세스 )
  • 서버당 수용가능한 동시 접속자수 및 서버 운영비용 체크
  • Package Size, Memory 예산 편성
  • 지표에 영향을 주는 요소를 최소화, 일정한 기준을 만들어서 일관되게 측정
  • 정기적으로 꾸준히 기록해서 트렌드 관리( 테스트 자동화와 CI 통합을 추천 )
  • 컴퓨터 구조의 이해 ( 04 : 50 )
  • 언리얼 엔진은 게임플레이 도중 비동기 식으로 텍스처를 로딩하는 스트리밍 기능이 제공된다 ( 06 : 13 )
  • 캐시히트 성공률을 높일려면? 같은 메모리 주소를 참조하는 로직을 모아서 한꺼번에 처리 해야한다 ( 08 : 18 )
  • 버츄얼 텍스처란? 텍스처 전체를 GPU 메모리에 올리지 않고, 현재 화면에 필요한 Tile만 스트리밍해서 사용하는 기술 ( 09 : 18 )
  • 모바일 플랫폼인 경우 가속(throttling)으로 인한 성능 하락을 고려해야함
  • 여러 개의 코어들을 균형 있게 사용해야 한다
  • 언리얼 엔진의 스레드 모델 ( 12 : 08 )
  • Game Thread는 Render Thread가 렌더링을 완료할 때까지 매 프레임 기다리지 않고, Render Command를 큐에 넣은 뒤 다음 프레임의 게임 로직을 계속 수행한다
  • CPU Affinity는 Game Thread나 Render Thread를 특정 코어에 고정해 캐시 활용과 스레드 이동을 줄이기 위한 최적화 기법입니다 하지만 모바일 구조에서는 Big과 Little 클러스터가 캐시를 공유하지 않기 때문에, 잘못 고정하면 클러스터 간 이동 비용과 캐시 미스가 증가해 오히려 성능이 저하될 수 있습니다 따라서 CPU Affinity는 프로파일링을 통해 병목이 확인된 경우에만 신중하게 적용해야 하며, Race Condition 같은 동기화 문제를 해결해 주는 기능은 아닙니다 ( 13 : 08 )
  • 정확한 프로파일링을 위해 PIE 대신 독립형(Standalone) 또는 실제 빌드(Test/Shipping) 에서 측정해야 한다 ( 14 : 17 )
  • V-Sync(r.VSync 0) 를 비활성화하여 프레임 제한으로 인한 측정 오차를 제거해야 한다
  • Smooth Framerate, Physics Sub-Stepping, GC Verify, AI Logging 등 성능에 영향을 주는 옵션은 비활성화한 후 측정해야 한다
  • 빠른 병목 분석은 Stat FPS → Stat Unit → Stat Slow → Stat Game/GPU/SceneRendering 순으로 범위를 좁혀가며 진행하는 것이 효율적이다
  • 프로파일링은 큰 시스템부터 확인한 후 작은 단위로 원인을 좁혀가는 방식(Top-Down 접근) 이 가장 효율적이다
  • 눈에 띄는 병목은 초기 설정을 모두 맞추지 않아도 발견할 수 있지만, 정확한 수치 비교를 위해서는 동일한 테스트 환경을 유지 해야 한다

Chapter 2 누구나 쉽게 할 수 있는 기본 기능들 소개

  • 라이트 복잡도를 보려면? 최적화 뷰모드에서 라이트 복잡도를 클릭한다 ( 15 : 34 )
  • 무버블로 사용하지 않아도 되는 라이트는 어떻게 해야할까? 스태틱으로 바꾼뒤 라이팅만 빌드를 누른다 ( 16 : 03 )
  • 쿼드 오버드로는 무엇을 보는 기능인가? 화면에서 픽셀 연산이 무거운 부분을 표시해준다 ( 16 : 21 )
  • G키를 누르면 화면상의 아이콘들이 감춰진다 ( 18 : 42 )
  • 창옵션 에서 통계를 누르면 무엇을 알 수 있는가? 레벨에서 사용되고 있는 부하가 심한 오브젝트를 확인할 수 있다 ( 18 : 57 )
  • 애셋 액션에서 프로퍼티 매트릭스를 통한 대량 편집을 통해 할 수 있는것은? MAX 텍스쳐 사이즈를 지정할 수 있다 ( 20 : 21 )
  • 정확한 프로파일링을 할려면 어떤 모드로 해야할까? 독립형 게임 ( 21 : 02 )

Chapter 3 프로파일링 도구의 활용

  • stat fps는 현재 FPS(Frame Per Second) 를 표시한다
  • stat unit은 Game Thread, Draw Thread, GPU, Frame 시간(ms) 을 표시하여 병목이 CPU인지 GPU인지 확인한다
  • stat gpu는 GPU 렌더링 패스별 소요 시간(ms) 을 표시하여 어떤 렌더링 작업이 GPU 성능을 많이 사용하는지 확인한다
  • stat game은 Game Thread에서 실행되는 시스템별 CPU 사용 시간을 표시하여 게임 로직 병목을 분석한다
  • stat character는 Character Movement Component의 업데이트 정보와 처리 시간을 표시하여 캐릭터 이동 관련 성능을 확인한다
  • stat anim은 Animation Blueprint 평가, 스켈레탈 메시 애니메이션 처리 시간을 표시하여 애니메이션 성능을 분석한다
  • stat physics는 물리 시뮬레이션(Collision, Rigid Body, Chaos 등)의 처리 시간을 표시하여 물리 연산 성능을 확인한다
  • stat slow는 설정된 임계 시간(Threshold)보다 오래 걸린 함수나 코드 구간을 찾아 화면에 출력해 CPU 성능 병목을 빠르게 확인하는 디버깅용 명령어이다
  • showflag는 언리얼 엔진의 렌더링 요소(Rendering Feature)를 개별적으로 켜거나 끄는 디버깅/시각화용 콘솔 명령어입니다

Chapter 4 상황별 프로파일링 및 최적화 사례 데모

  • 프로파일링을 할때 치트키를 만들어 사용하면 좋다 ( 28 : 51 )
  • 프로파일링 UI가 성능 부하를 많이 유발한다 ( 30 : 01 )
  • 언리얼 인사이트를 활용하면 각각의 스레드를 볼 수 있다 ( 37 : 38 )
  • 언리얼 인사이트를 활용하면 에셋 로딩타임을 확인할 수 있다 ( 39 : 26 )


맨 위로 이동하기

댓글남기기