2012-06-01 3 views
4

실시간 멀티 플레이어 레이싱 게임을 진행 중입니다. 이제 Node.js TCP (net) 서버에 게임 로직을 작성하는 데 도움이 필요합니다. 가능한지 모르겠지만, 내가 제대로하고 있는지 모르겠지만 최선을 다하고 있습니다. 나는 내 영어 깨진 이해하기 어렵다 알고, 그래서 나는이 "그림"을 만들어 :)
당신의 시간
ProccessNode.js 게임 논리

답변

4

driushkin의 답변에 대해 자세히 설명하려면 원격 프로 시저 호출 (RPC)과 이벤트 큐를 사용해야합니다. 이는 게시 한 이미지에서와 유사하게 작동합니다. 각 패킷은 '명령'또는 RPC와 같은 인수 (예 : 이동 방향)를 나타냅니다. RPC가 순서대로 실행되는지 확인하려면 이벤트 대기열이 필요합니다. 이를 위해서는 각 명령을 실행하기위한 시간 소인 또는 framecount가 필요합니다 (간단한 계획에서 미래의 어느 시점에서). 그리고 동기화 된 시계 (2 차 세계 대전 스타일).

이 구성표에서 한 가지 중요한 약점을 발견 할 수 있습니다. 네트워크 대기 시간, 악의적 인 사용자 등으로 인해 RPC 메시지가 늦을 수 있습니다. 적용될 때까지 도착할 수 있습니다. 간단한 구성에서는 최신 RPC가 삭제됩니다. 모든 클라이언트 (발신자조차도!)가 작동하기 전에 서버가 RPC를 보내기를 기다리기 때문에 좋습니다 (원래 클라이언트가 서버 메시지를 기다리지 않았고 게임 상태가 서버와 동기화되지 않았으며 게임이 망가질 것입니다.)

이러한 방식에 대한 지연의 영향을 고려하십시오. 서버에 대한 클라이언트 A의 지연 시간이 100ms이고 왕복 시간이 100ms라고 가정 해 봅시다. 이것은 클라이언트 입력이 같이가는 것을 의미한다 :

  • 클라이언트 A 키를 누르면, 서버, 에 RPC를 전송하지만 추가되지 않습니다 로컬 (에선 0ms)
  • 서버가 수신 재방송의 RPC (이 100ms)
  • 그가를 누르면 후
  • 클라이언트 A는 자신의 이벤트를 수신하고, 지금 마지막 처리를 위해 자신의 이벤트 큐에 추가 (200 밀리)

당신이 볼 수 있듯이, 클라이언트는 두 번째의 자신의 이벤트 1/5에 반응 키. 이것은 상당히 좋은 100ms 래그와 함께 있습니다. 대서양의 지연은 쉽게 각 방향으로 200ms를 넘을 수 있으며, 전화 접속 연결 (희귀하지만 오늘날에도 여전히 존재 함)은 500ms를 초과하는 지연 스파이크를 가질 수 있습니다. LAN 또는 이와 비슷한 방식으로 게임을하는 경우에는이 문제가 발생하지 않지만 인터넷에서는 이러한 응답이 견딜 수 없습니다.

여기서 클라이언트 측 예측 (CSP)의 개념이 도입됩니다.CSP는 크고 무서운 것으로 만들어졌지만 정확하고 신중하게 구현되어 실제로는 매우 간단합니다. CSP의 흥미로운 특징은 클라이언트가 즉시 (클라이언트 은 어떤 일이 발생할 것인지를으로 예측 함)을 처리 할 수 ​​있다는 것입니다. 물론 클라이언트는 잘못 될 수 있습니다. 즉, 클라이언트는 서버로부터 수정 사항을 적용 할 방법이 필요합니다. 즉, 서버가 클라이언트의 RPC 요청을 확인, 거부 또는 수정하는 방법과 gamestate를 직렬화하는 방법이 필요합니다 (따라서 다시 시작하는 기준점으로 복원 할 수 있음).

이 작업을 수행하는 데 유용한 리소스가 많이 있습니다. 나는 특히 http://www.gabrielgambetta.com/?p=22을 좋아하지만, 좋은 멀티 플레이어 게임 프로그래밍 책을 찾아야합니다.


은 또한도 Flex와 AS3에 대한 귀하의 의견을 읽고, socket.io 제시해야합니다. 사용 편의성 (노드와의 단순한 통합)은 지금까지 사용해온 HTTP를 통한 네트워크 게임을위한 최상의 (최선의) 옵션 중 하나입니다. 나는 그것을 사용할 수 있기 위해 필요한 모든 조정을 할 것입니다. AIR/AS3에는 socket.io 자체를 사용할 수 없더라도 하나 이상의 WebSockets 라이브러리가 있다고 생각합니다.

+0

그래서 WebSocket을 사용한다면 핑 (ping)과 다른 것들에 대해 걱정할 필요가 없다는 것이 당신의 요점입니까? – Gugis

+0

아뇨, 요점은 WebSockets * 및 * CSP를 사용해야 만 지연에 대해 * 많이 걱정할 필요가 없다는 것입니다. – bkconrad

2

이에 대한 좋은 것 socket.io 뭔가 같은 소리 주셔서 감사합니다. 브라우저 및 서버에서 실시간 가능성을 제공하는 라이브러리입니다.

+0

플래시 클라이언트입니다. socket.io를 지원하지 않을 것입니다. – Gugis

+0

socket.io가있는 플래시 클라이언트의 경우 [FalshSocket.IO] (https://github.com/simb/FlashSocket.IO) – Tharabas

+0

을 살펴보아야합니다. Flex 애플리케이션 만 지원합니다. 내 고객은 순수 AS3입니다. – Gugis

1

당신은 eventscommands이를 모델링 할 수 있습니다 : 클라이언트가 서버에 명령 move를 전송하고 서버는이 명령을 확인하고 모든 확인을 경우, 그 이벤트 is moving를 게시합니다.

귀하의 경우에는 P1 (OK, 이동 가능) 및 나머지 (P1은 이동 중)에 대해 서로 다른 응답이 필요하지 않을 수 있으며, 두 경우 모두 충분합니다. is moving 이벤트에는 필요한 모든 정보 (예 : 현재 위치, 속도 등)가 포함되어야합니다.

가장 단순한 형태로 한 발급 명령은 서버로부터의 이벤트가 도착할 때까지 약간의 지연이 발생하고 즉시 이동을 시작한 다음 이벤트가 도착할 때 필요한 경우 몇 가지 보상 조치를 적용 할 수 있습니다. 그러나 이것은 복잡해질 수 있습니다.

+0

나는 정확하게 이해 했는가? 이 "PLAYER | ACTION | POSITION"과 같은 명령을 서버에 보냅니다. 클라이언트가 "P1 | START_MOVING | 100,0"명령을 보내고 모든 클라이언트가이 명령을 받으면 P1이 움직이는 것을 보자. 다시 클라이언트는 "P1 | STOP_MOVING | 200,0"명령을 전송합니다 (이동 키가 해제 된 후). 다른 클라이언트가 P1을 잘못된 위치 (예 : 150,0)로 보는 경우 STOP_MOVING 명령이 위치를 200,0 – Gugis

+0

@ Gugis로 수정했습니다. 커맨드와 이벤트의 차이점을 강조하고 싶지만, 커맨드는 서버에 무엇인가를 지시하는 것이며, 이벤트는 실제로 일어나고 있습니다. 이 구분을하면 많은 혼란을 피할 수 있습니다. – driushkin