Download - Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
박성준 ([email protected])
Korea Games Conference KGC 2012
온라인 게임 액체처럼 만들자
콘솔 게임
온라인 게임
그렇다면..
컨텐츠는 누가 만들어야 할까요?
서버 프로그래머?
클라이언트 프로그래머?
서버
프로그래머
컨텐츠
프로그래머
클라이언트
프로그래머
그래픽스
프로그래머 물리 엔진
프로그래머
인공 지능
프로그래머
사운드
프로그래머
게임 플레이
프로그래머
스크립터
UI
프로그래머
Input
프로그래머
네트워크
프로그래머
툴
프로그래머
네트워크 프로그래머
툴 프로그래머
그래픽스 프로그래머
물리 엔진 프로그래머
인공 지능 프로그래머
사운드 프로그래머
게임 플레이 프로그래머
스크립터
UI 프로그래머
Input 프로그래머
DB 프로그래머
서버 클라이언트 ???
GameLogicServer
전투 시스템
네트워크 프로그래머
툴 프로그래머
그래픽스 프로그래머
물리 엔진 프로그래머
인공 지능 프로그래머
사운드 프로그래머
게임 플레이 프로그래머
스크립터
UI 프로그래머
Input 프로그래머
DB 프로그래머
서버 클라이언트 컨텐츠
서버 프로그래머
컨텐츠 프로그래머
클라이언트 프로그래머
컨텐츠 개발 컨셉
• 세션 중심 개발
• 유저와 서버 사이의 1:1 이벤트
• 존 입장 / 변경 / 퇴장
• 옵션 정보 저장
• 게임 외적인 이벤트
• 게임 오브젝트 중심 개발
• 게임 오브젝트들 사이의 이벤트
• 이동 / 공격 / 피격
• 아이템 떨어뜨리기 / 줍기
• 게임 내적인 이벤트
Shodown
Core
Engine
Contents
Tools
Server Platform
Core
Engine
Contents
Logic
Server Client Tools
Core
Core.Native
Core.Net
FileModule
LogModule
ShodownFile
ShodownLog
Core
FileModule LogModule
Shodown File
Shodown Log
Engine
Graphics
DB
Input
Sound
Network
UI
Graphic Manager
IGraphic Factory
IGraphic Source
IRenderer
Gamebryo Factory
Graphic Source
Renderer
GraphicModule
GamebryoWrapper
Graphic Object
컨텐츠를 개발할 때에는 컨텐츠’만’ 개발하자
플레이어가 몬스터를 강베기 스킬로 공격한다
플레이어 모델을 띄운다 몬스터 모델을 띄운다 강베기 애니메이션을 재생한다 피격 애니메이션을 재생한다 데미지 계산을 한다 HP를 깎는다 이펙트를 터뜨린다 사운드를 재생시킨다 UI 연출을 한다 모델을 어떻게?
애니메이션을 어떻게? 이펙트 렌더링을 어떻게? 사운드 재생을 어떻게? 이미지를 화면에 어떻게?
Contents GameBase
System
Server
System
Client
System Client
Logic
Server
SinglePlay
Test
클라이언트 컨텐츠
공통 컨텐츠
서버 컨텐츠
클라이언트 실행 파일 / 모듈의 조합
로직 서버 실행 파일 / 모듈의 조합
싱글 테스트 실행 파일 / 모듈의 조합
ClientSystem ServerSystem
GameBase System
Client SinglePlayTest LogicServer
ClientSystem ServerSystem
GameBase System
Network Module
Database Module
Graphic Module
UI Module
Sound Module
Input Module
Database Module
Network Module
Graphic Module
UI Module
Sound Module
Input Module
ADO Database
DBS Connector
Lua Database
Gamebryo Wrapper
Scaleform Wrapper
Shodown Sound
Shodown Input
Client LogicServer
Gamebryo Wrapper
Scaleform Wrapper
Shodown Sound
Shodown Input
ADO Database
DBS Connector
Lua Database
SinglePlayTest
세션 중심 개발
• 유저와 서버 사이의 1:1 이벤트
• 존 입장 / 변경 / 퇴장
• 옵션 정보 저장
• 등 게임 외적인 이벤트
Network Manager
Network Factory
ServerBase
ClientBase
ClientObject Base
ClientSession Base
IConnect Observer
IAccept Observer
ServerSession Base
ServerObject Base
Server Session
Client Session
Server Session
Client Session
Server Session
Client Session
Server Session
Client Session
Server Session
Client Session
Server
Client Client Client Client Client
Server Base
Accept Observer
Client Base
Network Manager
Server Base
Accept Observer
Client Base
Network Manager
Server Base
Accept Observer
접속
Client Base
Network Manager
Server Base
Accept Observer
접속
Client Base
Network Manager
Server Base
Accept Observer
접속
Client Session
생성
Client Base
Network Manager
Server Base
Accept Observer
접속
연결
Client Session
생성
Client Base
Network Manager
Server Base
Accept Observer
접속
연결
알림
Client Session
생성
Client Base
Network Manager
Server Base
Accept Observer
접속
연결
알림
User
Client Session
생성
Client Base
Network Manager
Server Base
Accept Observer
접속
연결
알림
User
Server Session
Client Session
생성
Client Base
Network Manager
Server Base
Accept Observer
접속
연결
알림
User
연결
Server Session
Client Session
생성
Client Base
Network Manager
Server Base
Accept Observer
접속
연결
알림
User
연결
Server Session
Client Session
생성 Client Base
Network Manager
Client Session
User
Server Session
메시지 하나로 끝나는 일은 없다
Coroutine
A B
시간 흐름
A
B
C
문제는…
• 게임 로직은 C++로 만든다!
• C++에서 코루틴을 쓰고 싶다!
• C++은 코루틴을 지원하지 않는다?!
Boost 비공식 라이브러리
문제는…
• 윈도우 비스타/2008 이상에서만 동작한다!
• 서버는 윈도우 2008 이상을 사용하면 된다…
• 하지만 클라이언트에서는 못쓴다!!
• 이유는 몇몇 Fiber 관련 API 때문…
!!!!!
민철님(@summerlight00) 사..사…..감사합니다!
Boost 만세! 올리버 코왈크씨 만세!!!
STL TR 시리즈에 context와 coroutine이 포함되길 기대합니다..
아직 시간이 없어..
써보진 못했지만…
곧 변경할 예정…..
아마도 KGC 2012가 끝난 다음 바로..?!
Call
Yield
Resume
Yield
Resume
Yield
Resume
End
유저시퀀스
• 유저 별로 발생하는 게임 외적인 이벤트 로직의 객체화 • 시퀀스 하나 = 이벤트의 처음부터 끝까지 • 내부적으로 boost::coroutine을 사용하여 구현
외부 인터페이스
User에 접근 가능
코루틴 인터페이스
실제 실행 함수
코루틴 함수
User
User – Update()에서 실행
버퍼에서 데이터 Pop 하여 받으려는 변수로 바로 가져옴
Network - OnRecv()에서 실행
유저 시퀀스의 스택 메모리에 할당됨
Thread가 달라도 문제 없음
유저시퀀스는 추가복사 없이 데이터를 로직 코드로 바로 가져올 수 있다
메시지에서 사용할 데이터 형식 메시지 타입
선언한 순서로 메시지ID 할당
버퍼에 데이터 넣기
버퍼에서 데이터 꺼내기
메시지ID + 데이터 타입
죄송합니다.. 시간에 쫓겨 급해서 Boost 전처리기 메타를 썼습니다..
시퀀스 생성
User - Update
코루틴 생성 후 Yield
Resume Wait() 만나면
Yield
메시지 도착
Resume 데이터 Pop
Yield
User - Update
Resume
유저시퀀스의 로직은 모두 User 객체의 Update에서 실행되는 것을 보장한다
코 루틴
메인 루틴
: Network Thread
: Main Thread
유저시퀀스에서 프로시저 호출
User
Database Object
Server Session
User 객체가 요청한 프로시저 결과는 User 객체가 받는다
User 객체가 전송한 메시지는 해당 User가 받는다
DatabaseModule NetworkModule
유저시퀀스에서 유저시퀀스 호출
Server Object
Client Object
Server Object
Server Object
Client Object
Client Object
Server
Client
Client Object
Client Object
Client Object
Client
NPC1
NPC1
NPC1
Player1
Player1 Player1
NPC2
NPC2 NPC2
게임 오브젝트 중심 개발
에서 설명합니다!
유연한 컨텐츠 개발을 위해서
무조건 데이터 드리븐 X
컨텐츠와 컨텐츠가 아닌 것 분리
기능별로 모듈화
최대한 응집성이 떨어지지 않게
수치 데이터 + 로직 모듈 + 모듈 조합 스크립트 = 데이터드리븐
감사합니다
박성준 mail : [email protected] twitter : @kgun86
Special Thanks to : Dragonfly SS팀 일동/ 게임개발포에버 필진 일동 / 민철님 / 퐆삼촌 / 조진현님 / 김정우님 / 오즈형 / 레아형 / 민근형 / 티스형 / Hybrid님 / 창희님 / 대마왕님 / banhae님 / 정균님 / 스티브 / 바레로 박사님 / 김토마님 / Cagetu님 / 달땡땡님 / 퐁퐁퐁님 / 진짜님 / 박PD님 / 비토님 / 어제 같이 술 마신 분들 / 트친분들