그래픽스
프로그래머
툴 물리 엔진
프로그래머 프로그래머
네트워크 인공 지능
프로그래머 프로그래머
Input 사운드
프로그래머 프로그래머
UI 게임 플레이
프로그래머 프로그래머
스크립터
15.
그래픽스
프로그래머
게임 플레이
프로그래머
UI
프로그래머
네트워크 툴
프로그래머 프로그래머
Input
프로그래머
DB 인공 지능
프로그래머 프로그래머
사운드
프로그래머
스크립터
물리 엔진
프로그래머
서버 컨텐츠 클라이언트
16.
컨텐츠 개발 컨셉
•세션 중심 개발
• 유저와 서버 사이의 1:1 이벤트
• 존 입장 / 변경 / 퇴장
• 옵션 정보 저장
• 게임 외적인 이벤트
• 게임 오브젝트 중심 개발
• 게임 오브젝트들 사이의 이벤트
• 이동 / 공격 / 피격
• 아이템 떨어뜨리기 / 줍기
• 게임 내적인 이벤트
17.
Core
Engine
Shodown
Contents
Tools
Server
Platform
플레이어가
몬스터를
강베기 스킬로
공격한다
플레이어 모델을 띄운다
몬스터 모델을 띄운다
강베기 애니메이션을 재생한다
피격 애니메이션을 재생한다
데미지 계산을 한다
HP를 깎는다
이펙트를 터뜨린다
사운드를 재생시킨다
UI 연출을 한다 모델을 어떻게?
애니메이션을 어떻게?
이펙트 렌더링을 어떻게?
사운드 재생을 어떻게?
이미지를 화면에 어떻게?
27.
Client
Client
System
Server Logic
System Server
GameBase SinglePlay
Contents
System Test
28.
클라이언트 컨텐츠
공통컨텐츠
서버 컨텐츠
클라이언트 실행 파일 / 모듈의 조합
로직 서버 실행 파일 / 모듈의 조합
싱글 테스트 실행 파일 / 모듈의 조합
29.
GameBase
System
ServerSystem ClientSystem
LogicServer SinglePlayTest Client
세션 중심 개발
•유저와 서버 사이의 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
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
유저시퀀스는 추가복사 없이데이터를 로직 코드로 바로 가져올 수 있다
유저 시퀀스의
스택 메모리에 할당됨
버퍼에서 데이터 Pop 하여
받으려는 변수로 바로 가져옴
Network - OnRecv()에서 실행
User – Update()에서 실행
Thread가 달라도 문제 없음
65.
메시지ID + 데이터타입
메시지에서 사용할 데이터 형식 메시지 타입
선언한 순서로
메시지ID 할당
버퍼에 데이터 넣기
버퍼에서 데이터 꺼내기
유저시퀀스의 로직은 모두User 객체의 Update에서 실행되는 것을 보장한다
시퀀스 생성 메시지 도착
Resume
코루틴 생성 후 Wait() 만나면
Resume 데이터 Pop Resume
Yield Yield
Yield
코 루틴
User - Update User - Update
메인 루틴
: Network Thread
: Main Thread
게임 오브젝트와 네트워크통신
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
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
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별로 업데이트
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
컨텐츠와 컨텐츠가 아닌 것 분리
기능별로 모듈화
최대한 응집성이 떨어지지 않게
수치 데이터 + 로직 모듈 + 모듈 조합 스크립트 = 데이터드리븐