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