[게임 서버] 게임 입장

이정석·2023년 8월 29일

게임서버

목록 보기
1/14

게임입장

한 플레이어가 게임에 입장할 때 클라이언트와 서버 사이에는 입장요청부터 다른 플레이어의 정보까지 여러가지 정보를 주고받는다. 새로운 플레이어가 게임에 입장하는 상황을 나타낸 그림은 아래와 같다.

New Player는 서버에 게임에 입장한다는 요청을 보낸다. 서버는 기존에 있던 Player들에게 새로운 플레이어가 입장했다는 사실과 New Player에 대한 정보를 전송한다.

New Player는 기존에 있던 Player의 정보들을 받는데 서버가 가지고 있는 Player Info를 받는다. New Player가 정보를 받는 상황을 나타낸 그림은 아래와 같다.

게임을 어떻게 구현했는지에 따라 다르지만 가장 간단한 구조중 하나는 들어오는 요청을 무조건 OK하는 방식이다.

1. 패킷

클라이언트와 서버는 패킷을 주고받으면서 통신을 하는데 간단한 RPG게임에 입장할 때에 다음과 패킷종류를 설계할 수 있다.

  1. 입장패킷: 서버가 클라이언트에게 입장을 허가하는 패킷
  2. 소환패킷: 들어온 플레이어를 맵에 소환시키는 패킷으로 새로들어온 New Player는 기존의 Player들에 대한 정보를 받고 PlayerNew Player에 대한 정보를 받는다.
  3. 퇴장패킷: 서버가 클라이언트에게 퇴장을 허가하는 패킷
  4. 소멸패킷: 퇴장하고 싶은 클라이언트를 제외하고 다른 플레이어에게 누군가 퇴장하였음을 알리는 패킷으로 소멸패킷을 받은 클라이언트는 화면에서 해당 클라이언트의 캐릭터를 삭제할 수 있다.

클라이언트와 서버는 다음과 같은 내용을 구현한다.

  1. 패킷을 수신했을 때 발생할 이벤트
  2. 클라이언트-서버 간의 연결이 발생했을 때, 종료됐을 때, 메시지를 송수신했을 때의 이벤트
  3. 서버의 내부 게임로직

클라이언트가 서버에게 입장, 퇴장을 패킷으로 요청하는 구조도 가능하지만, 위의 상황은 Session이 연결됐을 때를 입장요청을 한것으로 연결종료되었을 때를 퇴장요청을 한것으로 간주한 상황이다.


서버

게임입장을 구현할 때 서버가 구현해야 할 내용은 다음과 같다.

  1. Player들을 저장할 공간
  2. 공간에 Player를 추가, 삭제하는 기능
  3. 클라이언트에 적절한 패킷 전송
  4. Player에 대한 정의

서버는 공간이 여러개가 있다면 공간을 구별할 ID가 있어야 하며 Player역시 구분하기 위한 ID가 필요하다. 이외에도 Player에 대한 부가적인정보는 DB에 저장할 수 있다.

Player들을 저장할 자료구조는 멀티쓰레드환경에서 상호배제를 구현하기 위해 lock을 사용할 수 있고 누군가가 입장, 퇴장할 때 lock을 해줌으로 문제가 발생하지 않게 해야한다.


클라이언트

클라이언트가 게임입장을 구현할 때는 패킷이벤트를 구현해야 한다.

  1. 입장패킷: 클라이언트는 입장을 허가받았으므로 서버가 지정한 정보를 토대로 Player를 생성한다.
  2. 소환패킷: 서버로부터 받은 Player들에 대한 정보를 바탕으로 자신 또는 다른 플레이어의 모습을 랜더링한다.
  3. 퇴장패킷: 클라이언트는 퇴장을 허가받았으므로 퇴장에 대한 추가작업을 한다.
  4. 소멸패킷: 서버로부터 받은 퇴장한 Player의 ID를 확인해 랜더링 목록에서 제외한다.

위 상황의 클라이언트에서 가장 중요한 것은 패킷에 대한 Action이 자신에 대한 내용인지 다른 플레이어에 대한 내용인지 확인하는 것이다. 같은 소환패킷이어도 자신을 소환하는 것인지 다른 사람을 소환하는 것인지에 따라 클라이언트에서 실행할 코드가 달라지기 때문이다.

profile
게임 개발자가 되고 싶은 한 소?년

0개의 댓글