[게임 서버] Zone

이정석·2023년 9월 17일

게임서버

목록 보기
11/14

Zone

대형 구조에 대해서 다뤘을 때 오픈월드 환경에서 Zone을 나누어 같은 Zone에 있는 다른 플레이어들에게만 패킷을 전송하는 구조를 아래 그림과 함께 이야기를 했었다.

하지만, 굳이 오픈월드가 아니어도 매우 넓은 맵에서 Zone의 개념을 사용할 수 있다. 물론 사용자가 입장, 퇴장, 이동
할 때마다 해당 정보를 플레이어가 포함된 Zone을 찾아 해당 Zone에 있는 모든 플레이어에게 Broadcast해야한다.

Zone의 크기가 적을수록 한 맵의 Zone의 영역은 많아지게 되고 클수록 Zone의 효율이 적어지게 되는데 이를 위해 AOI(Area Of Interest)를 사용한다. 즉 한 플레이어는 다른 플레이어의 정보를 같은 Zone에 있어도 AOI의 영역 밖이라면 받지 않는다.

아래 그림에서 녹색 사각형은 AOI를 의미하고 원은 플레이어를 의미하는데 빨간색 플레이어는 하늘색 플레이어의 정보는 받지 않으며 파란색 플레이어의 정보를 받는다.

1. 입장

원래의 플레이어가 입장할 때 연산 순서는 다음과 같다.

  1. 입장 요청
  2. 플레이어의 정보(아이템, 스텟)확인
  3. 저장된 정보를 바탕으로 플레이어 생성
  4. 다른 플레이어에게 새로운 플레이어가 입장했음을 Broadcast

여기에 Zone과 AOI를 적용하면 3번과 4번사이에 새로운 플레이어가 입장해야할 Zone을 찾고 다른 플레이 중 AOI 범위에 해당되는 플레이어에게만 Broadcast해야한다.

  1. 입장 요청
  2. 플레이어의 정보(아이템, 스텟)확인
  3. 저장된 정보를 바탕으로 플레이어 생성
  4. 생성될 플레이어 위치와 AOI 크기를 감안해 Broadcast할 Zone을 탐색
  5. 탐색된 Zone에 있는 플레이어 중 AOI 범위 내에 새로운 플레이어의 위치가 포함되는 플레이어에게만 Broadcast

4번 내용을 보면 Broadcast할 Zone이 여러개가 나올 수 있는 상황이 발생할 수 있음을 예상할 수 있는데 아래 그림과 같은 상황이라면 2개 이상의 Zone이 나올 수 있다.

2. 퇴장

퇴장같은 경우는 원래 같은 맵에 있는 모든 플레이어에게 Despawn 패킷을 보냄으로 게임을 떠났음을 알리는 방식을 사용하였다. Zone과 AOI를 적용하면 모든 플레이어에게 패킷을 보내는 것이 아닌 입장과 동일하게 Zone 탐색과 AOI 범위내에 있는 플레이어들에게 Broadcast를 하는 방식으로 구현할 수 있다.

  1. 퇴장 요청
  2. 퇴장할 플레이어 위치와 AOI 크기를 감안해 Broadcast할 Zone을 탐색
  3. 탐색된 Zone에 있는 플레이어 중 AOI 범위 내에 새로운 플레이어의 위치가 포함되는 플레이어에게만 Broadcast

3. 이동

이동에서 Zone을 적용할 때 가장 까다로운 점은 'Zone의 변경'이다. Zone은 어떻게 설계하는지에 따라 다르겠지만 Zone에 포함되어 있는 플레이어들의 목록을 가지고 있을 경우가 있다. 플레이어가 Zone의 경계선을 넘어 다른 Zone으로 이동할 때에 기존의 Zone에는 자신이 떠났음을 알려야하고 새로운 Zone에는 자신이 들어왔음을 알려주어야 한다.

  1. 이동 요청
  2. 유효성(충돌, 이동속도 등)확인 후, 플레이어의 위치 변경
  3. 플레이어의 기존위치와 도착위치의 Zone의 변경 확인
  4. Zone의 플레이어 정보 수정 및 Broadcast할 Zone을 탐색
  5. 탐색된 Zone에 있는 플레이어 중 AOI 범위 내에 새로운 플레이어의 위치가 포함되는 플레이어에게만 Broadcast
profile
게임 개발자가 되고 싶은 한 소?년

0개의 댓글