개요
네트워킹, 즉 게임 내 리플리케이션은 인터넷 연결을 통해 다수의 머신 사이에서 게임플레이 정보를 커뮤니케이션하는 기능을 말합니다. 언리얼 엔진에는 개발자가 간편하게 멀티플레이어 게임을 제작할 수 있도록 도와주는 견고한 네트워킹 프레임워크가 탑재되어 있습니다.
네트워크 피직스 는 네트워킹 프레임워크의 일부로, 멀티플레이어 환경에서 피직스 기반 시뮬레이션을 작동 가능하게 합니다. 언리얼 엔진에서 피직스 리플리케이션은 리플리케이트된 이동으로 피직스를 시뮬레이션하는 액터를 말합니다. 이러한 시뮬레이션은 게임플레이 중에 로컬 클라이언트(플레이어의 머신)에서 실행됩니다.
기존 네트워크 피직스의 가장 큰 문제는 충돌할 때의 시뮬레이션 오브젝트 간 인터랙션입니다. 오브젝트가 더 빠르게 이동할수록, 그리고 네트워크 지연시간(네트워크 연결 속도)이 클수록, 이러한 인터랙션을 리플리케이트하는 것이 더 어려워집니다. 이러한 문제로 인해 게임 내에서 실제로 시뮬레이션할 수 있는 대상에 제한이 생깁니다.
언리얼 엔진의 네트워킹에 대한 자세한 설명은 문서의 네트워킹 및 멀티플레이어 섹션을 참조하세요.
기본 리플리케이션 모드
기본 리플리케이션 모드는 언리얼 엔진의 레거시 피직스 리플리케이션 모드입니다. 이 모드는 이동을 리플리케이트 하는 액터에서 활성화되며, 해당 루트 컴포넌트 는 피직스를 시뮬레이션 하도록 설정됩니다.
이 모드는 해당하는 시점에 클라이언트의 각 오브젝트 속도를 서버의 오브젝트 속도에 맞추도록 변경하는 방법으로 시뮬레이션을 리플리케이트합니다. 클라이언트가 서버 권한 오브젝트에서 데이터를 수신하는 데 라운드 트립 시간(Round Trip Time, RTT)의 절반이 소요됩니다. 현재 서버에 위치한 오브젝트를 리플리케이트하기 위해, 라운드 트립 시간의 절반 동안 수신된 스테이트 데이터를 예측합니다.
이러한 형식의 리플리케이션에서는 다음 두 가지 요소를 고려합니다.
- 클라이언트의 오브젝트 위치와 예측된 서버의 위치 사이 위치 오프셋
- 서버의 오브젝트 속도
그런 다음 오브젝트의 위치 오프셋을 원하는 보정 시간으로 나눕니다. 이렇게 도출된 속도(거리/시간)가 오브젝트의 서버 속도에 더해집니다. 그 결과로 원하는 보정 시간에 대한 오브젝트의 위치 보정을 얻을 수 있습니다.
기본 리플리케이션 모드에서는 인터랙션이 원활하게 처리되지 않는데, 오브젝트 속도, 위치 또는 회전의 로컬 변경 값이 서버의 오브젝트 속도에 의해 덮어쓰이기 때문입니다. 이에 따라 로컬 인터랙션이 발생하더라도 클라이언트에서 오브젝트의 위치가 보정됩니다.
예측 보간 모드
예측 보간 리플리케이션 모드는 서버 권한 액터를 위해 고안되었습니다. 이 모드는 기본 모드와 유사하게, 해당하는 시점에 클라이언트의 각 오브젝트 속도를 서버의 오브젝트 속도에 맞추도록 변경하는 방식으로 작동합니다. 하지만 이 모드는 클라이언트에서 인터랙션과 로컬 피직스 변경 값을 더 잘 처리하도록 설계되었습니다. 예측 방식으로 수행되어 서버와 클라이언트에서 동일하게 적용되기만 하면 됩니다.
이 모드는 오브젝트의 최종 속도를 계산할 때 오브젝트의 로컬(클라이언트) 속도뿐만 아니라 오브젝트의 서버 속도까지 고려합니다. 또한 RTT라고도 하는 라운드 트립 시간(지연시간) 및 현재 전송 속도 시간 간격(클라이언트가 서버에서 데이터를 수신할 때의 시간 간격)을 기반으로 보정을 처리합니다.
그 결과, 서버가 포스의 결과를 클라이언트로 다시 전송하기에 앞서 클라이언트가 예측한 동일한 포스를 오브젝트에 적용할 수 있는 피직스 시뮬레이션이 이뤄집니다. 클라이언트는 푸시와 같은 방식으로 오브젝트와 인터랙션할 수도 있습니다.
한 가지 유의할 점은 지연시간이 크거나 속도가 높을수록 피직스 리플리케이션의 퀄리티가 저하된다는 것입니다. 하지만 리플리케이션 세팅을 통해 프로젝트에 맞게 균형점을 찾아갈 수 있습니다.
재시뮬레이션 모드
재시뮬레이션 리플리케이션 모드는 서버 권한 폰 및 액터를 위해 고안되었습니다.
재시뮬레이션은 클라이언트에서 완전히 예측됩니다. 즉, 클라이언트가 서버보다 라운드 트립 시간(RTT) 절반만큼 앞서 작업을 수행합니다.
이 모드는 피직스 폰의 작동을 가능하게 하고, 클라이언트에서 피직스를 완전하게 예측할 수 있도록 하여 멀티플레이어 모드에서 더 정확하게 인터랙션을 처리할 수 있도록 설계되었습니다. 클라이언트는 서버보다 라운드 트립 시간(RTT) 절반만큼 앞서며, 서버에서 수신되는 확인 데이터보다 1회의 완전한 RTT만큼 앞섭니다. 따라서 피직스 시뮬레이션이 최소 RTT 1회만큼의 시간 동안 각 피직스 틱마다 피직스 스테이트의 히스토리를 캐시해야 하므로, CPU와 메모리를 소모하게 됩니다.
클라이언트가 서버에서 스테이트 정보를 수신하면, 해당하는 피직스 프레임에서 수신한 정보를 히스토리의 캐시된 피직스 스테이트와 비교합니다. 스테이트 정보가 충분히 다른 경우 피직스 재시뮬레이션을 트리거합니다.
재시뮬레이션은 피직스 시뮬레이션을 캐시된 히스토리 스테이트로 되돌리고, 수신 서버 스테이트를 기반으로 오류를 보정한 다음, 현재 피직스 틱까지 피직스를 다시 시뮬레이션하는 방법으로 이루어집니다.
재시뮬레이션 종료 시점에서 오브젝트는 재시뮬레이션 전과 다른 스테이트가 될 수 있으며, 이로 인해 오브젝트의 위치 스내핑이 발생할 수도 있습니다. 이 경우 재시뮬레이션 모드가 현재 스테이트에서 새 스테이트로 오브젝트의 렌더링을 보간합니다.
다른 액터가 예측 보간을 실행할 때, 동시에 액터 및 폰에서 재시뮬레이션을 사용할 수 있습니다. 목표는 두 가지 서로 다른 리플리케이션 모드를 실행하는 액터 간에 인터랙션을 원활하게 처리하는 것입니다. 예측 보간을 통해 리플리케이트된 액터는 재시뮬레이션을 통해 리플리케이트된 액터와 비교해 성능이 더 뛰어나고 네트워크를 덜 사용합니다.
피직스 폰은 플레이어 입력이 피직스 포스를 통해 폰을 이동하게 하는 방식으로 작동합니다. 이러한 입력은 네트워크 피직스 컴포넌트에 의한 재시뮬레이션 중에 적용됩니다.
네트워크 피직스 컴포넌트는 네트워킹, 히스토리 캐싱, 입력 재시뮬레이션, 폰 및 액터의 커스텀 스테이트를 처리합니다. 네트워크 피직스 컴포넌트는 로우 레벨 시스템으로, C++를 통해 수동으로 구현해야 합니다.
네트워크 피직스 세팅
프로젝트 세팅(Project Settings) 의 피직스(Physics) 카테고리에서 여러 네트워크 피직스 세팅을 수정할 수 있습니다.
또한 네트워크 피직스 리플리케이션 모드를 사용 중인 모든 액터에 네트워크 피직스 세팅 컴포넌트를 추가하여 피직스 리플리케이션 세팅을 오버라이드할 수 있습니다.
콘솔 명령 을 통해 네트워크 피직스 세팅을 추가로 환경설정할 수도 있습니다. 콘솔에 np2.PredictiveInterpolation 을 입력하여 예측 보간 의 전체 옵션을, np2.Resim 및 p.Resim 을 입력하여 재시뮬레이션 의 전체 옵션을 볼 수 있습니다.