멀티플레이어 게임 프로그래밍
랙 없는 서버를 위해
한방에 무너지지 않는 서버를 위해!
현업 개발자가 알려주는 탄탄한 멀티플레이어 게임 프로그래밍
<리그 오브 레전드>, <디스트로이 올 휴먼즈> 시리즈를 컨설팅하고 <로보블리츠>, <맥스 액스>, <스크랩 포스>를 개발한 조슈아 글레이저와 <메달 오브 아너: 퍼시픽 어썰트>, <반지의 제왕: 컨퀘스트>, <사보타주> 게임 제작에 참여한 산제이 마드하브가 서던캘리포니아 게임 학과에서 강의한 멀티플레이어 게임 프로그래밍을 책으로 옮겼다. 액션 게임과 실시간 전략 게임을 통해 멀티플레이어 아키텍처를 어떻게 구축하는지, 엔진의 각 부분을 어떻게 만들어야 하는지 설명한다.
«멀티플레이어 게임 프로그래밍»은 1~4장까지 공개합니다.
전자책 구입
목차
- 1장. 네트워크 게임의 개요
- 1.1 멀티플레이어 게임의 간추린 역사
- 1.1.1 로컬 멀티플레이어 게임
- 1.1.2 초기 네트워크 멀티플레이어 게임
- 1.1.3 MUD: 멀티 유저 던전
- 1.1.4 랜 게임
- 1.1.5 온라인 게임
- 1.1.6 MMO 게임
- 1.1.7 모바일 네트워크 게임
- 1.2 스타시즈: 트라이브스
- 1.2.1 플랫폼 패킷 모듈
- 1.2.2 연결 관리자
- 1.2.3 스트림 관리자
- 1.2.4 이벤트 관리자
- 1.2.5 고스트 관리자
- 1.2.6 이동 관리자
- 1.2.7 기타 시스템
- 1.3 에이지 오브 엠파이어
- 1.3.1 턴 타이머
- 1.3.2 동기화
- 1.4 요약
- 1.5 복습 문제
- 1.6 더 읽을거리
- 2장. 인터넷
- 2.1 패킷 스위칭의 기원
- 2.2 TCP/IP 스택의 계층 구조
- 2.3 물리 계층
- 2.4 링크 계층
- 2.4.1 이더넷/802.3
- 2.5 네트워크 계층
- 2.5.1 IPv4
- 2.5.2 IPv6
- 2.6 전송 계층
- 2.6.1 UDP
- 2.6.2 TCP
- 2.7 응용 계층
- 2.7.1 DHCP
- 2.7.2 DNS
- 2.8 NAT
- 2.8.1 NAT 투과
- 2.9 요약
- 2.10 복습 문제
- 2.11 더 읽을거리
- 3장. 버클리 소켓
- 3.1 소켓 만들기
- 3.2 운영체제별 API 차이
- 3.3 소켓 주소
- 3.3.1 자료형 안전성
- 3.3.2 문자열로 sockaddr 초기화하기
- 3.3.3 소켓 바인딩하기
- 3.4 UDP 소켓
- 3.4.1 자료형 안전성을 보강한 UDP 소켓
- 3.5 TCP 소켓
- 3.5.1 연결된 소켓으로 데이터 보내고 받기
- 3.5.2 자료형 안전성을 보강한 TCP 소켓
- 3.6 블로킹 I/O와 논블로킹 I/O
- 3.6.1 멀티스레딩
- 3.6.2 논블로킹 I/O
- 3.6.3 select() 함수
- 3.7 소켓 부가 옵션
- 3.8 요약
- 3.9 복습 문제
- 3.10 더 읽을거리
- 4장. 객체 직렬화
- 4.1 직렬화가 필요한 이유
- 4.2 스트림
- 4.2.1 메모리 스트림
- 4.2.2 엔디언 호환성
- 4.2.3 비트 스트림
- 4.3 참조된 데이터 처리
- 4.3.1 임베딩(또는 인라이닝)
- 4.3.2 링킹
- 4.4 압축
- 4.4.1 희소 배열(sparse array) 압축
- 4.4.2 엔트로피 인코딩
- 4.4.3 고정소수점
- 4.4.4 기하 압축
- 4.5 유지보수성
- 4.5.1 직렬화 읽기와 쓰기를 하나로 합치기
- 4.5.2 데이터 주도 직렬화
- 4.6 요약
- 4.7 복습 문제
- 4.8 더 읽을거리
- 5장. 객체 리플리케이션
- 5.1 월드 상태
- 5.2 객체를 리플리케이션하기
- 5.2.1 객체 생성 레지스트리
- 5.2.2 한 패킷에 여러 객체 실어 보내기
- 5.3 초간단 월드 상태 리플리케이션
- 5.4 월드 상태의 변경
- 5.4.1 객체 상태 부분 리플리케이션
- 5.5 직렬화 객체로 RPC 수행
- 5.6 리플리케이션 시스템 개조하기
- 5.7 요약
- 5.8 복습 문제
- 5.9 더 읽을거리
- 멀티플레이어 게임 프로그래밍
- 6.1 네트워크 토폴로지
- 6.1.1 클라이언트-서버
- 6.1.2 피어-투-피어
- 6.2 클라이언트-서버 구현하기
- 6.2.1 서버 코드와 클라이언트 코드 분리하기
- 6.2.2 네트워크 관리자 및 신규 클라이언트 마중하기
- 6.2.3 입력 공유 및 클라이언트 프록시
- 6.3 피어-투-피어 구현하기
- 6.3.1 신규 피어 마중하기 및 게임 시작하기
- 6.3.2 명령 공유와 락스텝 턴
- 6.3.3 동기화 유지하기
- 6.4 요약
- 6.5 복습 문제
- 6.6 더 읽을거리
- 7장. 레이턴시, 지터링, 신뢰성
- 7.1 레이턴시
- 7.1.1 네트워크가 원인이 아닌 레이턴시
- 7.1.2 네트워크 레이턴시
- 7.2 지터링
- 7.3 패킷 손실
- 7.4 신뢰성: TCP냐 UDP냐
- 7.5 패킷 배달 통지
- 7.5.1 외부로 나가는 패킷에 꼬리표 달기
- 7.5.2 패킷을 받고 확인응답하기
- 7.5.3 확인응답 처리 및 배달 여부 알리기
- 7.6 객체 리플리케이션 신뢰성
- 7.6.1 이미 전송 중인 최신 상태의 재전송을 막아 최적화하기
- 7.7 실제와 유사한 환경을 꾸며 테스트하기
- 7.8 요약
- 7.9 복습 문제
- 7.10 더 읽을거리
- 8장. 레이턴시 대응 강화
- 8.1 더미 터미널 클라이언트
- 8.2 클라이언트 측 보간
- 8.3 클라이언트 측 예측
- 8.3.1 데드 레커닝
- 8.3.2 클라이언트 이동 예측 및 이동 조작 되새김
- 8.3.3 레이턴시를 교묘하게 감추기
- 8.4 서버 측 되감기
- 8.5 요약
- 8.6 복습 문제
- 8.7 더 읽을거리
- 9장. 규모 확장에 대응하기
- 9.1 객체 스코프 내지 연관성
- 9.1.1 스태틱 존
- 9.1.2 시야 절두체 사용
- 9.1.3 기타 가시성 기법
- 9.1.4 보이지 않아도 스코프에 포함되어야 하는 경우
- 9.2 서버 파티셔닝
- 9.3 인스턴싱
- 9.4 우선순위와 빈도
- 9.5 요약
- 9.6 복습 문제
- 9.7 더 읽을거리
- 10장. 보안
- 10.1 패킷 스니핑
- 10.1.1 중간자 공격
- 10.1.2 호스트 머신상 패킷 스니핑
- 10.2 입력 검증
- 10.3 소프트웨어 치트 감지
- 10.3.1 VAC
- 10.3.2 워든
- 10.4 서버 보안
- 10.4.1 디도스 공격
- 10.4.2 악성 데이터
- 10.4.3 소요 시간 분석 공격
- 10.4.4 침입
- 10.5 요약
- 10.6 복습 문제
- 10.7 더 읽을거리
- 11장. 상용 엔진 사례
- 11.1 언리얼 엔진 4
- 11.1.1 소켓과 기본 네트워킹
- 11.1.2 게임 객체와 토폴로지
- 11.1.3 액터 리플리케이션
- 11.1.4 원격 프로시저 호출
- 11.2 유니티
- 11.2.1 전송 계층 API
- 11.2.2 게임 객체와 토폴로지
- 11.2.3 객체 스폰과 리플리케이션
- 11.2.4 원격 프로시저 호출
- 11.2.5 매치메이킹
- 11.3 요약
- 11.4 복습 문제
- 11.5 더 읽을거리
- 12장. 게임 서비스 플랫폼
- 12.1 게임 서비스 플랫폼 선택하기
- 12.2 기본 셋업
- 12.2.1 초기화, 구동, 마무리
- 12.2.2 유저 ID 및 이름
- 12.3 로비 및 매치메이킹
- 12.4 네트워킹
- 12.5 플레이어 통계
- 12.6 플레이어 도전과제
- 12.7 리더보드
- 12.8 기타 서비스
- 12.9 요약
- 12.10 복습 문제
- 12.11 더 읽을거리
- 13장. 클라우드에 전용 서버 호스팅하기
- 13.1 클라우드, 꼭 사용해야 할까
- 13.2 필수 도구
- 13.2.1 REST
- 13.2.2 JSON
- 13.2.3 Node.js
- 13.3 용어 및 개요
- 13.3.1 서버 게임 인스턴스
- 13.3.2 게임 서버 프로세스
- 13.3.3 게임 서버 머신
- 13.3.4 하드웨어
- 13.4 로컬 서버 프로세스 관리자
- 13.4.1 프로세스 모니터링
- 13.5 가상 머신 관리자
- 13.5.1 가상 머신 모니터링
- 13.6 요약
- 13.7 복습 문제
- 13.8 더 읽을거리
- 부록A. 모던 C++ 기초
- A.1 C++11
- A.2 레퍼런스
- A.2.1 상수 레퍼런스
- A.2.2 상수 멤버 함수
- A.3 템플릿
- A.3.1 템플릿 특수화
- A.3.2 정적 단언문과 자료형 특성 정보
- A.4 스마트 포인터
- A.4.1 shared_ptr
- A.4.2 unique_ptr
- A.4.3 weak_ptr
- A.4.4 주의 사항
- A.5 STL 컨테이너
- A.6 반복자
- A.6.1 범위 기반 for 구문
- A.6.2 반복자 활용하기
- A.7 더 읽을거리