포트나이트: 배틀로얄이 뭔가요?
에픽게임즈는 최근 포트나이트: 배틀로얄에서 새로운 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 제곱킬로미터입니다. 플레이어는 낙하하는 과정에서 전체 맵을 한 눈에 볼 수 있는데, 게임플레이에서 먼 거리의 시야를 지원하고 싶었습니다. 이를 위해서 레벨 오브 디테일 솔루션을 최적화해야 한다는 점을 알고 있었습니다.
우리는 엔진의 계층형 레벨 오브 디테일(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에 적용 예정)
앞으로 추가될 점!
위는 포트나이트: 배틀로얄의 첫번째 버전 출시에서 이루어진 엔진에서의 개선사항들입니다. 이러한 경험을 바탕으로 앞으로도 개선할 사항을 확인했습니다. 특히 대규모 맵 작업 시 레벨 스트리밍 및 에디터 퍼포먼스와 관련된 개선점들은 포트나이트 개발팀과 업계의 개발자가 보다 효율적으로 작업할 수 있게 해 줄 것입니다.