패키지 게임에서 게임서버
- 플레이어 세 명 이상이 게임을 하려면 그들의 게임 플레이 상태를 저장하는 곳이 어딘가에 있어야 했고, 이를 위해 플레이어 중 한 명의 컴퓨터가 모든 플레이어의 게임 플레이 상태를 취합해서 유지해야 함 → 서버
- 패키지 게임에서 게임 서버가 하는 역할 : 세션 처리 담당(플레이어가 두 세명 많아야 십여명 참여하여 게임 플레이를 하는 상태). 게임 시작하면 세션 열고 끝나면 세션 사라지고
- 일부 패키지 게임에서는 렌더링과 사용자 입력 처리를 전혀 받지 않고, 순전히 클라이언트의 연결을 받는 세션을 처리만 하는 프로그램이 따로 들어있기도 했음 → dedicated server
서버의 역할
게임 루프
싱글 플레이 게임을 처리하기 위해 컴퓨터는 이 과정을 반복함
- 입력 받기 : 키보드, 마우스, 터치 스크린, 마이크, 카메라 등으로 컴퓨터가 정보를 획득하는 과정
- 게임 로직 처리하기 : 게임 정보를 담고 있는 상태인 세션은 보통 1초에 60번 상태 변화를 함
- 상태 변화를 하는 과정을 게임 로직 처리라고 함
- 게임 로직 처리 과정 중에는 게임 플레이 판정, 가령 플레이어가 어느 캐릭터에 대미지를 주었는지 혹은 캐릭터가 어느 몬스터 캐릭터에 대미지를 받았는지 등을 계산함
- 렌더링 : 변화된 상태를 화면에 표현
- 1인용 게임은 컴퓨터 하나에서 게임루프를 처리함
- 온라인 게임은 여러 사람의 상호작용을 어디선가 중재해야 하기에, 서버와 클라이언트가 필요해짐
- 대부분 온라인 게임에서는 클라이언트에서 게임 로직을 처리하는 역할 일부를 떼어 내 서버로 옮김
게임 서버의 품질
안정성
- 서버의 불안정성을 극복하는 방법
- 서버가 죽더라도 최대한 빨리 다시 살아나게 하는 방법
- 서버는 죽더라도 최대한 적은 서비스만 죽게 (분산 프로세스 형태)
- 서버 오작동에 대해서 기록(로그)을 남길 수 있게 함
- 크래시 덤프를 파일로 남기거나 서버가 최근에 받았던 메시지 종류를 파일로 남기는 방법
확장성
- 서버를 얼마나 많이 설치할 수 있느냐
- 사용자 측면에서 사용자 수가 늘어나더라도 서비스 품질이 떨어지지 않고 유지되느냐
- 클라우드 서버는 처리 속도 측면에서는 물리적 서버와 달리 균일하지 않다는 단점이 있음. 가상 머신에서 작동한다는 것 자체가 성능이 떨어지는 이유이지만, 리얼 머신 한 대에서 서로 모르는 사람이 구축한 서버가 작동하고 있기 때문에 원치 않는 간헐적인 지연 시간이 발생하기도 함(p.219)
- 게임 서버가 DB에 쿼리를 자주 던지는 것은 여러모로 비효율적임
- 쿼리를 던진 후 결과 받기 과정이 수행되는 동안 디바이스 타임(device time= I/O)이 발생
- 게임 서버와 DB간 네트워크 레이턴시를 다 모으면 꽤 긴시간임. 티끌 모아 태산
- DB는 쿼리를 받으면 이를 처리할 수 있는 준비 작업 연산을 함. DB 엔진은 받은 질의 구문을 분석하고 무슨 일을 해야 할지 계획하는데, 이 과정이 매번 발생함. 이러한 과정을 생략하기 위해 Stored Procedure를 이용함
- 게임 서버는 플레이어 정보를 메모리에 보관하고, 플레이어의 데이터를 게임 서버 안에 있는 메모리에서 변경하며, 변경된 내용을 데이터베이스에 저장함. 즉, 데이터베이스를 세이브 데이터처럼 사용하는 셈임. 게임 서버 안 메모리가 연산의 주요 대상이므로 두 플레이어 간 아이템 거래 같은 중요한 처리도 게임 서버 안 메모리에서 모두 판정이 끝난 후 뒤늦게 데이터베이스에 기록됨
- ⇒ 게임 서버를 만들다 보면 DB 트랜잭션이 그렇게까지 필요하지는 않음. 게임 서버 메모리에서 사전 검증을 다 해버리는 특성 때문에
- 트랜잭션으로 발생하는 성능 저하와 데드락 가능성을 완전히 없애고 싶은데, 레코드 2개의 변경을 atomic 하게 하는 방법이 있을까? → 어딘가에 로그를 남겨 놓고 두 플레이어의 레코드를 업데이트 하는 것(송영님이 말한 캐시 서버). 두 레코드의 업데이트가 완료되면 해당 로그를 지워 버리는 것
- 분산 처리는 꼭 해야 하는 이유를 설명할 수 없다면 피하는 것이 좋습니다. 콘텐츠 업데이트나 시스템 업데이트가 계속 있어야 하는 게임 서버의 특성상 서버를 만드는 것도 중요하지만, 안정적인 서비스가 더 중요하기 때문입니다.(p.394)
- 앞서 서버 컴퓨터 한 대에서
감당할 수 없는 양을 처리하고자 서버를 여러 대 놓는 것
살펴보았습니다. 그러나 우리는 장애 극복을 위해서 필요 이상의 서버를 둡니다. 이것을 이중화 혹은 다중화라고 합니다. - 부하 분산을 위한 분산 처리
- 장애 극복을 위한 분산 처리
게임 서버 아키텍처
- 채널 서버 : 스타크래프트에서 채널을 나누듯이, 메이플 스토리에서 채널을 나누듯이 채널별로 유저에게 게임 플레이를 제공해주는 서버. 해당 채널에서 만든 유저는 다른 채널로 이동할 수가 없음 (채널 서버 별로 DB가 따로 할당되어 있기 때문에)
- 매치 메이킹 서버 : 롤에서 게임을 시작하기위해서 플레이어 매칭해주는 기능을 담당하는 서버
- 룸 서버 : 매치 되고 나서 생기는 룸에서 일어나는 기능을 담당하는 서버