2012-06-12 5 views
0

사용자가 개인 채팅방을 만들고 비공개 게임을 시작할 수있는 멀티 플레이어 게임 로비가 있습니다. 각 사용자는 게임에서 초당 x 포인트를 천천히 재생하는 건강 바를 가지고 있습니다.Node.js 비동기 setInterval 게임 루프?

는 내가 그런 일 각 게임의 시작 부분에서 서버 측 게임 루프를 시작해야한다고 가정

setInterval(update('gameID'),1000); 

경우 갱신 ('게임 ID')의 모든 선수를위한 건강 변수를 증가 1000 ms = 1 초의 특정한 게임.

질문 : 비동기식이라고 가정하는 것이 맞습니까? 나는 50 개의 게임과 50 개의 게임을 진행할 수 있습니다. 주요 프로세스가 제대로 차단되지 않을까요?

답변

0

비동기입니다. 그러나 이렇게하면 서버를 죽일 수 있습니다.

나는이 간격을 수동으로 만드는 것, 즉 게임의 시작을 메모리에두고 데이터에 대한 클라이언트 핑을 작성하는 것에 대해 조언한다. 클라이언트 ping 서버가 현재 날짜를 확인하고 저장된 날짜와 비교하면 (요청이 끝나면 저장된 날짜를 업데이트합니다). 그것은 현재 건강을 평가할 수 있습니다.

이 솔루션의 확장 성이 좋습니다.

+0

서버 쪽 "updateHealth()"함수를 호출하는 setInterval 클라이언트 측을 갖는 것이 효과적입니까? 또는 헬스 포인트를 수정하는 모든 가능한 동작 (공격, 치료 등)을 계산하고 사용해야 할 때마다 updateHealth()를 호출해야합니다. 그런 다음 동일한 활성 게임에서 모든 플레이어의 모든 건강 값 (최대 4)에 대한 클라이언트 측 예측을합니다. – Legendre

+0

나는 당신이 클라이언트 측 setInterval을 해고해야한다고 생각한다. 클라이언트가 상태를 계산할 수있게하고, 진정한 상태 (및 다른 값)를 평가하고 데이터를 업데이트하는 클라이언트로 다시 전송하는 서버 측의 '동기화'기능이라고 부르는 5 초 (또는 그 이하) 초마다 만들 수 있습니다. 그것이 내가하는 방법이지만, 다른 방법이 더 좋은 방법 일 수 있습니다. – freakish

+0

다른 플레이어를 치유하고 공격하는 것과 같은 작업에서 동기화 기능을 호출해야합니까? 서버는 상태를 업데이트 한 다음 변경 사항을 적용해야합니다. 나는 그 동안 서버로드를 줄이기 위해 재생 간격을 5 초로 변경해야한다고 생각합니다. : p – Legendre

0

setInterval은 확실히 비동기입니다. 콜백을받는 대부분의 함수는 비동기입니다. 의심이가는 경우 문서 또는 소스 코드를 확인할 수 있습니다.

+0

저는 Node.js와 서버 측 스크립팅에 대해 처음 보았습니다. 내가이 끔찍한 일을 엉망으로 망쳐 놓지 않았다는 것을 알았 기 때문에 기쁘다. 신속한 대응에 감사드립니다. :) – Legendre

1

비동기이지만 설명하는 경우 50 타이머가 필요하지 않습니다.

  1. 단일 타이머를 사용하여 활성 게임에서 플레이어를 재생성 할 수 있습니다. 또한 건강 데이터를 푸시하는 경우 이는 매우 비효율적입니다.
  2. player.attackedTime = (new Date).getTime()과 같은 작업을 수행하고 player.health += x_points * ((new Date).getTime() - player.attackedTime)/1000과 같은 각 공격의 재생성을 계산할 수 있지만 클라이언트에서 예언 적 재생성을 수행해야합니다.
+0

Doh. 예, 하나의 setInterval (update(), 1000)을 실행하고 update()가 모든 활성 게임의 모든 플레이어의 상태를 다시 생성하도록 할 수 있습니다. 플레이어 헬스 포인트와 관련이있는 모든 동작에 대해 호출되는 "updateHealth()"함수가 필요하다고 생각합니까? 공격하는 것뿐만 아니라 트랩 등으로 치유되거나 손상되기도합니다. "updateHealth()"가 호출 될 때 신뢰할 수있는 서버 측 값과 동기화되는 "더미"예측 건강 상태 값만 표시합니다. – Legendre

+0

상태를 업데이트하는 방법은 서버에서 게임의 상태를 저장/추상화 한 방법에 따라 다릅니다. 예측할 수없는 건강상의 변화 (공격, 치유 등)를 고객에게 알리고 싶지만 재연은 빈번한 동기화를 방지하기 위해 예측할 수 있으며, 게임에 이러한 종류의 타이밍 정밀도가 필요한 경우 대기 시간도 고려할 수 있습니다. –

+0

바로 app.js의 "var games = []"배열입니다. 게임이 생성되면 엔트리가 만들어집니다 : 예. 게임 [ 'newGameName'] = { "One": {health : 50}}. 따라서 플레이어 1 명이 20 점으로 치유되면 게임 'newGameName'을 할거야 One.health + = 20 등 – Legendre