2012-03-29 3 views
2

Node.js와 Socket.io로 대규모 멀티 플레이어 게임을 만들고 있습니다. 모든 플레이어는 동일한 무한지도에서 움직입니다 (Minecraft 생각). 플레이어가 움직일 때 볼 수있는 타일을로드합니다. 플레이어가 자신의 움직임을 움직일 때 볼 수있는 모든 플레이어에게 보내야합니다.멀티 플레이어에서 소켓 관리하기 Socket.io Game

내 질문은; 내 소켓을 어떻게 구조화해야합니까? 모든 플레이어에 대해 하나의 소켓을 가지는 것은 규모면에서와 같이 보이지 않습니다. 나는 세계를 청크로 분할 할 수는 있지만 청크 경계를 관리하는 방법을 잘 모릅니다. 대부분의 플레이어는 대부분의 시간을 볼 수 없기 때문에 각 플레이어의 소켓 만 관련 정보를 얻을 수 있기를 바랍니다.

나는 Socket.io가 동일한 메시지를받는 소켓 인 "rooms"개념을 가지고 있다고 읽었습니다. 근처에 움직이는 다른 플레이어의 소켓을 추가 할 수있는 연결된 플레이어마다 별도의 공간을 마련하는 것이 타당할까요? 그러면 플레이어가 움직일 때마다 그 방으로 메시지를 보낼 수 있습니다. 시청자가 퇴실하거나 방에 들어올 때 어떻게 관리 할 수 ​​있습니까?

분명히 이것은 모호한 질문이지만, 모범 사례 조언을 찾고 있습니다. 주제에 대한 기사 링크는 높이 평가됩니다.

+1

[Quadtrees] (http://en.wikipedia.org/wiki/Quadtree)를 사용하여 플레이어 위치를 찾은 적이 있습니까? 이것에 접근하는 방법을 찾기 시작할 수있는 좋은 곳은 [BrowserQuest source] (https://github.com/mozilla/BrowserQuest)입니다. – hughsk

답변

3

이것은 MMO 서버를 설계 할 때 중요한 문제 중 하나입니다. 일반적으로 클라이언트 당 소켓이 필요하며 로직을 구현하면 클라이언트를 특정 지역에 등록합니다.

지역은 데이터 구독을 제어하기 위해 '채널'을 설정하는 좋은 방법입니다. 각 지역에 대해 별개의 이름을 사용할 수 있으며 플레이어를 지역에 가입 시키려면 Socket.io 룸을 사용할 수 있습니다.

이 모든 일이 끝나면 모든 일이 훨씬 쉽게 처리됩니다. 따라서 특정 지역에서 플레이어가 움직이면 모든 서버는 이벤트의 Xm 이내에 모든 지역의 모든 가입자에게 '플레이어 이동'이벤트를 보냅니다.

+0

"클라이언트 당 소켓"이란 무엇을 의미합니까? 클라이언트 당 하나의 websocket 서버 (따라서 각 클라이언트마다 다른 IP 또는 포트)입니까, 아니면 동일한 서버 ip/port 내에 클라이언트 당 하나의 연결입니까? 나는 라쳇과 함께 같은 문제가있다. –

관련 문제