2025-01-02 TIL
1. 게임 데이터베이스에 필요한 것들
스테이지 구성 종류
- 심리스 방식
큰 맵을 하나 만들어 맵 이동 시에 새 지역을 로딩없이 자유롭게 이동할 수 있는 방식. 서버의 관점에선 하나의 맵에서 모두 처리하기 때문에 부하가 걸리기 쉬운 방식이다.
- 존 방식
맵을 작은 단위로 나눈 뒤 설정된 입구를 통해 서로를 연결하고 각 위치를 통해 맵을 이동하는 방식. 해당 방식은 맵의 부분만 로딩하고 처리해야 할 로직이 심리스에 비해 적다는 장점이 있으나 플레이어의 관점에서 로딩을 여러 번 경험하게 된다는 단점이 있다.
- 룸 방식
서버에 같은 맵을 여러 개 만들어 관리한다. 미니 게임, 인스턴트 던전 같은 식의 맵을 만들 때 사용된다. 최악의 케이스는 모든 유저가 각기 다른 던전에 들어가는 것으로, 유저마다 던전을 만들어야 한다. 또한 이 상태에서 유저가 던전 내부에서 접속을 종료할 경우 처리를 고민해 봐야 한다.
스테이지 내부를 꾸미기 위해선
게임의 데이터를 배치하기 위해서 테이블을 작성한다면 일단 X,Y축 정보가 있어야 한다. 기존 작업에선 로컬 데이터를 통해 관리하고 있었지만 데이터가 많아지게 될 경우 로컬 데이터가 많아지는 문제를 해결하기 위해서라도 데이터베이스 쪽에 좌표를 넣을 수 있도록 작업해야 한다.
위의 테이블의 경우는 스테이지에 유저가 들어가 있다는 것을 전제로 작업하는 방식으로, 메이플 같은 존 방식에 가깝다.
존 방식으로 해당 맵을 제작한다고 하면 들어갈 수 있는 맵들을 미리 만들어 놓고 각각의 맵 마다 연산을 통해 유저들의 정보를 확인하고 그래픽 처리 등을 하게 될 것이다.
</span>
공간 해싱(spatial hashing)
공간 객체에 대한 동적 색인 구조?
하나의 맵을 다시 세분화시켜 구역을 정하는 방법으로, 존 방식으로 나누기에는 너무 좁게 잡힐 경우를 상정할 수 있어 보인다.
하나의 스테이지에 비전투 구역, 전투 구역, 개인 구역, 공용 구역 등과 같이 나누는 방법으로, 공간 자체의 역할을 세분화시키면서 각각의 영역에서 처리해야 할 그래픽 처리를 좁힐 수 있다는 장점이 있다.```js const NUM_OF_AREA = 30; // 맵은 30개의 격자로 구성된다고 가정 const areas = new Map();
for (let i = 1; i <= NUM_OF_AREA; i += 1) { areas.set(i, []); // 최초에 공간마다 아무도 없다고 가정하고 빈 배열로 초기화 }
// 누군가 들어온다면 const areaNum = getAreaNum(user.x, user.y); const users = areas.get(areaNum); users.push(user);
// 누군가 이동을 한다면 const adjacentAreaNums = getAdjacentAreaNums(user.x, user.y); const syncUsers = []; for (const adjacentAreaNum of adjacentAreaNums) { // 인접한 노드의 유저들 목록 인출하여 동기화 대상에 포함 syncUsers.push(…areas.get(adjacentAreaNum)); }
for (const syncUser of SyncUsers) { syncObjects(syncUser, user); // 실제로 동기화! } ```
LOD(레벨 오브 디테일, Level Of Detail)
- 컴퓨터 그래픽스 관련 기술로, 3D 모델 표현이나 복잡도를 거리에 따라 차등 적용하는 방식(멀리 있을 수록 훨씬 단순하게 보이도록 구현하는 방식)
- mipmap(밉맵) : 원본 텍스처의 해상도를 줄인 버전, 멀리서 보았을 때 모델링의 각각의 프래그먼트마다 처리를 하는 것 대신 별도 준비한 텍스처로 처리하는 방식을 밉매핑이라고 한다.