온라인 게임과 네트워크 구성(1)

주상돈·2025년 3월 10일

TIL

목록 보기
36/53

온라인 게임의 종류

온라인 게임은 여러명의 사용자가 하나의 콘텐츠(Contents)를 공유하는 게임을 말한다. 장르를 떠나, 크게 보면 실시간과 어싱크 방식 2가지로 나뉘며, 실시간은 온라인 서버(클라우드) 환경과 LAN 파티 환경으로 나뉜다.

싱크 - 동기, 어싱크 - 비동기(주로 모바일 게임)

CAP 이론과 게임의 동기화

CAP 이론 이란?

  • 분산 시스템의 동기화 “조건 3개를 모두 만족하는 시스템은 없다”는 이론.

Consistency (일관성)

  • 전체 시스템은 동일한 상태 값을 갖고 있어야 합니다.

Availability (가용성)

  • 언제든지 시스템에 접근하여 값을 읽고 쓸수 있어야 합니다.

Partition Tolerance (분할 용인)

  • 시스템을 분할하여 병렬처리 등이 가능해야 합니다.

게임에서의 동기화 방법

초기 온라인 게임은 일관성을 유지하고 “가용성을 포기”해서, 사용자의 입력을 서버로 보내서 일정 시간(Round 또는 Tick : 0.333~X 초)마다 클라이언트로 브로드캐스팅(Broadcasting) 하여 수신 받은 이벤트로 게임 클라이언트의 상태를 업데이트 처리한다.

클라이언트

  • 서버 접속

서버

  • 모든 클라이언트 게임 접속후 게임 시작 (상태초기화)

클라이언트 A, B

  • 이벤트 발생 (이동, 발사, 점프 등등)

서버

  • 이벤트 수집후 Round (또는 Tick) 마다 브로드캐스팅

클라이언트 A, B 업데이트

⇒ 빠른 반응 속도가 필요 없을 때 비교적 쉽게 구현 가능.

이후에 다수의 사용자가 게임을 동시 실행하는 MMO, FPS, Sports 와 같이 반응성이 우선인 게임 장르의 경우 기본적인 캐릭터의 이동 등은 Round (또는 Tick)을 짧게 브로드캐스팅(Broadcasting)하고, 실시간 으로 별도의 채널을 통해 다중 브로드캐스팅 방식으로 진화해옴.

아래 그림은 Tick/Round로 기본정보 (Transform 위치, 회전 등의 정보)를 주기적으로 보내면서 추가적으로 이벤트를 보내는 동작을 나타냄.

⇒ 사용자가 컨트롤(Control)하고 있는 클라이언트를 먼저 업데이트하기 때문에 가용성을 우선하고, 일관성은 포기.

가용성 보정

가용성을 포기하고 일관성을 우선으로 하는 CP (또는 PC)설계의 대표적인 게임이 스타크래프트로, 만약 게이머가 “마린”을 움직였다고 가정해 보자.

1. 마우스를 클릭한다.

2. 게이머에게 피드백하면서, 서버에 이벤트를 전송한다.

3. 서버가 브로드캐스팅한 데이터로 클라이언트가 상태를 업데이트 한다.

이때 플레이어가 입력한 이벤트 시간과 서버에서 오는 데이터를 수신하는 시간 간의 Gap이 발생한다.

그래서 옛 게임들은 클라이언트 업데이트 이전에 플레이어에게 사운드나 이펙트로 줘서 기다리는 시간이 없는 것처럼 위장했다.

  • Hearts stone, 체스, 장기, 고스톱 ⇒ 플레이어의 입력이 끝날 때까지 다른 플레이어의 입력 차단.
  • 스타크래프트 ⇒ 일정 시간 동안의 이벤트를 모았다가 브로드캐스팅.
  • CP 설계의 특징은 가용성이 떨어지는 경우 세션을 폭파시키고 남은 플레이어가 승리가 된다.

일관성 보정

일관성을 포기하고 가용성을 우선으로 하는 AP(PA) 설계의 대표적인 게임 최근에 등장하는 게임들은, 게임 클라이언트를 우선 업데이트하고, 후에 일관성을 보정하는 방법을 사용한다.

이 때문에 응답속도(Latency)가 낮을 경우 게임을 하다 보면 뒤에 잘 숨었는데 뒤늦게 죽는 경우나, 갑자기 캐릭터가 뒤로 가는 경우 등이 발생

  • 포트나이트 ⇒ 클라이언트 예측, 서버 조정을 사용.
    • 예측과 서버 값이 맞으면 그대로 진행한다.
    • 예측과 서버 값이 틀리면 서버값으로 반영한다.
  • AP 설계의 특징은 특정 플레이어가 Latency 가 떨어지더라도 세션을 그대로 유지.

클라이언트 보간(Interpolation)

일반인들의 상식과는 다르게 네트워크는 강하게 결합되어 있지 않으며, 불안정한 전기 신호이다.

따라서, 1/20 초 마다 브로드캐스팅되는 데이터가 클라이언트에서 1/20초 마다 도달한다고 생각하면 문제가 사용자경험(UX)에 좋지 않은 영향을 주기 때문에 클라이언트에서는 보간을 한다. (Unreal은 자동)

1️⃣ 서버 데이터 수신

  • 서버는 일정 간격(예: 50ms마다)으로 캐릭터의 위치를 클라이언트에 전송합니다.
  • 예: t=0초에 (x=0, y=0), t=0.05초에 (x=5, y=0).

2️⃣ 클라이언트 버퍼링

  • 클라이언트는 수신된 위치값을 바로 렌더링 하지 않고, 약간의 지연(예: 100ms)을 두고 버퍼에 저장합니다.
  • 이는 네트워크 지터(Jitter, 패킷 도착 시간 변동)를 보정하고 보간에 사용할 데이터를 확보하기 위함입니다.

3️⃣ 보간 계산

  • 클라이언트는 두 위치값 사이를 시간 비율에 따라 계산합니다.
  • 예: t=0.025초일 때, (x=0, y=0)와 (x=5, y=0) 사이를 보간하면 중간 위치 (x=2.5, y=0).

4️⃣ 렌더링

  • 매 프레임(예: 60FPS, 약 16.6ms 간격)마다 보간 된 위치를 화면에 반영해 부드러운 이동 구현합니다.

0개의 댓글