멀티플레이 게임 서버 - meoltipeullei geim seobeo

/도서 리뷰

게임서버 프로그래밍을 위한 필독서[멀티플레이어 게임 프로그래밍]

15년전 처음 게임서버를 개발을 하게 되었을 당시에 어떤 공부를 해야하는지 체계적으로 알려주거나 책이 없어

해외 서적이나 인터넷 그리고 주위의 선임자들의 경험을 들으면서 온몸으로 고통속에 배웠었다.

기본적인 네트웍 프로그래밍 책에 CBT를 통해 여러 문제들을 겪으면서 해결책을 익히게 되었는데

이런 경험들을 알려주고 고생을 하지 않고 해결책을 잘 정리해놓은 책들이 간간히 있었지만, 뭔가 성에 차지 않았었다.

또한 팀원이 새로 들어오게 되면, 다양한 경험과 경력의 사람들이 들어오게 되는데 

이들이 실제 개발에 투입되기까지의 기간은 그들이 어떤 경험과 지식들이 있는지에 따라 달라진다.

어떤 경우에는 네트웍의 기본 개념도 없는 팀원도 있는 경우도 있거나 개발을 해본적은 있지만, 왜 홀펀칭을 해야하는지, 딜레이 처리는 어떻게 해야하는지를 모르고 그냥 남의 코드만을 복사해서 넣고 주석으로 "고치지 마시오" 라고 넣어놓은  경우도 있었다. 또한 핵심적인 서버 클라이언트 처리는 몇몇 경험이 많은 선임들의 소유물이 되곤 했었다.

새로운 팀원이나 신입과 같은 서버 개발이라는 세계에 들어와 체계적인 서버 개발을 위한 교육 자료 또는 권할만한 책이 별로 없었는데 이 "멀티플레이어 게임 프로그래밍" 이라는 책의 목차를 본순간 지금 같이 하고 있는 서버 팀원들에게 추천해주고 싶은 책이 나타났다라고 생각했다.

책을 본순간 정말 재미있고 몰랐던 사실을 알려주어 일주일동안 미친듯이 파고 들었다.

네트웍의 기본부터 왜 UDP의 홀펀칭을 해야하는지와 그 원리,  레이턴시, 지터링, 패킷 손실 처리 테스트하기 위한 방법, 규모 확장, 보안, 언리얼엔진과 유니티를 포함한 상용엔진 사례, 게임 서비스를 위한 플랫폼에 대한 정리 까지

게임서버를 개발하기 위해 사용해 왔던 내용과 잘 몰랐던 내용, 기본 이론까지 체계적으로 잘 정리해있었다.

글쓴이가 대학 전임 강사로 프로그래밍 과정을 가르치고 있어서 그런지 모든 챕터에는 "연습문제"와 "참고자료"가 있어서 스터디에 활용하거나 좀더 심화된 자료를 볼수 있었다(참고자료 링크 내용은 물론 영어로 되어있다.)

번역 내용도 훌륭해서 한국어로 된 서버 개발 교과서를 보는 기분이었다.

지금은 massive 멀티플레이 온라인 게임보다는 모바일 게임 개발이 활발해서 serverless개발이나 웹서버를 활용하는 경우가 높아 TCP나 UDP를 사용하는 게임 서버 개발이 이전보다 덜 하지만, 

서버 개발을 하고 싶거나 배우고 싶은 개발자라면 꼭 한번은 숙지하고 경험해야하는 내용이 잘 정리되어있어 필독 해야한다고 생각한다.

이 책은 게임 서버에 처음 입문하는 사람이 본다면 내용이 어려울수 있다. 어느정도의 지식이 있거나, 모르는 내용을 알려줄수 있는 사람이 함께 있다면 책을 읽기가 수월할것같다.

1장 네트워크 게임의 개요

- 멀티플레어 게임의 역사에 대한 설명, 이 게임은 오히려 모르는 사람이 더 많지 않을까?

최근 게임들을 예시로 들어줬으면 더 좋았을뻔 했겠다.

2장 인터넷

- 패킷 스위칭이 왜 생겼는지

- TCP/IP 스택 계층구조 설명(자세히 알려준다)

- 네트워크 주소 변환(NAT)에 대한 설명과 왜 생겨났는지.

3장 버클리 소켓

- 버클리 소켓 API를 이용하여 TCP, UDP 개발

- 블로킹 I/O와 논블로킹 I/O 개발 방법

- 소켓 옵션 설명

- C++로 개발

- 책에서 앞으로 설명할 서버 개발을 위한 네트웍 관련 모듈을 제작한다.

4장 객체 직렬화

- 플레이어 상태들을 공유할 수 있도록 객체 직렬화의 기능을 설명하고 구현한다.

- 객체 직렬화를 구현할 때 유의해야하는 점(참조 처리등)을 설명한다.

- 전송 패킷 양을 줄이기 위한 압축 방법들을 설명한다.

5장 객체 리플리케이션

- 객체 리플리케이션을 구현한다.

- 월드 상태 리플리케이션 구현

6장 네트워크 토폴로지와 예제 게임

- 클라이언트-서버 구조의 예제 게임 구현

- 피어-투-피어 예제 게임 구조, 그리고 동기화를 위한 락스텝 턴 구현

7장 레이턴시, 지터링, 신뢰성

- 실제 네트웍 환경에서 마주치는 레이턴시, 지터링에 대한 설명과 해결방법들

- 테스트를 위한 환경을 구성

8장 레이턴시 대응 강화

- 네트웍 게임에서 가장 치명적인 레이턴시를 대응하고 강화시키는 방법

- 클라이언트측 보간 방법에 대한 설명(데드 레커닝)

- 서버측에서 되감기 방법 설명

9장 규모 확장에 대응하기

- 규모가 커졌을때 클라이언트와 서버측의 처리 방식에 대한 설명

10장 보안

- 소프웨어 치트(VAC, 워든) 감지 방법

- 서버 상의 기본 보안(디도스 공격, 악성 데이터 등)을 하는 방법

11장 상용 엔진 사례

- 언리얼엔진4, 유니티엔진에서 제공하는 멀티플레이를 위한 네트웍 개발 방법

12장 게임 서비스 플랫폼

- 게임 서비스는 다양한 서비스들이 조합되어야하며, 이들중 기본적인 서비스를 설명한다.

(로비, 매치메이킹, 플레이어 통계, 플레이어 도전과제, 리더보드 등)

13장 클라우드에 전용 서버 호스팅 하기

- 클라우드를 사용하여 서버 호스팅할때 알아야하는 내용을 설명한다.

서버와 통신하는 이유는 여러 가지가 있겠지만

멀티 플레이 환경에서 가장 첫 번째 이유는 공정성이다.

싱글 플레이에서 유저가 어떤 행동을 하든 조작을 하든 다른 유저에게 피해를 끼치지 않는다.

//www.inven.co.kr/board/overwatch/4538/2749047

저러면 게임이 하고 싶을까?

각 방마다 저러면 내가 게임을 할 수 있을까?

클라이언트를 직접 조작하는 것은 막지 못한다.

하지만 서버와의 연결을 거친다면 클라이언트의 변조를 막을 수 있다.

이것이 멀티 플레이 게임의 가장 중요한 요소인 공정성이다.

모두 다 같은 환경에서 플레이해야만 멀티플레이의 의미가 생기는 것이다.

쉽게 생각하면 모든 게임의 연산을 서버에서 하면 되는거 아냐? 라고 생각한다.

이것을 Authoritative Server라고 하는데

이는 서버에서 연산을 처리하여 클라이언트가 받아서 쓰는 방식이다.

물론 서버도 만능은 아니다.

]서버에도 약점이 생길 수 있다.

하지만 우리는 거기까지 다루지는 않을 것이고

대부분의 게임에서 Authoritative Server를 쓰는 이유를 알아볼 것이다.

Authoritative Server는 앞서 말한대로 공정성을 유지하는데 큰 도움을 준다.

다시 말해서 우리가 소위 말하는 많은 핵들을 막을 수 있다.

클라이언트가 조작되었든 말든 상관이 없다.

어차피 서버는 클라이언트에서 오는 것을 믿지 않는다.

서버에서 World State를 가지고 있기 때문에

클라이언트가 조작된 데이터를 보내도 서버는 전혀 영향을 받지 않는다.

플레이어의 체력을 100보다 크게 조작해도 서버는 플레이어의 체력이 100인 것을 알고 있으며

플레이어의 위치를 하늘 위로 옮겨도 서버는 플레이어가 땅 위에 있다는 것을 알고 있다.

클라이언트는 서버의 상태를 전혀 바꿀 수 없는 구조다.

간단한 통신을 보자면

클라이언트는 오른쪽으로 한칸 움직이면 바로 움직이는 것이 아니라

서버에 내가 움직인다고 보내고 서버의 World State를 받아와 내 컴퓨터에 렌더링하는 것이다.

클라이언트는 그저 서버의 응답에 대한 동작만 하는 것이다.

하지만 클라이언트가 아무것도 하지 않는 멍청한 상태, dumb client가 된다면 비효율의 끝이다.

컴퓨터가 켜져있음에도 아무 연산도 하지 않고 그냥 서버만 주구장창 기다리는 것이다.

턴제 게임이라면 멀티플레이 게임이라도 괜찮을만 하다.

고스톱, 포커 등이 괜찮다.

하지만 서든어택과 같은 0.2초의 반응을 요구하는 게임이라면?

절대 저렇게 하면 안된다.

뭐 서든이야 국산게임이니

서버가 국내에 있어서 패킷이 이동해봤자 거기서 거기라고 100번 양보해서 그렇다고 하자.

그렇다면 외국에 서버를 두고 있다면?? 

실리콘 밸리에 서버가 있다면??

빛의 속도로 움직인다고 해도 10ms 이상 걸린다.

**물론 글로벌 게임은 서버를 Region마다 두고 있다.

10ms가 빠르다고 생각할 수 있다.

물론 빠른 것은 맞다.

하지만 저것은 진짜 패킷이 유실되지 않고 최적의 경로만 찾아와서 받았을 경우다.

만약 유실이 되거나 돌아서 온다면??

10ms는 우습게 넘을 것이다.

빛의 속도로 움직이더라도 경로가 잘못되면 오래 걸린다는 말이다.

대충 외국의 핑을 생각해봤을 때 100ms 걸린다고 쳐보자.

0.1초다.

외국에 있는 애들은 0.01초만에 방향키 반응을 하는데

나는 적을 보고도 0.1초 늦게 움직여서 총알이 머리에 박힌다.

결국 게임이 재미없어지고 게임을 끄게 된다.

이게 진짜 최선일까?

우리는 멀티 플레이 게임을 하기 위한 몇가지 방법이 있다.다음 글에서 알아보자

참고링크

//www.gabrielgambetta.com/client-server-game-architecture.html

Toplist

최신 우편물

태그