멀티플레이어 게임을 서비스하는 데 필요한 게임 장르별 백엔드 아키텍처에 대한 설명해 드립니다. 기본적인 게임의 상태 동기화 개념과 서버 구성에 관한 이야기, 게임 클라이언트 엔진(Unity, Lumberyard, Unreal Engine 등)에서 제공하는 복제 프레임워크를 통하여 손쉽게 게임 서버를 만드는 방법에 대한 내용을 다룹니다. 또한, 이렇게 만들어진 게임 서버를 Amazon GameLift라는 클라우드 서비스를 통해 DevOps형태의 비용 효율적으로 서비스하는 방법에 대해 소개합니다.
4. End-to-End Solutions for Game Developers
COMMUNITY
CLIENT
COMMERCE
CLOUD
game services
Amazon Game Services (AGS)
5.
6. 싱글 플레이어 게임의 처리 과정
Inputs
Simulate
Render
Wait
States
events
timer
State State State
Time
Frame Per Second (FPS) 이 루프가 1초에 몇 번 도는가?
7. 멀티 플레이어 게임
• 게임 로직 처리 및 상태 관리를 다른 컴퓨터에서 함
• 구조에 따른 분류
– P2P, Client-Server, Web-based, Hybrid
Inputs
Simulate
Render
Wait
States
my events
other hosts
over the network
10. 비동기형 (Asynchronous)
• 웹서비스 형태의 백엔드
• 2-tier: web servers + data store
• 3-tier: web front + app servers + data store
• 비용 효율화가 쉬움
• Spike load: Auto-scaling with Load Balancer
• 클라우드 환경에 아주 적합: AWS Spot instances 사용 가능
• (요즘 대세) 서버리스 형태로 구축 가능
• Serverless Architecture
11. 웹 서비스 방식의 백엔드
• HTTPS를 이용한 보안성 확보가 쉬움
• 연결 유지가 필요 없어 접속이 불안정한 환경에서 유리
• 모바일 게임 및 소셜 게임 장르에 적합
• 부하 분산(웹서버 추가)이 용이하여 확장성이 높음
• Load-Balancer 사용
Client
LB Web Server
Browser
Web Server
Client
Browser
Web ServerHTTP
12. 웹서비스 기반의 동기화 방식
Request/Response 구조
• 웹의 특징을 그대로 물려 받음
• Atomic, Stateless
• 플레이어간 순서 보장이 필요할 경우
• 사과를 친구가 먼저 수확한 경우 어떻게 처리?
• 주로 캐시서버나 DB에서 동기화
• 수동적: Server-initiated Action 어려움
• 몬스터의 선공과 같은 능동적 NPC 행동 불가
Web Client
Web Server
State State State
Response
Request
13. 서버리스 형태의 백엔드 구축 가능 (AWS 예)
Client
Lambda
function
API
Gateway
DynamoDB
AWS IAM
S3
Cognito
Static Content
Download
Backend Logic Data Store
14.
15. 지속형 (Persistent)
• 게임 월드가 유지되는 형태
• 대표적으로 MMOG형 게임: MMORPG
• Scale-out 및 비용 절감이 쉽지 않음
• 지역 또는 채널 별로 서버를 나누고 플레이어가 서버 선택
• 상태 유지 (Stateful): 플레이어가 1명이어도 서버 유지 필요
• 성능 요구 사항
• 상태 저장 (CRUD) 및 게임내 거래(Transaction) 아주 빈번
• 고성능의 RDBMS 필요 (e.g. Amazon Aurora)
• 인접한 플레이어간 패킷 방송이 많음
• 고성능의 네트워크 인터페이스가 필요함
16. Client-Server 형태의 백엔드 구조
지속형 게임은 주로 CS 구조를 사용
• 클라이언트는 서버를 통한 간접 연결
• 중요 로직은 서버에서 처리함으로써 해킹으로부터 비교적 안전
• NPC를 서버가 능동적으로 활용(drive)할 수 있음
• 구현 및 유지 보수 비용이 비교적 높음
• MMOG와 같이 상태를 지속해야하는 게임에 적합
Client Client
Client Client
Server
17. Client-Server 방식의 처리 구조
서버가 게임 로직 처리(Simulate) 및 상태 관리
Simulate
States
Inputs
Render
Wait
eventsServer
state info
18. Client-Server 형태에서 주로 쓰는 동기화 방식
• 클라이언트에서 발생하는 이벤트는 서버에서 모두 모아
계산한 후 해당 클라이언트로 방송
자본주의(?) 동기화
• 서버가 먼저 진행 클라는 따라올테면 따라와봐 빠른
클라일수록 서버와의 격차가 가장 적음 (유리)
• 서버/클라간 시간차는 클라가 알아서 Dead Reckoning
Server
Client A
Client B
NPC
NPC
NPC
A
B
A
A
B
B
Event A
Event BNPC Event
서버 동기화 (Server-Authoritative)
클라가 늦게 받을수
록 튀는 현상 발생
19. 클라우드 상에서의 일반적인 MMOG 아키텍처
Game Clients
1. Select a Realm
2. Connect to a Realm
Data
Server
Realm 3
Database
NPC, Chat, Physics,
…
World
Server
Aux
Svrs
Data
Server
Realm 1
Database
NPC, Chat, Physics,
…
World
Server
Aux
Svrs
Data
Server
Realm 2
Database
NPC, Chat, Physics,
…
World
Server
Aux
Svrs
Data
Server
Realm N
Database
NPC, Chat, Physics,
…
World
Server
Aux
Svrs
20.
21. 세션형 (Session-based) 게임
• 실시간 게임 중 가장 많은 형태
• 게임의 시작과 끝이 명확, 로비가 존재
• 주로 MOBA, FPS, RTS, Sports, …
• 연결 구조에 따라
• P2P: 클라이언트간 직접 연결
• Hosting: 플레이어 클라이언트 중 하나가 서버 역할
• Dedicated Server: 전용 서버로 Hosting
• 게임 장르별 주로 쓰는 동기화 방식
• 서버 동기화(Server-Authoritative): FPS, RPG, MOBA, Sports
• Lock-Step류: RTS, (AOS)
22. 연결구조: Peer to Peer (P2P)
• Peer to Peer: 플레이어의 클라이언트간 직접 연결
• 빠른 반응성 및 저렴한 유지 비용이 장점
• 서버가 따로 없어도 친구끼리 게임을 할 수 있는…
• 확장성 및 해킹(cheating)에 취약: (예) Maphack, Helper, …
Player Player
Player Player
23. 연결구조: Hosting
• P2P 구조에서 약간 변형된 형태
• 플레이어 클라이언트중 하나가 방장/호스트(Super-Peer) 역할
• 호스트(Super-Peer)를 통한 패킷 중계
• 실제 게임 로직 처리는 P2P 방식처럼 각자 하는 경우가 많음
• 성능이 좋은 클라이언트가 서버 역할을 하는 것이 좋음
Player (Host) Player
Player Player
24. 연결구조: Dedicated Server
• 플레이어가 직접 호스팅하지 않음
• 게임회사의 데이터센터나 클라우드에서 (보이지 않는 플레이어가) 전용 서버를 돌리는 구조
• 렌더링을 하지 않는 클라이언트 프로그램이 서버 모드(headless)로 동작
• P2P/호스트 방식 게임을 온라인 게임 형태로 서비스 하기 위해서 변형된 형태
• NPC AI처리도 맡음
• 대부분의 세션형 온라인 게임에서 사용 (e.g. PUBG, LOL, Overwatch)
• (예) LOL의 경우 실제 10+1명이, 고오급시계의 경우 12+1명이 게임에 참여하는 형태
• 동기화 방식은 게임 성격에 따라 서버 동기화 또는 Lock-Step 계열을 사용
Dedicated
Server
Player Player
Player Player
25. 참고: Lock-Step 형태의 동기화 방식
• 상대 Peer로부터 해당 라운드의 이벤트를 모아 각자처리
• 주로 RTS 및 과거의 AOS 장르에서 주로 사용
• 각각의 클라이언트는 모두 아래와 같은 형태의 Queue를 유지
• 공산주의(?) 동기화
• 다 함께 같이 간다 클라가 하나라도 멈추면 다 같이 기다린다
• 서버 동기화 방식과 다르게 특정 클라만 튀는 현상 없음
events eventsevents나
상대1
상대2
Round
0 ms 50 100 150
Round Round Round
events
events events
모든 Peer들의
입력이 모이면
해당 Round를
처리(Simulate)
하고 렌더링
특정 Peer의 정
보가 제시간에
도달하지 않으
면 Block
??
events
26.
27.
28. Dedicated Game Server
• 사실상 Client-Server 방식
• Lock-Step을 통한 동기화도 가능하지만 대부분의 경우 서버에서 로직을 돌리는 구조
• 중요 로직은 서버에서 처리함으로써 해킹으로부터 비교적 안전
• NPC를 서버가 능동적으로 활용(drive)할 수 있음
• 그럼, Dedicated Server 방식만의 장점은?
• 서버를 직접 구현하지 않고 클라이언트를 그대로 사용 (하나의 프로세스가 하나의 게임 세션 처리)
• 클라이언트의 지형, 애니메이션 및 물리 정보 그대로 사용
• 렌더링만 하지 않을 뿐, 클라이언트 엔진 레벨의 시뮬레이션이 가능!
• FPS 값이 (서버에서는 TickRate) 높을수록 더 정교한 시뮬레이션이 가능
Dedicated
Server
Player Player
Player Player
Game
Server
Client Client
Client Client
30. 데디서버를 어떻게 만들수 있는가?
• 게임 엔진으로 만들 수 있음
• 일반적으로 클라이언트 게임 엔진 내에 포함된 복제 프레임워크 사용
• 일종의 네트워크 동기화 라이브러리이지만 데디 서버를 손쉽게 만들 수 있는 기능 제공
• 그러니까, 클라이언트를 그냥 게임 서버로 사용 가능하게…
• 복제 프레임워크 (Replication Framework)
• 특정 객체의 특정 멤버변수 상태 복제를 통한 상태 동기화
• 서버-클라이언트간 RPC를 통한 이벤트 동기화
• 상용 게임 엔진 예
• Lumberyard의 GridMate Replica Framework
• UE4의 Actor Replication
• Unity의 UNET HLAPI
31. Lumberyard GridMate
• 원격 복제를 지원하는 크로스플랫폼 네트워크 라이브러리
• 네트워크 상에서의 원격지 복제본(replicas) 지원
• 하나의 노드가 복제본을 소유하고 나머지 노드는 프록시(proxy)를 보는 구조
• 복제본은 데이터를 포함하고 RPC 수행 가능
• 특징
• 다양한 플랫폼 지원: Windows, Xbox One, PS4, Android and iOS
• 다양한 동기화 기능 제공: 변수 동기화, 변수 변경시 자동 콜백 호출, RPC, …
• 네트워크 테스트 및 시뮬레이션을 위한 RTT 변경, 패킷 손실 등의 다양한 기능 제공
32. Unreal Engine Dedicated Server
• UE4도 Dedicated Server를 쉽게 만들 수 있는 기능을 제공
• Dedicated Server Guide (Link)
• Actor Replication (Link)
33. Unity UNET
• Unity 5.1부터 도입된 네트워크 라이브러리 + 복제 프레임워크
• 방식1: High Level Scripting API (HLAPI)를 통한 객체의 상태 복제 지원
• NetworkManager를 통한 손쉬운 사용 (Host / Server / Client 모드)
• 손쉬운 네트워크 이벤트 주고 받기
• Commands (Client Server)
• RPC (Server Client)
• 방식2: Transport API를 통한 채널 단위의 Lower level의 통신 방식도 지원 (UDP 기반)
• 기존의 익숙한 방법: 채널을 만들고, 연결하고, 데이터를 주고 받고…
• NetworkTransport.*
34. UNET HLAPI Mode: Client, Server, Host
Player (Host) Player
Player Player
37. UNET HLAPI 사용 방법
• Main Scene에서 Network Manager 콤포넌트 설정
• 주소 및 포트 번호, 플레이어 Prefab, Spawnable Prefabs 등
• 네트워크 동기화가 필요한 Entity에는 NetworkIdentity 콤포넌트 부착
• 자동으로 transform 동기화를 위해서는 Network Transform 콤포넌트 부착
• 스크립트는 NetworkBehaviour부터 상속받아 사용
• 멤버 변수에 대한 상태 복제 or 서버와 클라이언트간 함수 호출(RPC)
• 역할에 따라 Network Manager Start!
• StartHost(), StartServer(), StartClient()
• Quiz: 데디서버는 어떤 역할로 실행할까요?
38.
39. 상태 복제
• NetworkBehaviour로 부터 상속
• [SyncVar] attribute를 통한 멤버 변수 상태 동기화
• List의 경우 Built-in 타입 제공: SyncListString, SyncListFloat, SyncListInt, …
40. Command (Server RPC)
• 클라이언트(플레이어)가 데디서버에게 명령을 내리고 싶을 때
• [Command] attribute: 클라에서 호출하지만 서버에서 실행되는 함수 (함수명은 반드시 “Cmd”로 시작)
41. Client RPC
• 데디서버가 클라이언트에게 명령을 내리고 싶을 때
• [ClientRpc] attribute: 서버에서 호출하지만 클라이언트에서 실행되는 함수 (함수명은 “Rpc”로 시작)
42.
43. Unity로 데디 서버 만들기 바로 시작!
• UNET을 사용한 초 간단 슈팅 게임 튜토리얼
• https://unity3d.com/kr/learn/tutorials/topics/multiplayer-networking
• 한번 따라 해보면 앞서 설명했던 개념이 한방에 잡힘!
• Unity Standalone Player를 Dedicated Server로 쓰는 경우
• (Quiz의 답) 코드상에서는 NetworkManager.StartServer() 호출하도록 수정
• EXE 실행시에는 반드시 –batchmode 옵션을 주기: headless 모드로 실행됨
44.
45. DevOps 그리고 클라우드
• DevOps
• 요약하면 개발과 운영의 통합(이라고 쓰고 개발자가 운영까지하는 경우가…)
• 왜? 고객으로 부터의 피드백 반영 주기를 빠르게 하기 위함 혁신의 속도
• 재미를 확인하는 방법은 게이머들의 목소리를 듣고 수정하는 방법이 최선이기 때문
• 게임 서비스에 있어서 DevOps 개념은 김태현님의 NDC 2017 세션(Link)을 추천
• 클라우드 컴퓨팅은 DevOps를 위한 필수 도구
• 클라우드 시대가 되면서 인프라/시스템 엔지니어들이 해야 하는 부분을 게임 개발자들이 할 수
있게 됨 클라우드는 결국 게임 개발자에게 힘을 실어주는 도구
• Amazon GameLift
• 세션형 게임을 위한 최적화된 DevOps 환경을 제공
• 게임서비스에 특화된 AWS 클라우드 솔루션
IMG FROM: https://www.contegix.com/devops-part1-its-more-than-teams/
46. Amazon GameLift?
• 세션형 멀티플레이어 게임 서비스를 위한 DevOps 플랫폼
• AWS 클라우드 상에서 멀티 플레이어 게임 서버를 자동으
로 확장/축소
• 전세계적으로 low-latency 사용자 경험 제공
• 글로벌 플레이어를 대상으로 Matchmaking 지원
• DDoS 방어 메커니즘 지원
• 중단(downtime)없는 게임 서버 업데이트 지원
인프라 레벨(서버 머신) 신경쓰지 말고 게임 서버 바이너리
만 제공하면 나머지는 알아서!
53. 게임 세션 1
Player slot 1
Player slot 2
Player slot 3
Player slot 4
Active
Active
게임 세션 2
Player slot 1
Player slot 2
Player slot 3
Player slot 4
Active
Active
Active
Active
게임 세션 N
Player slot 1
Player slot 2
Player slot 3
Player slot 4
Reserved
서버 프로세스 서버 프로세스 서버 프로세스
EC2 Instance EC2 Instance EC2 Instance
Build
개발자 Players
게임 세션 관리
FLEET
55. 데디 서버 바이너리 (빌드) 업로드
• 게임 서버 실행 파일 및 부속 폴더를 한군데 모아두고
• AWS CLI를 사용하여 GameLift에 업로드
aws gamelift upload-build --name <빌드이름> --build-root <폴더> --operating-system
<WINDOW_2012 또는 AMAZON_LINUX> --region <리전>
56. 플릿 설정
• EC2 인스턴스 타입 지정
• 실행 파일 이름, 명령 파라미터, 프로세스 수 지정
• 열어둘 포트, 프로토콜 종류, 허용 IP 대역 지정
• Auto-Scaling 정책 설정
57.
58.
59. • 상태변경 순서: Downloading Validating Activating Active
• Active 상태가 되면 클라이언트로 부터 접속을 받을 수 있음
60. GameLift SDK 연동 (DEV)
• GameLift Server SDK
• C++ 및 C# 지원
• Unreal Engine 및 Unity 전용 플러그인 제공
• Lumberyard의 경우 이미 포함되어 있음
• Windows Server 및 Amazon Linux에서 운용 가능
• GameLift Client SDK
• AWS SDK를 그대로 사용하면 됨 (10종 이상의 프로그래밍 언어 지원)
• 게임 클라이언트에 직접 통합하기보다 주로 Matchmaking 서버 같은 게임 백엔드와 통합
61.
62.
63.
64.
65. GameLift를 통한 운영 (OPS)
• Web기반의 UI를 통한 운영
• API로도 제어 가능
• 각종 성능 지표 모니터링
• 스케일링 상황 모니터링
• 게임 서버에서 발생하는 이벤트 확인
• 게임 세션 및 플레이어 세션 정보 확인
• 매치메이킹 정보 및 분석 도구 제공
• ALIAS 기능을 통한 무중단 배포 가능
68. 매치메이킹 기능 제공 (FlexMatch)
• FlexMatch
• 범용적으로 커스터마이징 가능한 매치메이킹 시스템
– https://aws.amazon.com/blogs/gamedev/matchmaking-your-way-amazon-gamelift-flexmatc
h-and-game-session-queues/
– http://docs.aws.amazon.com/gamelift/latest/developerguide/gamelift-match.html
• 규칙(Rules) 기반
• 다양한 조건을 쿼리의 형태로 주면, 그 쿼리 결과에 맞는 플레이어들을 매칭
• 플레이어 숙련도, ELO 점수 등등
• 매칭이 성사되면 자동으로 GameLift 플릿상에 게임 세션을 생성
• 추가 비용 없음
• 공짜
70. AWS 글로벌 인프라 활용
US West (Oregon)
Japan
Ireland
US East (Virginia)
Brazil
Germany
India
Singapore
Korea
71. 글로벌 지연 최적화 매치메이킹
Match
Player 1
Ping
Times
Player X
Ping
Times
…
GameLift
US West (Oregon)
EU Central (Frankfurt)
South America East (São Paulo)
Asia Pacific (Seoul)
사용방법: https://aws.amazon.com/ko/blogs/korea/amazon-gamelift-global-matchmaking-queue-for-low-latency-game-players/
72. GameLift Future
SOCIAL
Player Profiles
Friends
Engagement
Player Privacy
Search
Player Presence
AUTH
Identity
Skill & Rank
Session Management
Matchmaking
MULTIPLAYER
Parties
Notifications
Rank
COMMUNICATION
Text Chat
Voice Chat
P L A Y E R
A N A L Y T I C S
D E P L O Y M E N T
Ingestion
Release
Packaging
R E M O T E C O N F I G
A / B T E S T I N G
W E B S I T E S
C S T O O L S
C O M M E R C E
Wallet
Item Catalog
Virtual Currencies
In-App Purchase
Reputation
Auto-scaling
Authentication
Authorization
GAMELIFT
SERVER HOSTING
현재 기능
추가될 기능
73. 바로 시작 하기
• 무료로 테스트 해 볼 수 있음
• c3.large 인스턴스 타입으로 125시간 무료
• https://console.aws.amazon.com/gamelift/
• 빠르게 테스트해볼 수 있는 샘플 게임 제공
• Amazon GameLift의 Sample Game 항목
• 물리 기반의 8인용 축구 게임
• GameLift 코드 레벨 사용법 및 데모
• 더미 플레이어 테스트용
• https://github.com/zeliard/GameLift
• Full-Stack 게임 샘플 (실제 세션형 게임 서비스와 기술적/기능적으로 동일)
• https://github.com/awslabs/aws-gamelift-sample