출처 : http://network.hanb.co.kr/view.php?bi_id=934

 

저자: 남재욱 / (주)지스퀘어 3D 캐주얼 게임 서버 프로그래머


온라인 게임에서 실질적인 게임을 진행시켜주는 것이 게임 서버이다. 우리는 게임서버의 구조는 게임의 진행과 시스템의 효율성에 많은 영향을 미치는 부분이다. 물리적으로 한정적인 시스템 자원을 효율적으로 사용하기 위해서 다양한 분산 처리는 필수적인 요소이다. 분산처리 구조를 익힘으로써 우리는 좀더 세련되고 뛰어난 성능을 발휘할수 있는 게임서버를 만들수 있다. 온라인 게임 서버 프로그래밍의 핵심인 게임 서버의 구조에 대해 알아 보도록 하자.


1. 일반적인 게임 서버 구조
2. 분산 게임 서버 구조
3. 서버간 통신


1. 일반적인 게임 서버 구조

게임 서버는 실질적인 게임을 진행하는 역할을 담당한다. 게임 서버는 유저간의 동기화, NPC의 인공지능, 아이템 시스템 등 게임 시스템의 총 집합이라 할 수 있다. 게임 진행에 필요한 모든 게임의 요소들을 총괄하여 진행시켜주는 작업을 하기때문에 가장 많은 일을 담당한다. 게임을 진행하는 요소는 방대하기 때문에 하나의 서버에서 처리하는데는 많은 부담이 된다.

게임 서버를 제작하고 테스트를 하는 과정에서 수십명의 유저를 처리하는것은 그리 문제가 되지 않는다. 더욱이 하드웨어의 눈부신 발전에 힘입어 게임에서도 고성능 서버를 사용하기 시작하면서 서버쪽의 부담이 덜어져 가는것도 사실이다. 하지만 접속 유저가 늘어나면서 서버쪽에서 느끼는 부하는 그 수치가 급격하게 증가한다. 그렇기 때문에 서버를 제작하면서 게임 서버의 부하를 분산시키려는 노력이 필요하다.

NPC 서버의 분리

구성에 따라 게임 서버에 많은 부하를 줄수 있는것이 NPC의 인공지능 부분이다. 보통 게임에서 NPC의 인공지능은 상당히 단순하게 느껴진다. 하지만 수많은 NPC의 인공지능을 구성하는 코드는 상당히 복잡하며 처리량도 만만치가 않다. 따라서 [그림 1-10]과같이 NPC의 인공지능 부분을 따로 분리하여 게임 서버에서 부하를 줄이게 된다.




[그림1-10] NPC서버의 분리



NPC 서버와 게임 서버가 분리되면 게임 서버에서는 NPC 오브젝트만 생성하게 된다. NPC 서버에서는 게임 서버에서 생성된 NPC 오브젝트의 인공지능을 처리한다. NPC 서버에서는 인공지능 부분만 처리하여 게임 서버에 있는 NPC 오브젝트에게 소켓 통신 등을 이용하여 명령한다. 게임 서버 입장에서는 소켓 통신을 하는 비용은 지불하게 되지만 많은 서버 리소스를 절약하는 효과를 볼수 있다. 또한 NPC서버에서는 인공지능 부분을 전담하기 때문에 더욱 복잡하고 똑똑한 인공지능을 만들어 낼수도 있다. 사실 게임 서버에 인공지능 부분까지 처리하게 되고, 처리할 NPC의 숫자도 많다면 복잡하고 세련된 인공지능은 서버에 많은 부담을 주게 될것이다.

온라인 게임을 하다보면 서버가 다운되어 다시 접속을 하였는데 NPC들이 필드에서 하나도 없는 경우를 몇몇 게임에서 발견할 수 있다. 이러한 상황은 NPC 서버와 게임 서버간의 동기화가 안된 상황에서 클라이언트가 게임 서버에 접속하였을 때 발생하는 현상이다. 이런 경우 잠시만 기다리면 갑자기 NPC들이 생겨나는 것을 볼수 있을 것이다.

NPC란? Non-Player Characters의 약자이다. 게임에서 유저 캐릭터가 아닌 서버에 의해 조종되는 캐릭터를 총칭하는 말이다. 온라인 게임에서는 보통 상점주인, 경비병, 몬스터 등이 이에 속한다.

동기화 서버의 분리

게임 서버에서 제일 기초적인 동작은 캐릭터간의 동기화 작업이다. 동기화 작업은 게임 서버가 시작되고 유저들이 접속하면서 부터 처리하게 된다. 동기화 작업은 제한된 공간에서 유저들의 행동을 상호간에 인지시키게 하기 위한 작업이다. 유저들의 행동을 상호간에 인식시키기 위해서는 모든 캐릭터의 행동을 근처의 모든 캐릭터들에게 알려 주어야 하기 때문에 많은 부하를 발생시킨다. 따라서 동기화 작업만을 전담하는 서버를 분리하여 준다면 게임서버의 퍼포먼스를 향상시킬 수 있다.
PC/NPC간의 동기화 작업은 각각의 오브젝트 단위로 이루어 지기 때문에 동기화 서버를 따로 두어 캐릭터들의 동기화 부분만 전담시켜 부하를 분산시키는 구조를 택할수 있다.




[그림1-11] 동기화 서버의 분리



동기화 서버는 NPC와 PC의 동기화 작업만 전담한다. 게임 서버에서 클라이언트의 움직임 등의 요청을 받는다면 동기화 서버로 명령을 전달하게 되고 동기화 서버에서는 명령에 따른 결과를 게임 서버에 전달하게 되어 게임 서버에서는 결과를 각색하여 클라이언트로 전달하게 된다. 동기화 서버가 분리되는 방식은 게임 서버가 해야할 일을 물리적으로 다른 서버와 분담하여 처리하는 방식이기 때문에 많은 유저가 접속하였더라도 서버의 성능을 일정하게 유지시켜줄 수 있는 구조이다.







■ IT EXPERT, 온라인 게임 서버 프로그래밍





채팅 서버의 분리

MMORPG는 다른 측면에서 보았을 때 커뮤니티의 일종으로서 유저 상호간 액션에 의해 게임이 진행된다. 커뮤니티에서 빠질수 없는 것이 의사 소통이며, 게임에서는 채팅을 통해 상호간의 의사전달을 하게 된다. 따라서 게임 서버에서는 유저들의 많은 양의 채팅 메시지를 처리하게 된다. 또한 채팅 메시지는 유저간의 동기화 문제와도 연관되어 많은 부하를 발생시킬수도 있기 때문에 채팅 서버만을 따로 두어 게임 서버의 부하를 분산시키기도 한다.




[그림1-12] 채팅서버의 분리



채팅 서버를 분리하게되면 대부분 클라이언트와 채팅 서버간의 1:1 통신을 하게 된다. 즉, 클라이언트는 게임 서버와 채팅 서버에 각각의 연결을 만들어 통신을 하게 된다는 것이다. 따라서 게임서버에서 클라이언트의 PC가 동기화 영역을 움직인다면 채팅 서버에서도 마찬가지로 해당 채팅 동기화 영역으로 움직여 채팅 메세지 동기화를 하게 된다. 게임 서버에서 할일이 분산되기 때문에 좀더 안정적인 게임서버를 만들수 있게 되지만 채팅 서버에서도 캐릭터의 이동에 따른 기본적인 동기화 작업이 필요하기 때문에 채팅 메세지를 게임 서버에서 처리 하는것보다 좀더 많은 작업량이 필요하게 된다.

[참고] 서버 기능 분리시 주의사항

서버를 분리하는데에는 많은 사항을 고려해야 한다. 서버의 기능을 나누어 부하를 분산시키는 것은 좋지만 서버를 나누어서 새롭게 생겨날수 있는 취약점이나 또다른 부하를 고려해야 하기 때문이다. 예를 들어 NPC 서버가 분리된다면 게임 서버와 NPC 서버간의 동기화, NPC 서버와 게임 서버간의 통신으로 인한 네트워크 오버헤드를 고려해야 한다.
동기화 서버가 분리되면 역시 동기화 서버와 게임 서버간의 통신으로 인한 네트워크 오버헤드와 게임서버와 동기화 서버의 권한을 명확히 해야 한다. 채팅 서버가 분리 된다면 채팅 서버와 게임 서버간의 동기화 문제를 고려해야 한다.


'Development > 온라인 게임 서버' 카테고리의 다른 글

서버 엔진 기술  (0) 2010.10.13
게임 서버의 구조(2)  (0) 2010.10.13
안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,