오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
Upcoming SlideShare
Loading in...5
×
 

오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발

on

  • 6,773 views

 

Statistics

Views

Total Views
6,773
Views on SlideShare
6,637
Embed Views
136

Actions

Likes
26
Downloads
134
Comments
0

8 Embeds 136

http://devilchen.tistory.com 35
http://psw6582.cafe24.com 33
http://blog.naver.com 21
http://asheain.tistory.com 18
http://pdpdds.x90x.net 15
http://editor.daum.net 8
https://twitter.com 5
http://www.monchicken.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발 오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발 Presentation Transcript

    • 오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발 Casual Game Server Framework기술내용 서버 프레임워크 CGSF에 대한 소개최종문서수정일 2012-10-18문서작성자 박주항MEMO KGC 강연 최종 문서
    • Casual Game Server Framework(CGSF) 1. CGSF 게임 서버 제작시 공통적으로 나타나는 부분을 모듈화한 서버 프레임워크 2. 착 안 MMO / MO 서버를 제외한 게임 서버의 유사성 초기 비용 절감 / 공통 플랫폼 제공 매번 서버 새로 만들어야 돼?? 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 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
    • 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 ServerHalf Sync Half Async Pattern DataBase 6
    • Network LayerNetwork Layer Logic Layer Database Layer P2P Layer 7
    • 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
    • Network Layer ACE Application ▣ Acceptor & Service Handler 9 Casual Game Server Framework
    • Network Layer ACE Application ▣ Acceptor & Service Handler Expansion 10 Casual Game Server Framework
    • 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
    • Network Layer ACE Application ▣ Worker Thread Event Detection void ProactorWorkThread(void* Args) { ACE_Proactor::instance()->proactor_run_event_loop(); } ::GetQueuedCompletionStatus(m_hIOCP, …, &pCompletionKey, …, …); 12 Casual Game Server Framework
    • 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
    • Network Layer Packet Analyzer 이젠 유저가 보낸 데이터를 분석할 필요가 있겠지? 14 Casual Game Server Framework
    • Network Layer ACE Application▣ User Session(Socket) & Received Data Process 15 Casual Game Server Framework
    • Network Layer Packet Analyzer ▣ Packet Analyzer - 유저가 전송한 데이터를 버퍼링 - 게임 패킷을 완성 ▣ 패킷의 구조 Header Data 16 Casual Game Server Framework
    • Network Layer Packet Analyzer ▣ Packet Header 구성요소 내 용 Packet Length 패킷의 전체 길이 Encryption 데이터 암호화 여부 Compress 패킷 압축 Checksum(CRC) 패킷 유효성 검증 Directive 패킷 번호 17 Casual Game Server Framework
    • Network Layer Packet Analyzer▣ 버퍼 상태 TCP 데이터가 뭉쳐오기 때문에 필요한 만큼의 데이터가 도착할 때 까지 기다릴 필요가 있어 Header Header Header Data Header Data 18 Casual Game Server Framework
    • Network Layer Packet Analyzer ▣ 클라이언트 패킷 전송 Raw Packet 암호화 압축 CRC 생성 Packet ▣ 서버 패킷 수신 Raw Packet CRC 비교 압축 해제 복호화 Packet 19 Casual Game Server Framework
    • Network Layer 단위 전략 패턴 음… 그런데 lzf 압축 라이브러리가 마음에 들지 않아. Zlib로 교체하고 싶은데 쉬운 방법이 없을까?? 20 Casual Game Server Framework
    • Network Layer 단위 전략 패턴 ▣ 템플릿을 사용한 단위 전략 패턴 1. 상황에 따른 정책 변경 용이 2. 컴파일 타임 코드 바인딩 21 Casual Game Server Framework
    • 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
    • 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
    • Network Layer 단위 전략 패턴 ▣ Example - SFProactorService SFPacketAnalyzer<SFCompressLzf>::GetCompressor().Compress(……); http://www.zlib.net http://oldhome.schmorp.de/marc/liblzf.html 24 Casual Game Server Framework
    • Logic Queue네트워크 레이어의 종착역 Logic Queue 25 Casual Game Server Framework
    • Network Layer Logic Queue ▣ Logic Queue 1. 네트워크 이벤트나 타이머 이벤트 등을 수신하기 위한 Queue - 로직 쓰레드에서 사용 2. IOCP 활용 26 Casual Game Server Framework
    • Network Layer Logic Queue ▣ 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); } 27 Casual Game Server Framework
    • Network Layer Logic Queue ▣ Logic Queue의 사용 1. Worker Thread LogicGatewaySingleton::instance()->PushPacket(pPacket); 2. Logic Thread pCommand = LogicGatewaySingleton::instance()->PopPacket(); LogicEntrySingleton::instance()->ProcessPacket(pCommand); 이걸로 무사히 네트워크 레이어로 부터 로직 레이어로 패킷을 넘기게 되었어 휴… 28 Casual Game Server Framework
    • Logic LayerNetwork Layer Logic Layer Database Layer P2P Layer 29
    • Logic Layer CGSF ▣ Logic Layer 1. 캐쥬얼 온라인 게임에서 공통적으로 나타나는 부분을 모듈화 2. 공통부분 - 채널선택 - 로비 - 게임방 진입 - 게임 로딩, - 게임 플레이 - 결과 화면 30 Casual Game Server Framework
    • Logic Layer Logic Thread ▣ Single Thread 1. 깔끔한 코드 - Lock(); SharedVar++; Unlock(); 2. 컨텐츠 프로그래머 3. 원활한 게임 서비스 4. 고속 코드 수행(Node.js) 31 Casual Game Server Framework
    • Logic Layer Logic Thread▣ 주의사항 1. Blocking Code ex) Sleep() 2. 오브젝트 풀, 메모리 풀 32 Casual Game Server Framework
    • Logic Layer Logic Thread ▣ Logic Thread Entry 33 Casual Game Server Framework
    • Logic Layer CGSF ▣ Game Lobby 34 Casual Game Server Framework
    • Logic Layer CGSF ▣ GameRoom 35 Casual Game Server Framework
    • Logic Layer CGSF ▣ GameLoading 36 Casual Game Server Framework
    • Logic Layer CGSF ▣ GamePlay 37 Casual Game Server Framework
    • Logic Layer CGSF ▣ GameResult 38 Casual Game Server Framework
    • Logic Layer 룸 오브젝트와 플레이어 오브젝트를 State Design Pattern으로 구현하면 되겠어!! 39 Casual Game Server Framework
    • Logic Layer GameRoom▣ Game Room State Design 40 Casual Game Server Framework
    • Logic Layer GameRoom▣ Player State Design 41 Casual Game Server Framework
    • Logic Layer GameRoom▣ Packet Flow(유저가 로비에서 대기방으로 진입) 42 Casual Game Server Framework
    • Logic Layer GameRoom▣ SFRoomPlay 빨강색 상자 : 최종 어플리케이션이 구현해야 될 부분 43 Casual Game Server Framework
    • Logic Layer GameRoom ▣ GameMode Example FPSServer 프로젝트의 SFFreeForAll 클래스 참조 44 Casual Game Server Framework
    • Logic Layer 이젠 유저로 부터 받은 데이터를 게임에서 쓰는 형태로 변환해야 겠지… 45 Casual Game Server Framework
    • 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
    • Logic Layer Google protocol buffer ▣ Example – 채팅 메시지 message Chat { required string ChatMessage = 1; } Chat PktChat; PktChat.chatmessage(); 47 Casual Game Server Framework
    • Database LayerNetwork Layer Logic Layer Database Layer P2P Layer 48
    • Database Layer Database ▣ 대표적인 데이터베이스 1. MS-SQL 2. MySQL 게임서버에는 두 데이터베이스 접근을 위한 모듈이 준비되어 있으나 MS-SQL은 상용이므로 예제로 MySQL을 사용합니다 회사에서는 mysql 잘 안써요 … 49 Casual Game Server Framework
    • Database Layer MySQL ▣ MySQL : http://www.mysql.com/ 50 Casual Game Server Framework
    • Database Layer Implementation ▣ 구현사항 1. 데이터베이스 쿼리 호출은 블럭킹 방식 - 비동기 쿼리 호출 방식 필요 2. 로직쓰레드, DB 쓰레드간 쿼리 전달 구현 필요 51 Casual Game Server Framework
    • Database Layer Implementation▣ 비동기 처리 방식 1. DB 서버를 이용한 방식 쿼리를 담은 패킷 전송 데이터베이스 쿼리 Game Database Database Server Server 2. IOCP를 이용한 방식 3. 쓰레드 세이프 큐를 이용한 방식 52 Casual Game Server Framework
    • Database Layer Implementation ▣ Half-Sync/Half-Async 모델 http://javawork.egloos.com/1818696 53 Casual Game Server Framework
    • Database Layer Implementation ▣ 데이터베이스 처리 Logic Thread Manager Thread DBWorker Thread 54 Casual Game Server Framework
    • Database Layer Implementation▣ Logic Thread 에서의 데이터베이스 쿼리 요청 ※ Send 1. SFMessage* pMessage = LogicEntrySingleton::instance()->GetDBMessage(); 2. …. 3. LogicEntrySingleton::instance()->GetDataBaseProxy()->SendDBRequest(pMessage); 55 Casual Game Server Framework
    • Database Layer Implementation▣ Command Pattern 커맨드 생성 및 전송 커맨드 큐잉, 디스패치 커맨드 수행 56 Casual Game Server Framework
    • 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
    • Database Layer Implementation ▣ 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.} 58 Casual Game Server Framework
    • Database Layer TLS ▣ Thread Local Storage(TLS) 59 Casual Game Server Framework
    • Database Layer Implementaion 데이터베이스 호출 관련 예제로 유저 로그인 관련 샘플을 구현해 두었습니다~ 60 Casual Game Server Framework
    • P2P LayerNetwork Layer Logic Layer Database Layer P2P Layer 61
    • P2P Layer P2P ▣ P2P Layer 1. 기존 P2P 모듈 활용을 목표 62 Casual Game Server Framework
    • 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
    • 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
    • P2P Layer P2P ▣ 피어간 연결망 - 1 Peer1 Peer1 Relay Relay Server Server Peer2 Peer2 Peer4 Peer3 Peer4 Peer3 65 Casual Game Server Framework
    • P2P Layer P2P ▣ 피어간 연결망 - 2Relay Peer1 RelayServer Peer1 Server Peer4 Peer2 Peer2 Peer4 Peer3 Peer3 66 Casual Game Server Framework
    • P2P Layer P2P ▣ P2P Manager Interface 67 Casual Game Server Framework
    • P2P Layer P2P ▣ P2P Method(IUDPNetworkCallback) 1. HandleUDPNetworkMessage 2. ReportMyIP 68 Casual Game Server Framework
    • 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
    • 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
    • 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
    • CGSFSample FPS Server / Client 72 Casual Game Server Framework
    • 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
    • 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
    • Sample FPS Server / Client Sample FPS Server ▣ FPS Server 1. 소스 코드 참조 75 Casual Game Server Framework
    • CGSF결론 및 정리 76 Casual Game Server Framework
    • 결론 및 정리 정리 CGSF의 목적 77 Casual Game Server Framework
    • 결론 및 정리 CGSF의 보강▣ CGSF의 보강 1. TDD 기반 개발 2. 스트레스 테스트 3. 로직 쓰레드의 멀티쓰레드화 4. 서버간 연결 구조 5. 게임 옵션 세분화 6. 서비스 툴 제작 CGSF CGSS 78 Casual Game Server Framework
    • 결론 및 정리 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
    • CGSFQ&A80 Casual Game Server Framework
    • 결론 및 정리 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
    • CGSF감사합니다 !!!! 82 Casual Game Server Framework