언리얼 인사이트와 친해지기 위한 준비 운동

🧐 | 2022-06-16

안녕하세요, 넷마블 TPM실 기술분석팀 박정욱입니다.

언리얼 엔진에서 제공하는 기능 중에는 데디케이티드 서버(Dedicated Server, 독립형 서버)가 있습니다. 데디케이티드 서버는 서버와 클라이언트가 정확히 역할을 분리해서 동작하던 기존 서버-클라이언트 구조와 달리, 클라이언트에서 렌더링을 제거한 수준으로 동작합니다.

일반적인 서버-클라이언트 구조에서 프로파일링 툴을 활용해 서버를 튜닝하는 사례는 쉽게 찾아볼 수 있습니다. 반면, 언리얼 엔진에 특화된 서버 튜닝 사례는 아직 찾아보기 쉽지 않습니다. 다행히 언리얼 엔진에는 언리얼 인사이트(Unreal Insights)라는 무료 프로파일링 툴이 있습니다. 주로 클라이언트를 튜닝하기 위해 사용합니다.

앞서 데디케이티드 서버는 렌더링을 제거한 클라이언트와 동일하게 동작한다고 했었습니다. 이 둘 사이의 관계성 덕분에, 언리얼 엔진에서 동작하는 데디케이티드 서버는 언리얼 인사이트를 활용하면 클라이언트 프로파일링하듯이 분석할 수 있습니다.

  • 온라인 게임 서버를 구현하는 방법에는 리슨 서버, 피어 투 피어, 서버-클라이언트, 데디케이티드 서버 등 여러 방법이 있습니다. 이들의 차이는 다른 기회를 만들어 소개하겠습니다.

언리얼 인사이트 준비하기

언리얼 인사이트는 언리얼 엔진 소스코드를 다운로드하고 솔루션을 살펴보면, 프로그램 하위에 있습니다. 직접 빌드해서 바이너리 파일로 만들어야 합니다.

간단하지만 까다로운 언리얼 엔진 개발 환경 구축
https://netmarble.engineering/unreal-engine-dev-build-setting/

언리얼 엔진 개발 환경 준비를 마쳤다면, 비주얼 스튜디오의 솔루션 탐색기에서 ‘Program’ 폴더로 들어가면 ‘UnrealInsignts’를 보실 수 있습니다.

폴더 안에 있는 ‘UnrealInsights’만 따로 선별해서 빌드하거나 솔루션 전체 빌드를 마쳤다면, 프로젝트 폴더 하위(‘프로젝트 폴더\Engine\Binaries\Win64’)에서 언리얼 인사이트 실행파일인 ‘UnrealInsights.exe’ 파일을 볼 수 있습니다.

이제, 준비가 끝났습니다.

언리얼 인사이트 동작 과정

언리얼 인사이트로 분석할 프로파일링 파일은 언리얼 엔진으로 빌드한 클라이언트나 서버(데디케이티드 서버 포함)에 내장된 수집기(Recorder)로 생성합니다. 그래서 별도 수집기 프로그램을 추가 설치하지 않아도 바로 쓸 수 있습니다. 기본 동작 과정은 아래의 순서를 참고해 주세요.

  1. 클라이언트나 서버를 실행하기 전에, 옵션값으로 프로파일을 활성화합니다. 이때, 일부 옵션은 성능에 매우 큰 영향을 주므로 주의해서 사용해야 합니다.
  2. 언리얼 인사이트를 실행할 머신으로 프로파일링 파일을 복사합니다. 수집기 역할을 하는 클라이언트나 서버를 종료하지 않아도, 복사로 인한 에러는 발생하지 않습니다.
  3. 언리얼 인사이트로 해당 파일을 분석합니다.

Windows Performance Analyzer

언리얼 인사이트 동작 과정은 WPA(Windows Performance Analyzer)와 유사합니다. WPA 동작 과정을 언리얼 인사이트 동작 과정과 비교해보시면, 수집기와 분석기가 명확히 구분돼 있다는 점도 유사함을 알 수 있습니다.

  1. 측정을 희망하는 장비에서 성능 관련 지표를 수집합니다. (레코딩 후, 파일로 생성)
  2. 측정한 성능 파일을 분석할 장비로 이동합니다.
  3. 분석기를 사용해 측정한 성능 파일을 로딩한 후, 분석합니다.

프로파일링 옵션

프로파일링은 수집 단계이므로, 프로파일링 옵션은 수집기 역할을 하는 클라이언트나 서버(데디케이티드 서버 포함)를 실행할 때 입력해야 합니다.

프로파일링 세부 사항을 조절할 옵션은 수집기 역할을 하는 클라이언트나 서버(데디케이티드 서버 포함)를 실행할 때 입력 또는 조절해야 합니다. 이때, 세부 옵션은 CLI로 입력하거나, 헤더파일을 수정해서 추가하면 됩니다.

프로파일링을 위한 옵션 세부 사항은 공식 링크를 참고해주세요. 공식 문서에 모든 옵션이 나열돼 있으므로, 이 글에선 주로 사용하는 옵션을 소개하겠습니다.

주로 사용하는 옵션

주로 사용하는 옵션은 크게 3가지로 분류했습니다. 옵션 자체를 묶음으로 실행하는 단축 명령어가 있지는 않습니다. 편의상 프로파일링으로 수집할 데이터 종류를 임의로 선정한 것이므로 각자 필요한 옵션을 편하게 바꾸셔도 됩니다. 지금부터 데디케이티드 서버로 실행할 파일 이름을 ‘LE.exe’라고 가정하겠습니다.

먼저, 헤비 모드입니다. 만약 데디케이트 서버를 프로파일링한다면 렌더링 과정이 생략되므로, ‘gpu’ 옵션은 생략해도 됩니다.

// 클라이언트
$ LE.exe -trace=log,counters,cpu,frame,bookmark,file,loadtime,gpu,rhicommands,rendercommands,object  -statnamedevents

// 데디케이티드 서버
$ LE.exe -trace=log,counters,cpu,frame,bookmark,file,loadtime,rhicommands,rendercommands,object  -statnamedevents

다음으로 심플 모드입니다.

$ LE.exe -trace=counters,cpu,frame,bookmark,gpu

네트워크 수집 옵션

온라인 게임을 위해 네트워크 동작 환경을 수집하는 모드도 있습니다. 단, 언리얼 엔진 4.27 버전 기준으로 네트워크 수집 기능은 아직 실험 단계이므로 유념해서 사용하시길 바랍니다.

저희는 주로 앞서 열거한 헤비 모드나 심플 모드에 네트워크 수집 옵션을 추가해서 사용했습니다. 아래 예시는 심플 모드에 네트워크 수집을 추가한 예시입니다.

$ LE.exe -trace=counters,cpu,frame,bookmark,gpu,net -NetTrace=1

네트워크 수집 옵션인 ‘-NetTrace=1’에서 ‘1’은 통계 패널에서 보여주는 데이터를 그룹화하는 레벨을 의미합니다. 레벨은 0에서 4까지 값 중 적정 레벨을 선택해서 입력하면 됩니다.

네트워크 로그 레벨 차이

  • 레벨0: 채널 이름을 사용하는 일반적인 모든 채널 정보를 보여줍니다.
  • 레벨1: 복제 오브젝트(액터)나 이벤트 등 시리얼라이즈(Serialized)한 오브젝트 정보를 보여줍니다.
  • 레벨2: 프로퍼티 리플리케이션 또는 RPC에서 나오는 이벤트 정보를 보여줍니다.
  • 레벨3: 시리얼라이즈하는 프로퍼티 정보를 보여줍니다.
  • 레벨4: 프로퍼티, 어레이 콘텐츠 등을 시리얼라이즈할 때 추가로 발생한 정보를 보여줍니다.

프로파일링 옵션별 리소스 소모

프로파일링으로 수집하는 옵션 정도에 따라, 당연히 성능 차이가 있을 수밖에 없습니다. 대략적인 비교를 위해 앞서 설명한 헤비 모드, 심플 모드, 네트워크 수집 모드가 어느 정도 차이를 주는지 살펴보겠습니다. (네트워크 수집 모드 로그 레벨은 ‘1’로 지정했습니다.)

일반적인 실행과 나머지 모드를 비교해보면, 헤비 모드는 상세하게 세부 항목을 볼 수 있지만 성능이 매우 떨어집니다. 심플 모드는 거의 실제와 유사하게 동작하는 것으로 보이며, 네트워크 수집 모드는 일부 추가 리소스를 사용하는 것으로 보입니다. 네트워크 수집 레벨에 따른 리소스 소모 테스트는 하지 않았습니다만, 당연히 더 많은 정보를 수집하면 리소스를 더 많이 소모하리라 생각합니다.

각 모드별로 동작 시 소모 리소스 차이가 큰 만큼, 프로파일링이 필요한 상황과 특이사항에 맞춰서 사용하시기를 추천합니다.

상황과 특이사항에 맞는 프로파일링 옵션

이상 여기까지, 언리얼 인사이트를 쓰기 위한 기본 개념을 간단히 살펴봤습니다. 특히, 언리얼 인사이트에서 분석할 프로파일링 옵션 설정은 언리얼 인사이트가 아닌 클라이언트나 서버(데디케이티드 서버 포함)를 실행할 때 한다는 특징을 꼭 잘 기억하시길 바랍니다.

실제로 프로파일링 데이터 파일을 언리얼 인사이트에서 열어보는 과정은 다음 글에서 이어가겠습니다.