: 네트워크 지연에 영향 없이 게임을 부드럽게 이어가도록 하는 기술
과정
Client 입력 → 로컬 캐릭터 이동(Prediction) + Server에게 위치와 TimeStamp 등을 Struct로 저장해서 전달
Server Simulation : Client에게서 받은 이동이 가능한지 Valid한지 확인하고 이동 → 결과값을 Client에게 전달
Client는 Server에서 받은 값과 Prediction 값을 비교해보고 차이가 있으면, Server의 값으로 보정
Smoothing : Client의 Prediction값과 Server의 보정값이 다른 경우, 불연속적인 이동(순간이동)을 완화하는 기법 - Interpolation(보간) 사용
다른 플레이어 캐릭터의 Smoothing : 다른 플레이어의 캐릭터의 위치에 대해 Replication 받고, 해당 위치로 바로 옮겨버리면 순간 이동하는 것 처럼 보일거임. 이 때도 Interpolation을 사용하여 완화
Interpolation이 필요한 이유는 Replication으로 어떤 시점(Tn)에서의 Location을 받기 때문임
: Client-side Prediction 결과와 Server의 연산 결과간의 차이가 있을 때 Client의 상태를 Server의 결과로 보정하는 것
위 Prediction 과정의 2, 3번
Client가 Server로부터 Replication 받으면
Unreal Engine에서 Prediction과 Reconciliation을 구현해놓은
CharacterMovementComponent
의 소스 코드를 보면 주석에 이런 말이 있음
실제로ClientUpdatePositionAfterServerUpdate()
함수를 보면
- 저장해놓은 이동을 실행하도록 함
Gameplay Ability System(GAS)에도 이런 Prediction과 Reconciliation 메커니즘이 내장되어 있음
⚠️ 주의
Reconciliation은 Prediction과 네트워크 지연에 따른 게임의 불공정성을 줄이고, Server의 값을 신뢰해야한다는 Server-Client 구조를 만족하기 위한 과정임
하지만, 자주, 크게 Reconciliation이 되면 플레이어 입장에서는 오히려 Lag이 걸리는 것처럼 보임
=> 보정이 필요한 상황 ↓ = Replication ↓
=> 보정이 발생하더라도 Interporlation(보간)을 사용해 부드럽게 적용시켜야함(Smoothing)
▶️ Prediction과 Reconiliation을 통해 즉각적으로 반응하는 플레이가 가능하고, Server와의 동기화도 되면서 부드러운 움직임을 화면으로 볼 수 있게됨
Lag : 플레이어의 행동과 서버의 응답 사이에 눈에 띄는 지연 현상
Lag Compensation : 공격 판정을 처리할 때 네트워크 지연 때문에 생기는 불공정한 상황을 보정해주는 기술
Client-Authoritative Hit Detection : Client의 결과값을 Server로 RPC 보냈을 때, Server는 약간의 검증만하고 그 결과를 신뢰하여 사용하는 방식
참조 사이트
1. https://www.linkedin.com/pulse/multiplayer-client-side-prediction-server-demystified-zack-sinisi-p2efe
2. https://www.linkedin.com/pulse/multiplayer-lag-compensation-demystified-zack-sinisi-5l5fc/?trk=article-ssr-frontend-pulse_little-text-block
3. https://www.youtube.com/watch?v=2kIgbvl7FRs
4. https://www.youtube.com/watch?v=Fn269cI3hd8