네트워크/게임 서버 프로그래밍

[게임 서버][4장]게임 서버와 클라이언트

우향우@ 2023. 3. 21. 22:20

개요

멀티플레이 게임을 구현하는데는 여러가지 방법이 있지만 보통 서버와 클라이언트로 나누어 개발하는 것이 대부분이다. 보통 서버는 클라이언트로부터 요청을 받아 응답해주며 클라이언트는 유저의 조작을 서버로 보내고 서버로부터 받은 데이터로 게임을 진행한다.

서버와 클라이언트 역할분담

멀티플레이가 없는 싱글 플레이게임은 다음과 같은 게임 루프로 작동한다.

  1. 입력 받기
  2. 게임 로직 처리
  3. 렌더링

멀티 플레이가 있는 게임에서는 게임 로직 처리중 일부를 서버가 대신 처리해주게 된다. 여기서 데미지 판정같이 공정해야하는 부분은 서버에서 처리하며 최적 경로 탐색 등 클라이언트에서 계산해도 문제가 생기지않는 로직들은 클라이언트에서 처리하게 된다. 서버에서 많은 로직을 처리하고 클라이언트에서는 정보를 받아 렌더링만 하는 정도가 커진다면 치트나 핵등의 편법에 강하지만 서버 연산량이 증가할 것 이다. 반대로 클라이언트에서 많은 로직을 처리하고 서버가 적은 로직을 처리한다면 서버 연산량은 낮지만 치트나 핵등의 편법에 약해질 수 있다.

극단적으로 모든 로직을 서버에서 처리하고 클라이언트에서 렌더링만 한다면 편법은 대부분 막을 수 있지만 서버 연산이 극단적으로 많아질 수 있다.

서버와 클라이언트 상호작용

보통 서버와 클라이언트는 다음과 같이 작동한다.

  1. 클라이언트의 요청으로 서버와 클라이언트가 연결된다.
  2. 클라이언트와 서버가 서로 주기적인 정보와 비주기적인 정보를 교환하며 동기화한다.
  3. 접속이 끊기면 연결을 종료한다.

이동같은 정보는 서로 주기적으로 통신한다. 여러가지 방법이 있지만 보통 다음 방법을 사용한다. 클라이언트에서 자신의 이동정보를 자신의 타이머에 따라 일정간격으로 서버에 보낸다. 서버에서는 이동이 정상적인지 판단 후 정상이면 서버 메모리에 위치 정보를 갱신한다. 서버에서도 자신의 타이머에 따라 일정간격으로 모든 클라이언트들에 필요한 다른 클라이언트들의 위치정보를 모두 보내준다.

여기에 공격 요청같은 비주기적인 메세지도 존재할 수 있는데 이는 받는 즉시 판정 후 관련 클라이언트들에게 결과를 알려주거나 받는 즉시 판정 후 결과를 서버 메모리에 저장했다가 타이머에 맞춰 결과를 전파하는 등으로 구현할 수 있다. 서버 구현 방식에 정답은 없으며 상황에 따라 적절하게 구현하면 된다.

서버의 품질

게임 서버의 품질은 다음 네가지가 있다.

안정성 : 서버가 얼마나 죽지 않는가

확장성 : 사용자 수용량 수를 얼마나 쉽게 올릴 수 있는가 (보통 여러 서버 머신을 동시에 많이 작동시킬 수 있을 수록 확장성이 좋다.)

성능 : 서버의 처리 속도

관리 편의성 : 서버 관리 인터페이스가 얼마나 잘 제공되는가

서버 구동 환경

서버 구동 환경은 대표적으로 두가지가 있다.

  1. 데이터 센터 (온프림 서버)

특정 서버 하드웨어에 직접 운영체제를 깔아 관리하는 자체 서버이다. 특정 목적을 위해 준비된 서버로써 성능은 좋지만 서비스 이용자 수의 급격한 변화에 대한 유연성과 초기 설치 비용이 단점이다.

2. 클라우드

다양한 운영체제를 제공할 목적으로 제작된 클라우드 서비스 사의 서비스를 대여하여 클라우드 하드웨어 위에 가상머신으로 필요한 운영체제를 구동하여 관리하는 서버이다. 데이터 센터에 비해 가격 대비 성능은 떨어지지만 확장 유연성이 좋고 언제든 서비스 이용을 그만 들 수 있다는 것이 장점이다.

P2P

서버-클라이언트 구조외에 클라이언트끼리 직접 통신하는 P2P라는 구조도 존재한다. 여기서 실제 클라이언트끼리만의 통신으로 순수 P2P로 구현된 게임도 있지만 보통 P2P 관계를 맺어주는 역할을 하는 서버가 존재한다. 또한 복합적으로 P2P통신과 서버 통신을 동시에 사용하는 구조도 존재한다.

참고서적

게임 서버 프로그래밍 교과서