Unreal Engine Improvements for Fortnite: Battle Royale
2017년 10월 4일

포트나이트: 배틀로얄 개발 과정에서 이루어진 언리얼 엔진 개선

저자: Nick Penwarden

포트나이트: 배틀로얄이 뭔가요?

에픽게임즈는 최근 포트나이트: 배틀로얄에서 새로운 PvP 모드를 공개했습니다. 이 신규 게임 모드는 5.5 제곱킬로미터 넓이의 플레이 공간에 100명의 플레이어들을 떨어뜨려놓고 최후의 생존자를 가리는 모드입니다. 이 모드에서 요구되는 사항의 규모는 포트나이트 개발 팀에게는 몇 가지 도전이었고, 여기서는 이런 도전에 대해 이야기해 보겠습니다.

배틀로얄 모드 개발 과정에서는 포트나이트: 배틀로얄 뿐만 아니라 언리얼 엔진을 사용하는 모든 개발자들, 그 중에서도 이 모드와 비슷한 조건의 빌딩 게임에 도움이 되는 퍼포먼스, 메모리 및 워크플로우의 최적화가 이루어졌습니다.

이 모든 개선점은 지금 바로 사용하실 수 있도록 퍼포스(Perforce) 및 깃허브(GitHub)에서 공개하였습니다. 이 중 많은 부분은 이번 달 언리얼 엔진 4.18에 탑재될 것이며, 나머지는 4.19에서 탑재될 것입니다.

데디케이티드 서버 퍼포먼스

첫 번째 도전은 데디케이티드 서버를 최적화하여 100명의 플레이어를 동시에 처리하고, 20hz를 유지하며, 대역폭을 최소화하는 것이었습니다.

서버는 매 프레임마다 플레이어 근처의 모든 액터에게 업데이트를 보냅니다. 즉, 각 플레이어에 대한 모든 연관 액터를 결정하고, 이 액터들에게 어떤 변경점이 생겼는지 파악하고, 해당 플레이어에게 이런 변경점을 포함한 패킷을 보내야 한다는 뜻입니다. CPU 시간과 대역폭을 최소화하기 위해서는 플레이어에게 좋은 경험을 제공하는데 필요한 최소한의 업데이트만을 보내야 했습니다.

이 작업 중 많은 부분은 게임 코드의 프로파일링 및 최적화 작업이었지만, 그 과정에서 엔진을 최적화할 수 있는 기회도 많이 발견하였습니다.

다음은 엔진을 위해 시행한 데디케이티드 서버 최적화 중 일부입니다:

  • 레벨 스트리밍 RPC(Remote Procedure Call - 원격 프로시저 호출)를 일괄 처리해 클라이언트가 접속했을 때 클라이언트에게 보내야 할 RPC의 숫자를 줄였습니다. (4.19에 적용 예정)
  • OS 소켓 버퍼 사이즈를 설정 가능하도록 만들고 배틀로얄에 맞게 증가시킵니다. 이것은 동시 접속한 클라이언트들이 이 버퍼를 오버플로우하여 과도한 서버 부하를 일으키는 결과를 방지합니다. (4.19에 적용 예정)
  • 캐릭터가 점프하거나 추락하는 등 어떤 컴포넌트 위에도 서 있지 않을 때는 CharacterMovement RPC를 위한 대역폭을 줄입니다. (4.19에 적용 예정)
  • 매 프레임마다 서버로부터 업데이트를 받는 플레이어들의 숫자를 제한할 수 있는 기능을 추가했습니다. 로비 내에서는 25로 제한했고 게임플레이 중에는 50으로 제한했습니다. (4.19에 적용 예정)
  • 클라이언트가 서버로 이동 업데이트를 보내는 속도를 제한합니다. 높은 프레임으로 실행중인 클라이언트가 서버에 과도한 부하를 일으키는 것을 방지합니다.  (4.17에 적용됨)
  • 클라이언트가 다른 클라이언트에게 핑 시간을 리플리케이트하지 못하게 하는 옵션을 추가해 플레이어들이 많이 있을 경우 많은 네트워크 트래픽을 일으킬 수 있는 결과를 방지할 수 있도록 했습니다. (4.19에 적용 예정)
  • FArchive::SerializeIntPacked 및 CompatibleChecksum 계산 방식 변경으로 리플리케이션 과정에서 몇몇 메모리 할당을 제거했습니다. (4.19에 적용 예정)
  • 리플리케이션 속도를 위해 프로퍼티 유형 비교를 스트링에서 FName으로 변경했습니다. (4.19에 적용 예정)
  • 클라이언트에서 데디케이티드 서버의 네트워크 상태를 실시간으로 볼 수 있는 방법을 추가해, 클라우드 호스팅 서버의 상태를 더 쉽게 볼 수 있게 하였습니다. (4.19에 적용 예정)
  • 어빌리티 시스템 수정을 통해 Relevancy(연관성)를 더 잘 체크할 수 있게 하여, 어빌리티 시스템을 사용할 때의 리플리케이션 비용을 크게 줄였습니다. (4.19에 적용 예정)

광활한 맵의 제작 및 렌더링

포트나이트: 배틀로얄의 플레이 가능한 맵은 5.5 제곱킬로미터입니다. 플레이어는 낙하하는 과정에서 전체 맵을 한 눈에 볼 수 있는데, 게임플레이에서 먼 거리의 시야를 지원하고 싶었습니다. 이를 위해서 레벨 오브 디테일 솔루션을 최적화해야 한다는 점을 알고 있었습니다.

Unreal+Engine%2FblogAssets%2F2017%2FOCTOBER+2017%2FFortnite+Battle+Royale+UE+Improvements%2FFNBR_SocialRangerTower-770x433-a1b2112ca6bf4445b2c912c3036fff21ca8193cb

우리는 엔진의 계층형 레벨 오브 디테일(Hierarchical LOD, HLOD) 기능과 심플리곤(Simplygon)을 병용해 맵의 지역들을 하나의 로우폴리 메시로 합쳐서, 맵이 멀리서 시야에 들어왔을 경우 단 한 번의 드로 콜로 그려질 수 있게 했습니다. 이 툴은 기존에 존재하던 것으로 이미 파라곤에서 사용했었지만, 아티스트들이 보다 효율적으로 작업할 수 있도록 변경해야 했습니다.

게임 맵은 아티스트들이 공동 작업을 할 수 있도록 분할이 되어 있어 HLOD 툴로는 메시 작업이 제대로 되지 않았습니다. HLOD가 이 작업방식을 더 잘 지원하도록 약간 변경했고, 맵 내 모든 HLOD를 리빌드할 수 있는 커맨드렛을 추가해 아티스트가 자기 PC에서 HLOD를 리빌드하지 않아도 되게 했습니다. (4.19에 적용 예정)

콘솔 출시

배틀로얄의 확장된 시야 거리와 플레이어 숫자는 콘솔에서 퍼포먼스 및 메모리 측면의 난관을 가져오기 때문에 이 점을 개선해야 했으며, 특히 메모리 관련 개선이 필요했습니다. 이 작업 중 많은 부분은 게임 콘텐츠의 최적화였지만 엔진 측면에서도 수많은 개선을 했습니다.

다음은 언리얼 엔진 4.18에 탑재될 콘솔 관련 개선사항입니다:

  • [XboxOne + PS4] 최적화 가능한 메모리를 더 쉽게 찾을 수 있도록 로우 레벨 메모리 트래킹 툴을 개선하였습니다.
  • [XboxOne + PS4] 더 효율적인 볼륨 텍스처 업데이트로 최대 메모리를 240MB 이상 줄였습니다.
  • [XboxOne] 다양한 렌더 타겟 레이아웃을 위한 옵션을 추가하여 활성화된 렌더링 기능에 따른 GPU 상 대역폭 활용을 최대화했습니다.
  • [XboxOne] D3D12 디스크립터 힙 내 메모리 오버헤드를 줄여, 120MB를 절약했습니다.
  • [XboxOne] 렌더 타겟을 필요 시에 즉시 할당 및 해제하여 메모리 사용을 100MB 이상 줄였습니다.
  • [PS4] 텍스처 스트리밍 처리 방식과 조각 모음 풀을 최적화하여, 300~400MB를 절약했습니다.

배틀 로얄을 작업하면서 특히 30Hz 게임들에 영향을 미치는 엔진 내 입력 지연 문제를 몇 가지 발견했습니다. 이 문제를 다루기 위해 스레드 동기화를 개선하여 지연시간을 66ms 가량 줄일 수 있었습니다(60Hz 타이틀에서의 감소량은 대략 절반이 될 것입니다). 이런 변화는 게임의 느낌에 뚜렷한 개선을 가져와, 좀 더 빠른 반응으로 목표물을 조준하는 것이 더 쉬워졌습니다. (4.19에 적용 예정)

앞으로 추가될 점!

위는 포트나이트: 배틀로얄의 첫번째 버전 출시에서 이루어진 엔진에서의 개선사항들입니다. 이러한 경험을 바탕으로 앞으로도 개선할 사항을 확인했습니다. 특히 대규모 맵 작업 시 레벨 스트리밍 및 에디터 퍼포먼스와 관련된 개선점들은 포트나이트 개발팀과 업계의 개발자가 보다 효율적으로 작업할 수 있게 해 줄 것입니다.