서버에 복셀 편집 기능과 복셀 오브젝트 관리 기능을 넣었다.
[클라이언트 A] -> (복셀편집 요청) -> [서버] -> 서버에서 처리 -> 복셀 변경사항 broadcast -> [클라이언트 A,클라이언트 B…]
이런식이다.
로그인 후 맵 전체의 복셀데이터를 한번에 받아올 수는 없다. 너무 양이 많다. 지금 테스트 데이터로는 얼마 안되지만.
그래서 네트워크 브로드캐스팅 단위인 Sector-Grid를 이용한다.
- 맵 전체는 2차원 그리드로 쪼개져있다. 그리드 한칸은 대략 30m – 100m정도.
- 플레이어간에 서로 상호작용할 수 있는 영역은 3×3, 그러니까 그리드의 9칸이다.
- 복셀 데이터도 이 3×3섹터 단위로 전송한다.
- 서버에서 플레이어 별로 섹터 개수만큼의 bit-table을 유지한다.
- 최초 로그인 하면 모든 플레이어의 bit-table을 0으로 초기화한다.
- 해당 섹터에 방문한 적이 있으면 bit-table에서 해당 섹터의 비트를 1로 변경한다.
- 플레이어가 이동해서 새로운 섹터에 진입할때 새로 진입한 3-4개의 섹터로부터 복셀데이터를 긁어서 플레이어에게 보내주게 되는데 이때 bit-table을 참조하여 이미 방문한 섹터인지 아닌지를 체크한다.방문했던 섹터라면 당연히 보내지 않는다.클라이언트에선 이미 그 복셀 데이터를 가지고 있으니까.
- 복셀 편집에 대한 패킷은 극히 작은 사이즈이므로 일단 맵 전체에 대해 브로드캐스팅한다.
- 클라이언트에서도 자신의 bit-table을 유지하고 있다. 따라서 자신이 방문하지 않았던 섹터에서 발생한 복셀 이벤트는 무시한다.
- 지금은 편의상 복셀 편집 패킷을 전체 브로드캐스팅하지만 서버에서의 bit-table비교로 해당 섹터(복셀 편집이 이루어진 섹터)를 방문한 적이 없는 플레이어에게는 아예 보내지 않을 수 있다.
해서 일단 정상 작동. 아직 갈 길이 멀긴 하지만 이제 기본적인 멀티 플레이 크래프팅은 된다.