96 lines
3.7 KiB
Markdown
96 lines
3.7 KiB
Markdown
---
|
|
마지막수정일: 2024-03-01
|
|
---
|
|
|
|
# Component 구성
|
|
|
|
컴포넌트 구성과 역할을 설명합니다.
|
|
|
|
## 객체
|
|
|
|
서버 내에 객체는 다음 그림과 같습니다.
|
|
|
|

|
|
|
|
|
|
### MongoDB
|
|
|
|
메인 DB는 MongoDB입니다.
|
|
|
|
Collection은 다양하나, 게임 엔진에 필요한 값과 게임 엔진에 필요하지 않은 값이 분리됩니다.
|
|
|
|
분리되는 예시는 다음과 같습니다.
|
|
|
|
- 게임 내부 Collection
|
|
- 장수의 능력치
|
|
- 장수의 금/쌀
|
|
- 장수의 수비 켬/끔 여부
|
|
- 도시의 현재 스탯
|
|
- 국가의 금/쌀, 전략 수치
|
|
- 국가의 게임 내 정책(세율, 지급률)
|
|
|
|
- 게임 외부 Collection
|
|
- 장수의 메시지함
|
|
- 국가의 방침 게시물
|
|
- 국가의 회의록
|
|
- 국가간 외교 메시지
|
|
- 로그인 정보, 벌점
|
|
- 유니크 경매장 진행상태
|
|
|
|
|
|
### 게임 엔진
|
|
|
|
턴 실행과 관련된 게임 핵심 로직을 처리하는 엔진 컴포넌트이며, 게임 내부 Collection에 대한 쓰기 명령은 게임 엔진에서만 가능합니다.
|
|
|
|
게임 엔진은 예외적인 경우에 게임 외부 Collection의 쓰기 명령을 할 수 있지만, 게임 내부에 영향을 주지 않는 경우여야만 합니다. 만약 예전에는 게임 외부 Collection에 기록되는 데이터였다 할지라도, 게임 엔진에서 다루기 시작한다면 게임 내부 Collection으로 이관됩니다.
|
|
|
|
#### 명령 처리 순서
|
|
|
|

|
|
|
|
게임 엔진은 내부적으로 세개의 처리 큐를 가집니다.
|
|
|
|
- 장수 처리 Queue: 턴마다 처리되는 장수 명령 처리 Queue입니다.
|
|
- NPC Action Queue: NPC의 명령을 처리하는 Queue입니다.
|
|
- NPC 명령 선택기의 입력 요청이 이곳에 쌓입니다.
|
|
- 유저 Action Queue: 유저의 명령을 처리합니다.
|
|
- API 처리기를 통해 전달됩니다.
|
|
|
|
세개의 처리 큐는 장수 처리 Queue > NPC Action Queue > 유저 Action Queue 순의 우선순위를 가집니다.
|
|
|
|
#### DB 반영 시점
|
|
|
|
MongoDB에 데이터가 기록되는 시점은 Queue의 아이템 하나를 해소했을 때 이루어집니다.
|
|
즉, 장수의 턴 하나가 완전히 실행되었을 때에만 DB에 반영된다고 할 수 있습니다.
|
|
|
|
게임 엔진 내에서 변경되는 내용은 메모리 내의 저장소에만 담아두고, 처리를 마치는 시점에 변경된 내용을 정리하여 한번에 쓰기 작업을 수행하여 Transaction을 모사합니다.
|
|
|
|
|
|
### NPC 명령 선택기
|
|
|
|
NPC 명령 선택기는 NPC가 어떤 턴을 실행해야할지만을 연산하는 컴포넌트입니다.
|
|
|
|
NPC의 실행턴보다 일정 시간 이전에 적절한 턴이 무엇인지 계산하고, 게임 엔진으로 결과값을 전송합니다.
|
|
|
|
이때 명령의 규격은 일반 유저가 내리는 명령 규격과 유사한 형태를 갖습니다.
|
|
|
|
> [!NOTE]
|
|
>
|
|
> 기존 삼모전 PHP에서는 명령 선택기가 게임 엔진과 동기적으로 구성되어있었습니다.
|
|
|
|
|
|
|
|
### API 처리기
|
|
|
|
API 처리기는 유저의 명령을 받아 1차적으로 처리합니다.
|
|
|
|
게임 외부 데이터에 대한 처리라면 읽기/쓰기를 모두 수행하며, 게임 내부 데이터이면 읽기 작업은 직접할 수 있습니다.
|
|
|
|
턴 입력 등 쓰기 작업이 요구되는 경우라면 게임 엔진에 해당 작업을 요청하고, 작업이 끝날때까지 기다린 다음, 엔진으로부터 결과값을 받아 반환합니다.
|
|
|
|
> [!WARNING]
|
|
>
|
|
> **어떠한 경우에도** 게임 내부 DB에 직접 쓰기를 해서는 안됩니다.
|
|
>
|
|
> 게임 엔진은 메모리 cache에 강력히 의존하므로, 내부 DB에 직접 쓰는 작업은 게임 엔진의 처리 결과를 훼손할 것입니다.
|