[게임 서버] 대형 구조 관리

이정석·2023년 9월 14일

게임서버

목록 보기
10/14

대형구조

MMORPG에서는 한 공간에 얼마나 많은 유저가 모여있는지가 관건이다. 대표적인 문제는 패킷을 Broadcast하는 문제인데 사람이 늘어날수록 보내야 하는 패킷의 양은 점점 더 많아지게 된다.

사람이 N명이 있을 때, 사람 한명의 움직임은 N명에게 해당 정보를 보내야 하며 몬스터나 NPC와 같은 NonPlayer Object에 대한 움직임에 대한 정보를 N명의 사람에게 전송해야한다.

MMORPG의 경우 여러 플레이어들을 하나의 Room에 넣어 관리하는 구조를 가질 수 있는데 Room은 각 플레이어의 이동정보와 같은 Broadcast해야 할 요소들을 다른 플레이어들에게 전달하는 PlayerManage를 수행한다.

Room의 단위는 RPG게임마다 다르겠지만 대륙단위 일수도 있고 지역단위, 채널단위가 될 수 있다. Room 역시 하나가 될 수 있고 여러개가 될 수 있다. 이를위해 Room을 관리하는 Room Manager를 배치하는 방법도 존재한다. RoomManager의 구조는 아래 그림과 같다.

새로운 플레이어가 연결될 때 Room Manager에게 New Player를 특정한 Room에 바치하도록 넘겨주는 방식으로 구현할 수 있으며 Player의 지역 이동으로 인한 Room간의 교환방식 역시 Room Manager를 통해 구현할 수 있다.

1. 오픈월드환경

Seamless 게임이라고도 불리는 오픈월드환경에서는 어떻게 이를 처리할 수 있을까? 우선 포탈같은 맵이동 Obejct가 아닌 걸어서 지역이동이 가능한 구조는 아래 그림과 같이 나타낼 수 있다.

사각형은 맵을 나눈 경계를 의미하고 같은 색의 원은 같은 지역에 있는 플레이어들을 의미한다. 위의 내용대로라면 같은 색깔의 플레이어의 정보는 Broadcast되지만 경계선 근처에 있는 서로 다른 색깔의 플레이어들의 경우 서로의 정보를 받을 수 없다.

이를 위해 경계선에 있는 Object를 특별처리를 하거나 인접한 Room에도 Broadcast를 할 수 있다. 하지만 인접한 Room에도 Broadcast를 한다는 것은 네트워크 낭비가 될 확률이 크다.

거기다가 플레이어가 두 영역을 반복해서 움직이는 경우 순서보장관련 문제가 발생할 수 있다. 한 영역은 플레이어들이 많아 처리해야할 Job들이 많지만 다른 한쪽이 플레이어가 없어 Job의 응답속도가 빠른 상황이 발생할 수 있다.

다른 방법 중 하나는 플레이어에 대해 서버는 주변의 정보만 전송하는 방법이 있다. 물론, 서버는 주변에 있는 플레이어의 목록을 각 플레이어마다 계산해주어야 하지만 적용함으로 아낄 수 있는 네트워크 자원을 생각하면 매우 큰 이득이 될 수 있다.

2. 쓰레드 관리

응답속도 개선을 위해 가장 중요한 것 중 하나는 '게임 로직을 처리하는데 걸리는 시간을 최소화 시키는 것'이다. 게임입장, 퇴장, 충돌판정, 몬스터이동과 같은 인게임로직은 어쩔 수 없이 내부에 lock을 잡음으로 하나의 쓰레드만 Resource에 접근하도록 해야한다.

데이터베이스에 변경을 적용하거나, Session을 통해 클라이언트에게 패킷을 전송하는 것은 GameLogic을 담당한 쓰레드가 직접 실행할 필요가 없을 수 있다. 이를 위해 데이터베이스 관련 요청만 처리하는 쓰레드, 네트워크 관련 연산만 처리하는 쓰레드를 지정해 GameLogic중 발생하는 DB관련, Network관련 연산들을 예약만 하고 다른 Logic을 수행하러 갈 수 있다. 이렇게 함으로 GameLogic의 전체적인 응답속도를 개선할 수 있다.


참고문헌

  1. 배현직. 게임 서버 프로그래밍 교과서. 길벗, 2020
profile
게임 개발자가 되고 싶은 한 소?년

0개의 댓글