언리얼 엔진 본캠프 19주차-3 언리얼 엔진 네트워크 : 최적화 - Prediction & Reconciliation

정재훈·2025년 4월 23일
0

unreal engine

목록 보기
39/45

1. Client Prediction and Smoothing

: 네트워크 지연에 영향 없이 게임을 부드럽게 이어가도록 하는 기술

  • Client가 캐릭터를 움직이면, Server에서 연산한 결과를 받고나서 움직이는게 아니라 일단 즉시 움직임
    • 이후 Server의 값을 받으면 해당 값으로 보정(Reconciliation)

과정

  1. Client 입력 → 로컬 캐릭터 이동(Prediction) + Server에게 위치와 TimeStamp 등을 Struct로 저장해서 전달

  2. Server Simulation : Client에게서 받은 이동이 가능한지 Valid한지 확인하고 이동 → 결과값을 Client에게 전달

  3. Client는 Server에서 받은 값과 Prediction 값을 비교해보고 차이가 있으면, Server의 값으로 보정

  4. Smoothing : Client의 Prediction값과 Server의 보정값이 다른 경우, 불연속적인 이동(순간이동)을 완화하는 기법 - Interpolation(보간) 사용

  5. 다른 플레이어 캐릭터의 Smoothing : 다른 플레이어의 캐릭터의 위치에 대해 Replication 받고, 해당 위치로 바로 옮겨버리면 순간 이동하는 것 처럼 보일거임. 이 때도 Interpolation을 사용하여 완화

Interpolation이 필요한 이유는 Replication으로 어떤 시점(Tn)에서의 Location을 받기 때문임

  • Interpolation을 사용하지 않는다고 가정하면, Replication되었을 때 캐릭터들은 해당 Location으로 순간이동할 것임
  • 서버의 보정값과의 차이가 있거나, 상대 플레이어가 움직였을 때, 차이와 거리의 크기가 작으면 순간이동을 해도 별 표시가 안날거임
  • 근데 크기가 크다면 꽤나 순간이동한 것처럼 보일것임. 그럼 대부분의 게임 상황에서 캐릭터가 순간이동을 하면 플레이어들은 이상하게 느낌
  • 이러한 경험을 줄이고자 이전 위치에서 새로운 위치까지 Interpolation을 사용해서 부드럽게 이동시키는 것

2. Server Reconciliation

: Client-side Prediction 결과와 Server의 연산 결과간의 차이가 있을 때 Client의 상태를 Server의 결과로 보정하는 것

위 Prediction 과정의 2, 3번

Client가 Server로부터 Replication 받으면

  1. 해당 값을 신뢰하고, 해당 값으로 덮어 씀
    • 이러면 네트워크 Latency 때문에 Client는 약간의 과거로 돌아가게 됨
  1. 보류 입력 재적용
    • 과거로 돌아가는 것과 이후 입력을 보장하기 위해, 클라이언트는 자신의 입력을 저장해놓고, 서버에서 받은 값을 반영한 다음 그 이후 타임스탬프의 입력에 대한 행동을 재실행

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와의 동기화도 되면서 부드러운 움직임을 화면으로 볼 수 있게됨


3. Lag Compensation & Hit Detection

Lag : 플레이어의 행동과 서버의 응답 사이에 눈에 띄는 지연 현상

  • 게임할 때 렉 걸린다고 할 때, 그 렉임
    • "네트워크 상태"나 "컴퓨터 성능"에 따라 발생

Lag Compensation : 공격 판정을 처리할 때 네트워크 지연 때문에 생기는 불공정한 상황을 보정해주는 기술

  • Server는 매 프레임 모든 플레이어의 위치/상태를 기록하고 일정 시간(100ms ~ 500ms)동안 저장해둠
  • Server는 Client의 공격 순간 타임스탬프를 보고 공격한 순간의 상황으로 월드를 재구성한 다음, 계산을 해보고 피격 판단을 함
    • 모든 월드를 재구성한다기보다, 캐릭터들만 잠시 옮겨볻다던가, 캐릭터 크기의 가상의 Hit Box를 만들어서 계산
  • 이후 월드를 현재 상태로 복구

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

profile
드가자

0개의 댓글