14. 그래픽스
프로그래머
툴 물리 엔진
프로그래머 프로그래머
네트워크 인공 지능
프로그래머 프로그래머
Input 사운드
프로그래머 프로그래머
UI 게임 플레이
프로그래머 프로그래머
스크립터
15. 그래픽스
프로그래머
게임 플레이
프로그래머
UI
프로그래머
네트워크 툴
프로그래머 프로그래머
Input
프로그래머
DB 인공 지능
프로그래머 프로그래머
사운드
프로그래머
스크립터
물리 엔진
프로그래머
서버 컨텐츠 클라이언트
16. 컨텐츠 개발 컨셉
• 세션 중심 개발
• 유저와 서버 사이의 1:1 이벤트
• 존 입장 / 변경 / 퇴장
• 옵션 정보 저장
• 게임 외적인 이벤트
• 게임 오브젝트 중심 개발
• 게임 오브젝트들 사이의 이벤트
• 이동 / 공격 / 피격
• 아이템 떨어뜨리기 / 줍기
• 게임 내적인 이벤트
17. Core
Engine
Shodown
Contents
Tools
Server
Platform
18. Core
Engine
Contents
Logic
Server
Client Tools
26. 플레이어가
몬스터를
강베기 스킬로
공격한다
플레이어 모델을 띄운다
몬스터 모델을 띄운다
강베기 애니메이션을 재생한다
피격 애니메이션을 재생한다
데미지 계산을 한다
HP를 깎는다
이펙트를 터뜨린다
사운드를 재생시킨다
UI 연출을 한다 모델을 어떻게?
애니메이션을 어떻게?
이펙트 렌더링을 어떻게?
사운드 재생을 어떻게?
이미지를 화면에 어떻게?
27. Client
Client
System
Server Logic
System Server
GameBase SinglePlay
Contents
System Test
28. 클라이언트 컨텐츠
공통 컨텐츠
서버 컨텐츠
클라이언트 실행 파일 / 모듈의 조합
로직 서버 실행 파일 / 모듈의 조합
싱글 테스트 실행 파일 / 모듈의 조합
29. GameBase
System
ServerSystem ClientSystem
LogicServer SinglePlayTest Client
33. 세션 중심 개발
• 유저와 서버 사이의 1:1 이벤트
• 존 입장 / 변경 / 퇴장
• 옵션 정보 저장
• 등 게임 외적인 이벤트
34. IAccept
Observer
ServerSession
Base
ServerBase
ServerObject
Base
Network Network
Manager Factory
IConnect
Observer
ClientBase
ClientSession
Base
ClientObject
Base
35. Server
Server Server Server Server Server
Session Session Session Session Session
Client Client Client Client Client
Session Session Session Session Session
Client Client Client Client Client
37. Accept
Observer
Server
Base
Client
Base
Network
Manager
38. Accept
Observer
Server
Base
Client
Base
Network
접속 Manager
39. Accept
Observer
Server
Base
Client
Base
Network
접속 Manager
40. Accept
Observer
Server
Base
Client
Session
생성 Client
Base
Network
접속 Manager
41. Accept
Observer
Server
Base
연결
Client
Session
생성 Client
Base
Network
접속 Manager
42. Accept
Observer
알림
Server
Base
연결
Client
Session
생성 Client
Base
Network
접속 Manager
43. User
Accept
Observer
알림
Server
Base
연결
Client
Session
생성 Client
Base
Network
접속 Manager
44. User
Accept
Observer
알림
Server
Session
Server
Base
연결
Client
Session
생성 Client
Base
Network
접속 Manager
45. User
Accept
Observer
알림
Server
Session
Server
Base
연결
연결
Client
Session
생성 Client
Base
Network
접속 Manager
46. User User
Accept
Observer
알림
Server Server
Session Session
Server
Base
연결
연결
Client Client
Session Session
생성 Client Client
Base Base
Network Network
접속 Manager Manager
64. 유저시퀀스는 추가복사 없이 데이터를 로직 코드로 바로 가져올 수 있다
유저 시퀀스의
스택 메모리에 할당됨
버퍼에서 데이터 Pop 하여
받으려는 변수로 바로 가져옴
Network - OnRecv()에서 실행
User – Update()에서 실행
Thread가 달라도 문제 없음
65. 메시지ID + 데이터 타입
메시지에서 사용할 데이터 형식 메시지 타입
선언한 순서로
메시지ID 할당
버퍼에 데이터 넣기
버퍼에서 데이터 꺼내기
67. 유저시퀀스의 로직은 모두 User 객체의 Update에서 실행되는 것을 보장한다
시퀀스 생성 메시지 도착
Resume
코루틴 생성 후 Wait() 만나면
Resume 데이터 Pop Resume
Yield Yield
Yield
코 루틴
User - Update User - Update
메인 루틴
: Network Thread
: Main Thread
91. 게임 오브젝트와 네트워크 통신
Server
NPC1 Player1 NPC2
Server Server
Server
Object Object
Object
Client Client Client Client Client Client
Object Object Object Object Object Object
NPC1 Player1 NPC2 NPC1 Player1 NPC2
Client Client
92. NPC1 Player1 NPC2
Server Server
Server
Object Object
Object
Server
Base
93. NPC1 Player1 NPC2
Server Server
Server
Object Object
Object
Server
Base
94. NPC1 Player1 NPC2
ID : 0 ID : 1 ID : 2
Server Server
Server
Object Object
Object
Server
Base
95. NPC1 Player1 NPC2
ID : 0 ID : 1 ID : 2
Server Server
Server
Object Object
Object
Server
Base
Client
Base
96. NPC1 Player1 NPC2
ID : 0 ID : 1 ID : 2
Server Server
Server
Object Object
Object
Server
Base
Client
Base
Client Client Client
Object Object Object
ID : 0 ID : 1 ID : 2
NPC1 Player1 NPC2
97. NPC1 Player1 NPC2
ID : 0 ID : 1 ID : 2
Server Server
Server
Object Object
Object
Server
Base
Client
Base
Client Client Client
Object Object Object
ID : 0 ID : 1 ID : 2
NPC1 Player1 NPC2
98. NPC1 Player1 NPC2
ID : 0 ID : 1 ID : 2
Server Server
Server
Object Object
Object
Server
Base
Client
Base
Client Client Client
Object Object Object
ID : 0 ID : 1 ID : 2
NPC1 Player1 NPC2
99. NPC1 Player1 NPC2
ID : 0 ID : 1 ID : 2
Server Server
Server
Object Object
Object
Server
Base
Client Client
Base Base
Client Client Client Client Client Client
Object Object Object Object Object Object
ID : 0 ID : 1 ID : 2 ID : 0 ID : 1 ID : 2
NPC1 Player1 NPC2 NPC1 Player1 NPC2
100. NPC1 Player1 NPC2
ID : 0 ID : 1 ID : 2
Server Server
Server
Object Object
Object
Server
Base
Client Client
Base Base
Client Client Client Client Client Client
Object Object Object Object Object Object
ID : 0 ID : 1 ID : 2 ID : 0 ID : 1 ID : 2
NPC1 Player1 NPC2 NPC1 Player1 NPC2
102. Action과 Message를 연결
Message가 ServerObject/ClientObject에 도착하면 연결된 Action 실행
Network
Action
Manager
생성
Server/ 함수
Client Action
Object
Network - OnRecv
103. 메시지ID + 데이터 타입
메시지에서 사용할 데이터 형식 메시지 타입
선언한 순서로
메시지ID 할당
버퍼에 데이터 넣기
버퍼에서 데이터 꺼내기
104. 액션 실행을 위한 네트워크로 받은
메시지를 받은 엔터티
함수포인터 메시지 버퍼
ServerObject와 연결 ClientObject와 연결
105.
106.
107. 액션과 네트워크 통신의 연결
메시지와 Action의 연결 선언
메시지와 Action의
데이터가 같아야만
컴파일이 된다
메시지와 Action의 연결 정의
120. Entity
Script Controller 정보
Controller
Manager lua_state에 입력
Entity별로
lua table과
lua thread 생성
Controller의 owner로 Controller Instance
EntityWrapper 생성 후 lua table 생성하여
Controller Instance Controller userdata와 연결
lua table에 “owner” Set
123. 어떻게?!
Game Animation Physics Rendering Audio
Loop
124. Set up
Thread1
Game Thread2
Thread0 Thread3
Loop
Process
Result
125. 현재 구조를 보면…
• Controller는 Owner가 가지고 있는 것만 접근
-> Owner의 Component / Controller
• 다른 Entity에는 DoAction으로 할 일 전달
• Entity별로 Controller들 업데이트
Entity별로 Action Queue 처리
Component별로 업데이트
126. 다시 정리해보면
• Entity는 다른 Entity에 직접 접근 X
• Component는 다른 Component에 직접 접근 X
• Entity별로 Controller들 업데이트
Entity별로 Action Queue 처리
Component별로 업데이트
128. Set up
Thread1 Thread2
Thread0 Thread3 Controller
Set up
Thread0 Thread2
Game Thread1 Thread3 Action
Loop
Set up
Thread1
Thread0 Thread2 Thread3 Component
Process
Result
129. 유연한 컨텐츠 개발을 위해서
무조건 데이터 드리븐 X
컨텐츠와 컨텐츠가 아닌 것 분리
기능별로 모듈화
최대한 응집성이 떨어지지 않게
수치 데이터 + 로직 모듈 + 모듈 조합 스크립트 = 데이터드리븐