kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
TRANSCRIPT
![Page 1: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/1.jpg)
유연한 컨텐츠 개발을 위한
온라인 게임 아키텍처
Kasa Study (2012/11/01) 박성준
![Page 2: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/2.jpg)
온라인 게임 액체처럼 만들자
![Page 3: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/3.jpg)
콘솔 게임
![Page 4: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/4.jpg)
![Page 5: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/5.jpg)
온라인 게임
![Page 6: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/6.jpg)
![Page 7: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/7.jpg)
![Page 8: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/8.jpg)
![Page 9: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/9.jpg)
![Page 10: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/10.jpg)
![Page 11: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/11.jpg)
그렇다면..
컨텐츠는 누가 만들어야 할까요?
![Page 12: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/12.jpg)
서버 프로그래머?
클라이언트 프로그래머?
![Page 13: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/13.jpg)
서버
프로그래머
컨텐츠
프로그래머
클라이언트
프로그래머
![Page 14: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/14.jpg)
그래픽스
프로그래머 물리 엔진
프로그래머
인공 지능
프로그래머
사운드
프로그래머
게임 플레이
프로그래머
스크립터
UI
프로그래머
Input
프로그래머
네트워크
프로그래머
툴
프로그래머
![Page 15: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/15.jpg)
네트워크 프로그래머
툴 프로그래머
그래픽스 프로그래머
물리 엔진 프로그래머
인공 지능 프로그래머
사운드 프로그래머
게임 플레이 프로그래머
스크립터
UI 프로그래머
Input 프로그래머
DB 프로그래머
서버 클라이언트 컨텐츠
![Page 16: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/16.jpg)
컨텐츠 개발 컨셉
• 세션 중심 개발
• 유저와 서버 사이의 1:1 이벤트
• 존 입장 / 변경 / 퇴장
• 옵션 정보 저장
• 게임 외적인 이벤트
• 게임 오브젝트 중심 개발
• 게임 오브젝트들 사이의 이벤트
• 이동 / 공격 / 피격
• 아이템 떨어뜨리기 / 줍기
• 게임 내적인 이벤트
![Page 17: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/17.jpg)
Shodown
Core
Engine
Contents
Tools
Server Platform
![Page 18: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/18.jpg)
Core
Engine
Contents
Logic
Server Client Tools
![Page 19: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/19.jpg)
Core
Core.Native
Core.Net
FileModule
LogModule
ShodownFile
ShodownLog
![Page 20: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/20.jpg)
인터페이스 프로젝트
인터페이스의 구현 프로젝트
전반적으로 사용되는 것들..
![Page 21: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/21.jpg)
Core
FileModule LogModule
Shodown File
Shodown Log
![Page 22: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/22.jpg)
Engine
Graphics
DB
Input
Sound
Network
UI
![Page 23: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/23.jpg)
수정중인 오픈 라이브러리…
인터페이스 프로젝트
인터페이스의 구현 프로젝트
테스트 프로젝트
그 외 기타 등등(xml, lua, fx 등)
![Page 24: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/24.jpg)
Graphic Manager
IGraphic Factory
IGraphic Source
IRenderer
Gamebryo Factory
Graphic Source
Renderer
GraphicModule
GamebryoWrapper
Graphic Object
![Page 25: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/25.jpg)
컨텐츠를 개발할 때에는 컨텐츠’만’ 개발하자
![Page 26: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/26.jpg)
플레이어가 몬스터를 강베기 스킬로 공격한다
플레이어 모델을 띄운다 몬스터 모델을 띄운다 강베기 애니메이션을 재생한다 피격 애니메이션을 재생한다 데미지 계산을 한다 HP를 깎는다 이펙트를 터뜨린다 사운드를 재생시킨다 UI 연출을 한다 모델을 어떻게?
애니메이션을 어떻게? 이펙트 렌더링을 어떻게? 사운드 재생을 어떻게? 이미지를 화면에 어떻게?
![Page 27: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/27.jpg)
Contents GameBase
System
Server
System
Client
System Client
Logic
Server
SinglePlay
Test
![Page 28: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/28.jpg)
클라이언트 컨텐츠
공통 컨텐츠
서버 컨텐츠
클라이언트 실행 파일 / 모듈의 조합
로직 서버 실행 파일 / 모듈의 조합
싱글 테스트 실행 파일 / 모듈의 조합
![Page 29: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/29.jpg)
ClientSystem ServerSystem
GameBase System
Client SinglePlayTest LogicServer
![Page 30: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/30.jpg)
ClientSystem ServerSystem
GameBase System
Network Module
Database Module
Graphic Module
UI Module
Sound Module
Input Module
![Page 31: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/31.jpg)
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 32: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/32.jpg)
Client LogicServer
Gamebryo Wrapper
Scaleform Wrapper
Shodown Sound
Shodown Input
ADO Database
DBS Connector
Lua Database
SinglePlayTest
![Page 33: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/33.jpg)
세션 중심 개발
• 유저와 서버 사이의 1:1 이벤트
• 존 입장 / 변경 / 퇴장
• 옵션 정보 저장
• 등 게임 외적인 이벤트
![Page 34: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/34.jpg)
Network Manager
Network Factory
ServerBase
ClientBase
ClientObject Base
ClientSession Base
IConnect Observer
IAccept Observer
ServerSession Base
ServerObject Base
![Page 35: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/35.jpg)
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 36: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/36.jpg)
Server Base
Accept Observer
![Page 37: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/37.jpg)
Client Base
Network Manager
Server Base
Accept Observer
![Page 38: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/38.jpg)
Client Base
Network Manager
Server Base
Accept Observer
접속
![Page 39: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/39.jpg)
Client Base
Network Manager
Server Base
Accept Observer
접속
![Page 40: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/40.jpg)
Client Base
Network Manager
Server Base
Accept Observer
접속
Client Session
생성
![Page 41: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/41.jpg)
Client Base
Network Manager
Server Base
Accept Observer
접속
연결
Client Session
생성
![Page 42: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/42.jpg)
Client Base
Network Manager
Server Base
Accept Observer
접속
연결
알림
Client Session
생성
![Page 43: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/43.jpg)
Client Base
Network Manager
Server Base
Accept Observer
접속
연결
알림
User
Client Session
생성
![Page 44: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/44.jpg)
Client Base
Network Manager
Server Base
Accept Observer
접속
연결
알림
User
Server Session
Client Session
생성
![Page 45: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/45.jpg)
Client Base
Network Manager
Server Base
Accept Observer
접속
연결
알림
User
연결
Server Session
Client Session
생성
![Page 46: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/46.jpg)
Client Base
Network Manager
Server Base
Accept Observer
접속
연결
알림
User
연결
Server Session
Client Session
생성 Client Base
Network Manager
Client Session
User
Server Session
![Page 47: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/47.jpg)
![Page 48: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/48.jpg)
메시지 하나로 끝나는 일은 없다
![Page 49: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/49.jpg)
![Page 50: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/50.jpg)
Coroutine
A B
![Page 51: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/51.jpg)
시간 흐름
A
B
C
![Page 52: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/52.jpg)
문제는…
• 게임 로직은 C++로 만든다!
• C++에서 코루틴을 쓰고 싶다!
• C++은 코루틴을 지원하지 않는다?!
![Page 53: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/53.jpg)
![Page 54: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/54.jpg)
Boost 비공식 라이브러리
![Page 55: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/55.jpg)
![Page 56: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/56.jpg)
![Page 57: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/57.jpg)
문제는…
• 윈도우 비스타/2008 이상에서만 동작한다!
• 서버는 윈도우 2008 이상을 사용하면 된다…
• 하지만 클라이언트에서는 못쓴다!!
• 이유는 몇몇 Fiber 관련 API 때문…
![Page 58: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/58.jpg)
Boost 공식 라이브러리 포함
STL TR 시리즈에 context와 coroutine이 포함되길 기대합니다..
![Page 59: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/59.jpg)
Coroutine도 Boost 포함 예정
![Page 60: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/60.jpg)
Call
Yield
Resume
Yield
Resume
Yield
Resume
End
![Page 61: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/61.jpg)
유저시퀀스
• 유저 별로 발생하는 게임 외적인 이벤트 로직의 객체화 • 시퀀스 하나 = 이벤트의 처음부터 끝까지 • 내부적으로 boost::coroutine을 사용하여 구현
![Page 62: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/62.jpg)
외부 인터페이스
User에 접근 가능
코루틴 인터페이스
실제 실행 함수
코루틴 함수
![Page 63: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/63.jpg)
User
![Page 64: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/64.jpg)
User – Update()에서 실행
버퍼에서 데이터 Pop 하여 받으려는 변수로 바로 가져옴
Network - OnRecv()에서 실행
유저 시퀀스의 스택 메모리에 할당됨
Thread가 달라도 문제 없음
유저시퀀스는 추가복사 없이 데이터를 로직 코드로 바로 가져올 수 있다
![Page 65: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/65.jpg)
메시지에서 사용할 데이터 형식 메시지 타입
선언한 순서로 메시지ID 할당
버퍼에 데이터 넣기
버퍼에서 데이터 꺼내기
메시지ID + 데이터 타입
![Page 66: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/66.jpg)
죄송합니다.. 시간에 쫓겨 급해서 Boost 전처리기 메타를 썼습니다..
![Page 67: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/67.jpg)
시퀀스 생성
User - Update
코루틴 생성 후 Yield
Resume Wait() 만나면
Yield
메시지 도착
Resume 데이터 Pop
Yield
User - Update
Resume
유저시퀀스의 로직은 모두 User 객체의 Update에서 실행되는 것을 보장한다
코 루틴
메인 루틴
: Network Thread
: Main Thread
![Page 68: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/68.jpg)
유저시퀀스에서 프로시저 호출
![Page 69: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/69.jpg)
User
Database Object
Server Session
User 객체가 요청한 프로시저 결과는 User 객체가 받는다
User 객체가 전송한 메시지는 해당 User가 받는다
DatabaseModule NetworkModule
![Page 70: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/70.jpg)
유저시퀀스에서 유저시퀀스 호출
![Page 71: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/71.jpg)
게임 오브젝트 중심 개발
• 게임 오브젝트들 사이의 이벤트
• 이동 / 공격 / 피격
• 아이템 떨어뜨리기 / 줍기
• 등 게임 내적인 이벤트
![Page 72: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/72.jpg)
• 플레이어, 몬스터 등 캐릭터
• 바위, 나무, 건물 등 배경 오브젝트
• 함정, 회복아이템 등 트리거
• 미사일, 수류탄, 파편 등
• 카메라, 광원 등
• 캐릭터가 서있는 지형
오브젝
트
캐릭터
지형
프랍
트리거
광원
카메라
발사체
레벨
게임 오브젝트!
![Page 73: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/73.jpg)
오브젝트
오브젝트
오브젝트
오브젝
트
캐릭터
지형
프랍
트리거
광원
카메라
발사체
레벨
상호작용
게임 = 게임 오브젝트 사이의 상호작용
![Page 74: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/74.jpg)
컴포넌트 + 게임 오브젝트
![Page 75: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/75.jpg)
컴포넌트 설계는 좋지만..
• 의존적인 컴포넌트 구분!
• 메시지 통신X 메시지 객체 통신!
• 그렇지만 의존성은 피하자!
• 스크립트 친화적 구현!
![Page 76: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/76.jpg)
의존적인 컴포넌트?
![Page 77: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/77.jpg)
![Page 78: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/78.jpg)
Controller
• 의존적인 컴포넌트는 컨트롤러의 속성을 가진다 • 다른 컴포넌트에 접근하는걸 고려하여 디자인 • 컴포넌트와는 다르게 활성화/비활성화 존재
![Page 79: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/79.jpg)
![Page 80: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/80.jpg)
Entity
AAA Controller
AAA Component
BBB Component
BBB Controller
Owner Entity가 가진 다른 컴포넌트와 컨트롤러에 접근 가능!
![Page 81: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/81.jpg)
메시지 통신?
![Page 82: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/82.jpg)
분산되는 로직 처리
= 응집력이 떨어진다
순서대로 로직 처리가 힘듦
= 작업 스트레스 증가
![Page 83: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/83.jpg)
1. 액션 단위로 로직 처리 2. 액션객체가 컴포넌트들에 접근
3. 게임 오브젝트는 액션들을 관리
![Page 84: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/84.jpg)
![Page 85: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/85.jpg)
죄송합니다.. 시간에 쫓겨 급해서 Boost 전처리기 메타를 썼습니다..
![Page 86: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/86.jpg)
전처리기 메타 코드가 만들어내는 코드
![Page 87: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/87.jpg)
Action의 데이터
위에서 정의한 Action데이터로 virtual void Do( 데이터 ) = 0; 순수 가상 함수가 만들어진다
GetOwner()를 이용하여 Action이 실행된 Entity를 얻어올 수 있다
액션의 구현
![Page 88: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/88.jpg)
Entity
AAA Action
AAA Component
BBB Component
AAA Controller
Owner Entity가 가진 다른 컴포넌트와 컨트롤러에 접근 가능!
DoAction 호출
생성
접근
![Page 89: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/89.jpg)
Entity
Entity Handler DoAction 함수를 가진다
다른 객체에 접근을 위해..
Controller와 Action의 Owner로 노출
다른 Entity / 또는 외부에서 접근
![Page 90: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/90.jpg)
Entity:: Update
Controller
Entity:: Update Action
Component System:: Update
업데이트 순서
![Page 91: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/91.jpg)
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 92: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/92.jpg)
Server Object
Server Object
Server Object
NPC1 Player1 NPC2
Server Base
![Page 93: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/93.jpg)
Server Object
Server Object
Server Object
NPC1 Player1 NPC2
Server Base
![Page 94: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/94.jpg)
Server Object
Server Object
Server Object
NPC1 Player1 NPC2
Server Base
ID : 0 ID : 1 ID : 2
![Page 95: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/95.jpg)
Server Object
Server Object
Server Object
NPC1 Player1 NPC2
Server Base
ID : 0 ID : 1 ID : 2
Client Base
![Page 96: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/96.jpg)
Server Object
Server Object
Server Object
NPC1 Player1 NPC2
Server Base
ID : 0 ID : 1 ID : 2
Player1
Client Object
Client Object
Client Object
NPC1 NPC2
ID : 0 ID : 1 ID : 2
Client Base
![Page 97: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/97.jpg)
Server Object
Server Object
Server Object
NPC1 Player1 NPC2
Server Base
ID : 0 ID : 1 ID : 2
Player1
Client Object
Client Object
Client Object
NPC1 NPC2
ID : 0 ID : 1 ID : 2
Client Base
![Page 98: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/98.jpg)
Server Object
Server Object
Server Object
NPC1 Player1 NPC2
Server Base
ID : 0 ID : 1 ID : 2
Player1
Client Object
Client Object
Client Object
NPC1 NPC2
ID : 0 ID : 1 ID : 2
Client Base
![Page 99: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/99.jpg)
Server Object
Server Object
Server Object
NPC1 Player1 NPC2
Server Base
ID : 0 ID : 1 ID : 2
Player1
Client Object
Client Object
Client Object
NPC1 NPC2
ID : 0 ID : 1 ID : 2
Client Base
Client Base
Player1
Client Object
Client Object
Client Object
NPC1 NPC2
ID : 0 ID : 1 ID : 2
![Page 100: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/100.jpg)
Server Object
Server Object
Server Object
NPC1 Player1 NPC2
Server Base
ID : 0 ID : 1 ID : 2
Player1
Client Object
Client Object
Client Object
NPC1 NPC2
ID : 0 ID : 1 ID : 2
Client Base
Client Base
Player1
Client Object
Client Object
Client Object
NPC1 NPC2
ID : 0 ID : 1 ID : 2
![Page 101: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/101.jpg)
Entity가 받은 메시지는 어떻게?
![Page 102: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/102.jpg)
Action과 Message를 연결 Message가 ServerObject/ClientObject에 도착하면 연결된 Action 실행
Network Action
Manager
Server/ Client Object
Network - OnRecv
Action
생성 함수
![Page 103: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/103.jpg)
메시지에서 사용할 데이터 형식 메시지 타입
선언한 순서로 메시지ID 할당
버퍼에 데이터 넣기
버퍼에서 데이터 꺼내기
메시지ID + 데이터 타입
![Page 104: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/104.jpg)
네트워크로 받은 메시지 버퍼
메시지를 받은 엔터티 액션 실행을 위한
함수포인터
ServerObject와 연결 ClientObject와 연결
![Page 105: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/105.jpg)
![Page 106: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/106.jpg)
![Page 107: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/107.jpg)
메시지와 Action의 연결 선언
메시지와 Action의 연결 정의
메시지와 Action의 데이터가 같아야만 컴파일이 된다
액션과 네트워크 통신의 연결
![Page 108: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/108.jpg)
게임 오브젝트와 스크립트
![Page 109: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/109.jpg)
lua_state
컨트롤러 테이블 컨트롤러 테이블 컨트롤러 테이블
Controller Table
컨트롤러 테이블 컨트롤러 테이블 컨트롤러 테이블
Component Table
컨트롤러 테이블 컨트롤러 테이블 컨트롤러 테이블 Instance
Table Lua Thread
![Page 110: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/110.jpg)
컨트롤러와 스크립트의 연결
![Page 111: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/111.jpg)
Entity
Controller Script
Manager
Controller 정보 lua_state에 입력
Entity별로 lua table과 lua thread 생성
Controller Instance lua table 생성하여 Controller userdata와 연결
![Page 112: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/112.jpg)
C++
AAA Controller Instance1
AAA Controller
AAA Controller Instance3
AAA Controller Instance2
AAA Controller Instance4
Lua
AAA Controller Instance1
AAA Controller Instance2
AAA Controller Instance3
AAA Controller Instance4
Class
Instance
table
table
AAA Controller Instance1
AAA Controller
userdata
meta table
AAA Controller Instance1
AAA Controller Instance1
AAA Controller Instance1
![Page 113: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/113.jpg)
부모 클래스와 자식 클래스 모두 연결할 경우?
![Page 114: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/114.jpg)
C++
AAA Controller
Lua
AAA Controller Instance
상속
BBB Controller
BBB Controller Instance
AAA Controller
AAA Controller Instance
meta table
BBB Controller
BBB Controller Instance
BBB Controller Instance AAA
Controller Instance
meta table
![Page 115: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/115.jpg)
스크립트와 연결
스크립트 함수 실행
C++ 함수 실행
![Page 116: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/116.jpg)
스크립트에서 컴포넌트 접근
![Page 117: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/117.jpg)
Entity
Component Script
Manager
Component 정보 lua_state에 입력
![Page 118: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/118.jpg)
C++
AAA Component Instance1
AAA Component
AAA Component Instance3
AAA Component Instance2
AAA Component Instance4
Lua
Class
Instance
table AAA Component
userdata AAA
Component Instance1
AAA Component Instance2
AAA Component Instance3
AAA Component Instance4
![Page 119: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/119.jpg)
Entity
Entity Wrapper
![Page 120: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/120.jpg)
Entity
Controller Script
Manager
Controller 정보 lua_state에 입력
Entity별로 lua table과 lua thread 생성
Controller Instance lua table 생성하여 Controller userdata와 연결
Controller의 owner로 EntityWrapper 생성 후 Controller Instance lua table에 “owner” Set
![Page 121: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/121.jpg)
![Page 122: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/122.jpg)
컴포넌트 설계의 장점 멀티쓰레딩!
![Page 123: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/123.jpg)
Game Loop
Animation Physics Rendering Audio
어떻게?!
![Page 124: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/124.jpg)
Game Loop
Set up
Thread0
Thread1 Thread2
Thread3
Process Result
![Page 125: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/125.jpg)
• Controller는 Owner가 가지고 있는 것만 접근
-> Owner의 Component / Controller
• 다른 Entity에는 DoAction으로 할 일 전달
• Entity별로 Controller들 업데이트
Entity별로 Action Queue 처리
Component별로 업데이트
현재 구조를 보면…
![Page 126: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/126.jpg)
• Entity는 다른 Entity에 직접 접근 X
• Component는 다른 Component에 직접 접근 X
• Entity별로 Controller들 업데이트
Entity별로 Action Queue 처리
Component별로 업데이트
다시 정리해보면
![Page 127: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/127.jpg)
Entity:: Update
Controller
Entity:: Update Action
Component System:: Update
업데이트 순서
![Page 128: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/128.jpg)
Game Loop
Set up
Thread0 Thread1 Thread2 Thread3
Set up
Thread0 Thread1 Thread2 Thread3
Set up
Thread0 Thread1 Thread2 Thread3
Process Result
Controller
Action
Component
![Page 129: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/129.jpg)
유연한 컨텐츠 개발을 위해서
무조건 데이터 드리븐 X
컨텐츠와 컨텐츠가 아닌 것 분리
기능별로 모듈화
최대한 응집성이 떨어지지 않게
수치 데이터 + 로직 모듈 + 모듈 조합 스크립트 = 데이터드리븐
![Page 130: Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처](https://reader036.vdocuments.site/reader036/viewer/2022081720/559759e71a28ab9e3c8b483c/html5/thumbnails/130.jpg)
감사합니다 (Q&A)