Upload
-
View
9.292
Download
13
Embed Size (px)
Citation preview
Casual Game Server Framework
기술내용
최종문서수정일
문서작성자
MEMO
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
서버 프레임워크 CGSF에 대한 소개
박주항
KGC 강연 최종 문서
2012-10-18
Casual Game Server Framework
Casual Game Server Framework(CGSF)
1. CGSF
게임 서버 제작시 공통적으로 나타나는 부분을 모듈화한 서버 프레임워크
MMO / MO 서버를 제외한 게임 서버의 유사성
2. 착 안
초기 비용 절감 / 공통 플랫폼 제공
매번 서버 새로 만들어야 돼??
Casual Game Server Framework
Casual Game Server Framework(CGSF)
3. 특 징
오픈 소스의 활용
License Free
완전한 게임 서버의 구현
모듈 교체 용이
게임 서버 개발 비용 절감
Casual Game Server Framework
Casual Game Server Framework(CGSF)
4. 지향점 : 지엽적인 부분 최대한 배제
- 문자열 처리
- 네트워크 엔진
- 압축 라이브러리 누가 이미 만들어 놓은 거.. 새로 만들 필요는 없겠지…
Casual Game Server Framework
CGSF - Table of Contents
5
1. CGSF Internal Structure
2. Network Layer
3. Logic Queue
4. Logic Layer
5. Database Layer
6. P2P Layer
7. Sample FPS Server / Client
8. Conclusion
6
Work Thread
ACE Proactor
Work Thread
Work Thread
1……N
Logic Queue (IOCP)
Logic Thread
1. Single Thread 2. 멀티 쓰레드로 변경 가능
Database Proxy
Database Impl Local Database Impl Remote
DataBase Server (DB Thread)
Half Sync Half Async Pattern
DataBase
7
Network Layer
Network Layer Logic Layer Database Layer P2P Layer
Casual Game Server Framework
Packet Packet
Analyzer ACE
Proactor
Network Layer 데이터 흐름
8
데이터 유효성 체크 압축
대기중이던 일꾼 스레드
작업 시작
Logic Queue
네트워크 ACE Framework 패킷 분석 완성된 패킷
해당 유저 소켓 관련 이벤트 발생
Kernel ACE Thread Worker Thread = (Core * 2) ??
의미있는 내용 완성
TCP Data
Casual Game Server Framework
Network Layer ACE Application
9
▣ Acceptor & Service Handler
Casual Game Server Framework
Network Layer ACE Application
10
▣ Acceptor & Service Handler Expansion
Casual Game Server Framework
Network Layer ACE Application
11
▣ Worker Thread Creation
ACE_Thread_Manager::instance()->spawn_n(ThreadCount, ProactorWorkThread, …);
1. ThreadCount : 생성할 쓰레드 수
2. ProcatorWorkThread : Thread Entry
Casual Game Server Framework
Network Layer ACE Application
12
▣ Worker Thread Event Detection
void ProactorWorkThread(void* Args)
{
ACE_Proactor::instance()->proactor_run_event_loop();
}
::GetQueuedCompletionStatus(m_hIOCP, …, &pCompletionKey, …, …);
Casual Game Server Framework
Network Layer ACE Application
13
▣ proactor_run_event_loop()
NetworkEngine.dll!SFProactorService::handle_read_stream()
ACEd.dll!ACE_WIN32_Asynch_Read_Stream_Result::complete()
ACEd.dll!ACE_WIN32_Proactor::application_specific_code()
ACEd.dll!ACE_WIN32_Proactor::handle_events(unsigned long milli_seconds=4294967295)
ACEd.dll!ACE_WIN32_Proactor::handle_events()
ACEd.dll!ACE_Proactor::handle_events()
ACEd.dll!ACE_Proactor::proactor_run_event_loop(int (ACE_Proactor *)* eh=0x00000000)
NetworkEngine.dll!ProactorWorkThread(void * Args=0x00000000)
ACEd.dll!ACE_Thread_Adapter::invoke_i()
ACEd.dll!ACE_Thread_Adapter::invoke()
ACEd.dll!ace_thread_adapter(void * args=0x0118b558)
유저를 나타내는 오브젝트인 SFProactorService의
메소드가 호출되네
Casual Game Server Framework
Network Layer Packet Analyzer
14
이젠 유저가 보낸 데이터를 분석할 필요가 있겠지?
Casual Game Server Framework
Network Layer ACE Application
15
▣ User Session(Socket) & Received Data Process
Casual Game Server Framework
Network Layer Packet Analyzer
16
▣ Packet Analyzer
Header Data
- 유저가 전송한 데이터를 버퍼링
- 게임 패킷을 완성
▣ 패킷의 구조
Casual Game Server Framework
Network Layer Packet Analyzer
17
▣ Packet Header
구 성 요 소 내 용
Packet Length 패킷의 전체 길이
Encryption 데이터 암호화 여부
Compress 패킷 압축
Checksum(CRC) 패킷 유효성 검증
Directive 패킷 번호
Casual Game Server Framework
Network Layer Packet Analyzer
18
▣ 버퍼 상태
Header
Header
Header Data
Header Data
TCP 데이터가 뭉쳐오기 때문에 필요한 만큼의 데이터가 도착할 때 까지 기다릴
필요가 있어
Casual Game Server Framework
Network Layer Packet Analyzer
19
▣ 클라이언트 패킷 전송
압축 암호화 CRC 생성 Raw Packet Packet
▣ 서버 패킷 수신
Packet 복호화 압축 해제 CRC 비교 Raw
Packet
Casual Game Server Framework
Network Layer 단위 전략 패턴
20
음… 그런데 lzf 압축 라이브러리가 마음에 들지 않아. Zlib로 교체하고
싶은데 쉬운 방법이 없을까??
Casual Game Server Framework
Network Layer 단위 전략 패턴
21
▣ 템플릿을 사용한 단위 전략 패턴
2. 컴파일 타임 코드 바인딩
1. 상황에 따른 정책 변경 용이
Casual Game Server Framework
Network Layer 단위 전략 패턴
22
▣ Example – Lzf, Zlib
1. class SFCompressLzf
2. BOOL Compress(BYTE* pDest, int& DestLen, BYTE* pSrc, int SrcLen);
3. BOOL Uncompress(BYTE* pDest, int& DestLen, BYTE* pSrc, int
SrcLen);
1. class SFCompressZLib
2. BOOL Compress(BYTE* pDest, int& DestLen, BYTE* pSrc, int SrcLen);
3. BOOL Uncompress(BYTE* pDest, int& DestLen, BYTE* pSrc, int SrcLen);
Casual Game Server Framework
Network Layer 단위 전략 패턴
23
▣ Example – Packet Analyzer
1. template <typename T>
2. class SFPacketAnalyzer
3. {
4. ….
5. static T& GetCompressor(){return m_Compress;}
6. static T m_Compress;
7. ….
8. };
Casual Game Server Framework
Network Layer 단위 전략 패턴
24
▣ Example - SFProactorService
SFPacketAnalyzer<SFCompressLzf>::GetCompressor().Compress(……);
http://www.zlib.net http://oldhome.schmorp.de/marc/liblzf.html
Casual Game Server Framework
Logic Queue
25
네트워크 레이어의 종착역
Logic Queue
Casual Game Server Framework
Network Layer Logic Queue
26
▣ Logic Queue
1. 네트워크 이벤트나 타이머 이벤트 등을 수신하기 위한 Queue - 로직 쓰레드에서 사용
2. IOCP 활용
Casual Game Server Framework
Network Layer Logic Queue
27
▣ Logic Queue
template <typename T>
class SFIOCPQueue : public SFTSSyncQueue<T>
{
BOOL Push(T* pMsg)
{
::PostQueuedCompletionStatus(m_hIOCP, 0, (ULONG_PTR)pMsg, NULL);
return TRUE;
}
T* Pop()
{
……
SFASSERT( FALSE != ::GetQueuedCompletionStatus(m_hIOCP,
&NumberOfBytesTransferred, &pCompletionKey, &pOverlapped, INFINITE));
return (T*)(pCompletionKey);
}
Casual Game Server Framework
Network Layer Logic Queue
28
▣ Logic Queue의 사용
1. Worker Thread
LogicGatewaySingleton::instance()->PushPacket(pPacket);
2. Logic Thread
pCommand = LogicGatewaySingleton::instance()->PopPacket();
LogicEntrySingleton::instance()->ProcessPacket(pCommand);
이걸로 무사히 네트워크 레이어로 부터 로직 레이어로 패킷을 넘기게
되었어 휴…
29
Logic Layer
Network Layer Logic Layer Database Layer P2P Layer
Casual Game Server Framework
Logic Layer CGSF
30
▣ Logic Layer
1. 캐쥬얼 온라인 게임에서 공통적으로 나타나는 부분을 모듈화
2. 공통부분 - 채널선택 - 로비 - 게임방 진입 - 게임 로딩, - 게임 플레이 - 결과 화면
Casual Game Server Framework
Logic Layer Logic Thread
31
▣ Single Thread
1. 깔끔한 코드 - Lock(); SharedVar++; Unlock();
2. 컨텐츠 프로그래머
3. 원활한 게임 서비스
4. 고속 코드 수행(Node.js)
Casual Game Server Framework
Logic Layer Logic Thread
32
▣ 주의사항
1. Blocking Code ex) Sleep()
2. 오브젝트 풀, 메모리 풀
Casual Game Server Framework
Logic Layer Logic Thread
33
▣ Logic Thread Entry
Casual Game Server Framework
Logic Layer CGSF
34
▣ Game Lobby
Casual Game Server Framework
Logic Layer CGSF
35
▣ GameRoom
Casual Game Server Framework
Logic Layer CGSF
36
▣ GameLoading
Casual Game Server Framework
Logic Layer CGSF
37
▣ GamePlay
Casual Game Server Framework
Logic Layer CGSF
38
▣ GameResult
Casual Game Server Framework
Logic Layer
39
룸 오브젝트와 플레이어 오브젝트를 State Design Pattern으로 구현하면 되겠어!!
Casual Game Server Framework
Logic Layer GameRoom
40
▣ Game Room State Design
Casual Game Server Framework
Logic Layer GameRoom
41
▣ Player State Design
Casual Game Server Framework
Logic Layer GameRoom
42
▣ Packet Flow(유저가 로비에서 대기방으로 진입)
Casual Game Server Framework
Logic Layer GameRoom
43
▣ SFRoomPlay
빨강색 상자 : 최종 어플리케이션이 구현해야 될 부분
Casual Game Server Framework
Logic Layer GameRoom
44
▣ GameMode Example
FPSServer 프로젝트의 SFFreeForAll 클래스 참조
Casual Game Server Framework
Logic Layer
45
이젠 유저로 부터 받은 데이터를 게임에서 쓰는 형태로 변환해야 겠지…
Casual Game Server Framework
Logic Layer Google protocol buffer
46
▣ Google Protocol Buffer
1. http://code.google.com/p/protobuf/
2. 패킷 뭉쳐오기 처리(http://javawork.egloos.com/2726467)
▣ MessagePack
http://msgpack.org/
Casual Game Server Framework
Logic Layer Google protocol buffer
47
▣ Example – 채팅 메시지
message Chat
{
required string ChatMessage = 1;
}
Chat PktChat;
PktChat.chatmessage();
48
Database Layer
Network Layer Logic Layer Database Layer P2P Layer
Casual Game Server Framework
Database Layer Database
49
▣ 대표적인 데이터베이스
1. MS-SQL
2. MySQL
게임서버에는 두 데이터베이스 접근을 위한 모듈이 준비되어 있으나
MS-SQL은 상용이므로 예제로 MySQL을 사용합니다
회사에서는 mysql 잘 안써요…
Casual Game Server Framework
Database Layer MySQL
50
▣ MySQL : http://www.mysql.com/
Casual Game Server Framework
Database Layer Implementation
51
▣ 구현사항
1. 데이터베이스 쿼리 호출은 블럭킹 방식 - 비동기 쿼리 호출 방식 필요
2. 로직쓰레드, DB 쓰레드간 쿼리 전달 구현 필요
Casual Game Server Framework
Database Layer Implementation
52
▣ 비동기 처리 방식
1. DB 서버를 이용한 방식
2. IOCP를 이용한 방식
3. 쓰레드 세이프 큐를 이용한 방식
Game
Server
Database
Server Database
쿼리를 담은 패킷 전송
데이터베이스 쿼리
Casual Game Server Framework
Database Layer Implementation
53
▣ Half-Sync/Half-Async 모델 http://javawork.egloos.com/1818696
Casual Game Server Framework
Database Layer Implementation
54
▣ 데이터베이스 처리
Logic Thread
Manager Thread
DBWorker Thread
Casual Game Server Framework
Database Layer Implementation
55
▣ Logic Thread 에서의 데이터베이스 쿼리 요청
1. SFMessage* pMessage = LogicEntrySingleton::instance()->GetDBMessage();
2. ….
3. LogicEntrySingleton::instance()->GetDataBaseProxy()->SendDBRequest(pMessage);
※ Send
Casual Game Server Framework
Database Layer Implementation
56
▣ Command Pattern
커맨드 생성 및 전송 커맨드 큐잉, 디스패치 커맨드 수행
Casual Game Server Framework
Database Layer Implementation
57
▣ DB Query Command 수행 – SFDBWorker(Thread)
1. while(TRUE)
2. {
3. ACE_Method_Request* pReq = this->m_Queue.dequeue();
4. ….
5. int Result = pReq->call();
6. ….
7. }
DB 일꾼 쓰레드는 정말 간단하군요!!
Casual Game Server Framework
Database Layer Implementation
58
▣ Request의 call method
1.extern ACE_TSS<SFDatabaseMySQL> Database;
2.
3.int SFDBRequest::call(void)
4.{
5. …..
6. Database->Call(m_pMessage);
7. …..
8. return 0;
9.}
Casual Game Server Framework
Database Layer TLS
59
▣ Thread Local Storage(TLS)
Casual Game Server Framework
Database Layer Implementaion
60
데이터베이스 호출 관련 예제로 유저 로그인 관련
샘플을 구현해 두었습니다~
61
P2P Layer
Network Layer Logic Layer Database Layer P2P Layer
Casual Game Server Framework
P2P Layer P2P
62
▣ P2P Layer
1. 기존 P2P 모듈 활용을 목표
Casual Game Server Framework
P2P Layer P2P
63
▣ P2P Module
1. OCF P2P - 서버 엔진 OCF의 기능 중 하나 - http://www.ocf.kr/
2. Raknet
3. Enet - League of Legends에서도 사용?? - http://enet.bespin.org
Casual Game Server Framework
P2P Layer P2P
64
▣ 피어간 연결망 - 1
Peer22
Peer11
Peer33
Super Peer
Relay Server
Peer2
Peer1
Peer3
Super Peer
Relay Server
Casual Game Server Framework
P2P Layer P2P
▣ 피어간 연결망 - 1
Peer2
Peer1
Peer3
Relay Server
Peer1
Peer3
Relay Server
Peer2
Peer4 Peer4
65
Casual Game Server Framework
P2P Layer P2P
66
▣ 피어간 연결망 - 2
Peer2
Peer1
Peer3
Peer4
Relay Server
Peer2
Peer1
Peer3
Peer4
Relay Server
Casual Game Server Framework
P2P Layer P2P
67
▣ P2P Manager Interface
Casual Game Server Framework
P2P Layer P2P
68
▣ P2P Method(IUDPNetworkCallback)
1. HandleUDPNetworkMessage
2. ReportMyIP
Casual Game Server Framework
P2P Layer P2P
69
▣ Lock Free Library : liblfds(http://www.liblfds.org)
BOOL P2PManager::PushPacket(BYTE* pData, int Length)
…
queue_guaranteed_enqueue(m_pQueue, pP2PData);
…
BOOL P2PManager::Update()
…
while (queue_dequeue(m_pQueue, (void**)&pP2PData))
{
m_pUDPCallback->HandleUDPNetworkMessage(…);
…
Casual Game Server Framework
P2P Layer P2P Mechanism
70
Relay Svr
Client 1
Game Svr
▣ Report My IP
1. Request My Public IP
2. Receive My Public IP
3. Report My IP
1 2 3
Casual Game Server Framework
P2P Layer P2P Mechanism
71
Client 1 Client 2
Game Room
Client 3
▣ Sharing IP & Connect
1. Enter Room
2. Receive Room Member IP List
3. Receive New Member IP
4. Connect Each Other
1 2 3
4
방에 입장하자 마자 피어간 연결을 하니
게임 시작이 빠르겠군요.
Casual Game Server Framework
CGSF
72
Sample FPS Server / Client
Casual Game Server Framework
Sample FPS Server / Client Sample FPS Client
73
▣ Programming a Multiplayer FPS in DirectX
1. 2004년에 출간
2. 네트워크를 DirectPlay로 구현
3. GUI Library
Casual Game Server Framework
Sample FPS Server / Client Sample FPS Client
74
▣ CEGUI(Crazy Eddi’s GUI)
http://www.cegui.org.uk/wiki/index.php/Main_Page
Casual Game Server Framework
Sample FPS Server / Client Sample FPS Server
75
▣ FPS Server
1. 소스 코드 참조
Casual Game Server Framework
CGSF
76
결론 및 정리
Casual Game Server Framework
결론 및 정리 정리
77
CGSF의 목적
Casual Game Server Framework
결론 및 정리 CGSF의 보강
78
▣ CGSF의 보강
1. TDD 기반 개발
2. 스트레스 테스트
3. 로직 쓰레드의 멀티쓰레드화
4. 서버간 연결 구조
5. 게임 옵션 세분화
6. 서비스 툴 제작
CGSF CGSS
Casual Game Server Framework
결론 및 정리 CGSF
79
▣ CGSF 관련 사항
1. Source Code : http://dev.naver.com/projects/cgsf
2. 개발 툴 : Visual Studio 2012 RC Professional 버전
3. DirectX SDK
4. Tortoise SVN 차후 소스 업데이트는
Git-Hub에서
Casual Game Server Framework
CGSF
80
Q & A
Casual Game Server Framework
결론 및 정리 CGSF
81
▣ 제 소개
1. 약 력 서강대 물리학/컴퓨터학 복수전공 한국산업기술대학 디지털엔터테인먼트 석사 서강대학교 게임교육원 시스템 프로그래밍 시간 강사 JCE Server Programmer(2006 ~ 현재)
2. E-Mail : [email protected]
3. 블로그 : http://blog.naver.com/pdpdds
4. 목표 : C++ OS 제작
5. 좋아하는 게임 장르 : 어드벤처
Casual Game Server Framework
CGSF
82
감사합니다 !!!!