83
박성준 ([email protected]) Korea Games Conference KGC 2012

Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

  • Upload
    kgun86

  • View
    8.858

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

박성준 ([email protected])

Korea Games Conference KGC 2012

Page 2: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

유연한 컨텐츠 개발을 위한

온라인 게임 아키텍처

박성준 ([email protected])

Korea Games Conference KGC 2012

Page 3: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

온라인 게임 액체처럼 만들자

Page 4: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

콘솔 게임

Page 5: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Page 6: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

온라인 게임

Page 7: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Page 8: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Page 9: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Page 10: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Page 11: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Page 12: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

그렇다면..

컨텐츠는 누가 만들어야 할까요?

Page 13: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

서버 프로그래머?

클라이언트 프로그래머?

Page 14: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

서버

프로그래머

컨텐츠

프로그래머

클라이언트

프로그래머

Page 15: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Page 16: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

그래픽스

프로그래머 물리 엔진

프로그래머

인공 지능

프로그래머

사운드

프로그래머

게임 플레이

프로그래머

스크립터

UI

프로그래머

Input

프로그래머

네트워크

프로그래머

프로그래머

Page 17: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

네트워크 프로그래머

툴 프로그래머

그래픽스 프로그래머

물리 엔진 프로그래머

인공 지능 프로그래머

사운드 프로그래머

게임 플레이 프로그래머

스크립터

UI 프로그래머

Input 프로그래머

DB 프로그래머

서버 클라이언트 ???

Page 18: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Page 19: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

GameLogicServer

전투 시스템

Page 20: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

네트워크 프로그래머

툴 프로그래머

그래픽스 프로그래머

물리 엔진 프로그래머

인공 지능 프로그래머

사운드 프로그래머

게임 플레이 프로그래머

스크립터

UI 프로그래머

Input 프로그래머

DB 프로그래머

서버 클라이언트 컨텐츠

Page 21: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

서버 프로그래머

컨텐츠 프로그래머

클라이언트 프로그래머

Page 22: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

컨텐츠 개발 컨셉

• 세션 중심 개발

• 유저와 서버 사이의 1:1 이벤트

• 존 입장 / 변경 / 퇴장

• 옵션 정보 저장

• 게임 외적인 이벤트

• 게임 오브젝트 중심 개발

• 게임 오브젝트들 사이의 이벤트

• 이동 / 공격 / 피격

• 아이템 떨어뜨리기 / 줍기

• 게임 내적인 이벤트

Page 23: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Page 24: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Shodown

Core

Engine

Contents

Tools

Server Platform

Page 25: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Core

Engine

Contents

Logic

Server Client Tools

Page 26: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Core

Core.Native

Core.Net

FileModule

LogModule

ShodownFile

ShodownLog

Page 27: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Page 28: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Page 29: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Core

FileModule LogModule

Shodown File

Shodown Log

Page 30: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Engine

Graphics

DB

Input

Sound

Network

UI

Page 31: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Page 32: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Graphic Manager

IGraphic Factory

IGraphic Source

IRenderer

Gamebryo Factory

Graphic Source

Renderer

GraphicModule

GamebryoWrapper

Graphic Object

Page 33: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

컨텐츠를 개발할 때에는 컨텐츠’만’ 개발하자

Page 34: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

플레이어가 몬스터를 강베기 스킬로 공격한다

플레이어 모델을 띄운다 몬스터 모델을 띄운다 강베기 애니메이션을 재생한다 피격 애니메이션을 재생한다 데미지 계산을 한다 HP를 깎는다 이펙트를 터뜨린다 사운드를 재생시킨다 UI 연출을 한다 모델을 어떻게?

애니메이션을 어떻게? 이펙트 렌더링을 어떻게? 사운드 재생을 어떻게? 이미지를 화면에 어떻게?

Page 35: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Contents GameBase

System

Server

System

Client

System Client

Logic

Server

SinglePlay

Test

Page 36: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

클라이언트 컨텐츠

공통 컨텐츠

서버 컨텐츠

클라이언트 실행 파일 / 모듈의 조합

로직 서버 실행 파일 / 모듈의 조합

싱글 테스트 실행 파일 / 모듈의 조합

Page 37: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

ClientSystem ServerSystem

GameBase System

Client SinglePlayTest LogicServer

Page 38: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

ClientSystem ServerSystem

GameBase System

Network Module

Database Module

Graphic Module

UI Module

Sound Module

Input Module

Page 39: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

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

Page 40: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Client LogicServer

Gamebryo Wrapper

Scaleform Wrapper

Shodown Sound

Shodown Input

ADO Database

DBS Connector

Lua Database

SinglePlayTest

Page 41: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

세션 중심 개발

• 유저와 서버 사이의 1:1 이벤트

• 존 입장 / 변경 / 퇴장

• 옵션 정보 저장

• 등 게임 외적인 이벤트

Page 42: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Network Manager

Network Factory

ServerBase

ClientBase

ClientObject Base

ClientSession Base

IConnect Observer

IAccept Observer

ServerSession Base

ServerObject Base

Page 43: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

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

Page 44: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Server Base

Accept Observer

Page 45: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Client Base

Network Manager

Server Base

Accept Observer

Page 46: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Client Base

Network Manager

Server Base

Accept Observer

접속

Page 47: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Client Base

Network Manager

Server Base

Accept Observer

접속

Page 48: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Client Base

Network Manager

Server Base

Accept Observer

접속

Client Session

생성

Page 49: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Client Base

Network Manager

Server Base

Accept Observer

접속

연결

Client Session

생성

Page 50: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Client Base

Network Manager

Server Base

Accept Observer

접속

연결

알림

Client Session

생성

Page 51: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Client Base

Network Manager

Server Base

Accept Observer

접속

연결

알림

User

Client Session

생성

Page 52: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Client Base

Network Manager

Server Base

Accept Observer

접속

연결

알림

User

Server Session

Client Session

생성

Page 53: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Client Base

Network Manager

Server Base

Accept Observer

접속

연결

알림

User

연결

Server Session

Client Session

생성

Page 54: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Client Base

Network Manager

Server Base

Accept Observer

접속

연결

알림

User

연결

Server Session

Client Session

생성 Client Base

Network Manager

Client Session

User

Server Session

Page 55: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Page 56: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

메시지 하나로 끝나는 일은 없다

Page 57: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Page 58: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Coroutine

A B

Page 59: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

시간 흐름

A

B

C

Page 60: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

문제는…

• 게임 로직은 C++로 만든다!

• C++에서 코루틴을 쓰고 싶다!

• C++은 코루틴을 지원하지 않는다?!

Page 61: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Page 62: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Boost 비공식 라이브러리

Page 63: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Page 64: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Page 65: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

문제는…

• 윈도우 비스타/2008 이상에서만 동작한다!

• 서버는 윈도우 2008 이상을 사용하면 된다…

• 하지만 클라이언트에서는 못쓴다!!

• 이유는 몇몇 Fiber 관련 API 때문…

Page 66: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

!!!!!

민철님(@summerlight00) 사..사…..감사합니다!

Page 67: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Boost 만세! 올리버 코왈크씨 만세!!!

STL TR 시리즈에 context와 coroutine이 포함되길 기대합니다..

Page 68: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

아직 시간이 없어..

써보진 못했지만…

곧 변경할 예정…..

아마도 KGC 2012가 끝난 다음 바로..?!

Page 69: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

Call

Yield

Resume

Yield

Resume

Yield

Resume

End

Page 70: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

유저시퀀스

• 유저 별로 발생하는 게임 외적인 이벤트 로직의 객체화 • 시퀀스 하나 = 이벤트의 처음부터 끝까지 • 내부적으로 boost::coroutine을 사용하여 구현

Page 71: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

외부 인터페이스

User에 접근 가능

코루틴 인터페이스

실제 실행 함수

코루틴 함수

Page 72: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

User

Page 73: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

User – Update()에서 실행

버퍼에서 데이터 Pop 하여 받으려는 변수로 바로 가져옴

Network - OnRecv()에서 실행

유저 시퀀스의 스택 메모리에 할당됨

Thread가 달라도 문제 없음

유저시퀀스는 추가복사 없이 데이터를 로직 코드로 바로 가져올 수 있다

Page 74: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

메시지에서 사용할 데이터 형식 메시지 타입

선언한 순서로 메시지ID 할당

버퍼에 데이터 넣기

버퍼에서 데이터 꺼내기

메시지ID + 데이터 타입

Page 75: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

죄송합니다.. 시간에 쫓겨 급해서 Boost 전처리기 메타를 썼습니다..

Page 76: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

시퀀스 생성

User - Update

코루틴 생성 후 Yield

Resume Wait() 만나면

Yield

메시지 도착

Resume 데이터 Pop

Yield

User - Update

Resume

유저시퀀스의 로직은 모두 User 객체의 Update에서 실행되는 것을 보장한다

코 루틴

메인 루틴

: Network Thread

: Main Thread

Page 77: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

유저시퀀스에서 프로시저 호출

Page 78: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

User

Database Object

Server Session

User 객체가 요청한 프로시저 결과는 User 객체가 받는다

User 객체가 전송한 메시지는 해당 User가 받는다

DatabaseModule NetworkModule

Page 79: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

유저시퀀스에서 유저시퀀스 호출

Page 80: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

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

게임 오브젝트 중심 개발

Page 81: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

에서 설명합니다!

Page 82: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

유연한 컨텐츠 개발을 위해서

무조건 데이터 드리븐 X

컨텐츠와 컨텐츠가 아닌 것 분리

기능별로 모듈화

최대한 응집성이 떨어지지 않게

수치 데이터 + 로직 모듈 + 모듈 조합 스크립트 = 데이터드리븐

Page 83: Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

감사합니다

박성준 mail : [email protected] twitter : @kgun86

Special Thanks to : Dragonfly SS팀 일동/ 게임개발포에버 필진 일동 / 민철님 / 퐆삼촌 / 조진현님 / 김정우님 / 오즈형 / 레아형 / 민근형 / 티스형 / Hybrid님 / 창희님 / 대마왕님 / banhae님 / 정균님 / 스티브 / 바레로 박사님 / 김토마님 / Cagetu님 / 달땡땡님 / 퐁퐁퐁님 / 진짜님 / 박PD님 / 비토님 / 어제 같이 술 마신 분들 / 트친분들