2011-08-24 2 views
16

플레이어가 함께 게임을 할 수있는 WebGL 기반의 실시간 전략 게임을 만들 계획입니다. Node.js를 사용하여 게임 서버를 만들고, 실시간 연결을위한 웹 소켓을 사용합니다.전략 게임 서버 개념

저는 클라이언트를 동기화하는 데 가장 좋은 개념이 무엇인지에 대해 마음이 아팠습니다.

사용자 (이동 유닛, 건물 등)의 주문 만 서버로 보내면 다른 모든 클라이언트로 전송됩니다. 하지만 여기에는 지연 문제가 있습니다. 나는 게임이 비동기적일 것이라고 생각한다.

또 다른 가능성은 서버에서 게임을 계산하는 것입니다. 클라이언트는 여전히 서버로 명령을 보내지 만, 서버는 높은 단위로 모든 유닛 & 건물의 모든 변경된 상태를 클라이언트에 보냅니다. 문제는 여기에 많은 양의 데이터와 얼마나 빠른 데이터가 될 수 있는지 ...

다른 아이디어 나 개선 제안이 있습니까?

감사합니다.

답변

20

기본적으로 속도보안 사이에서 결정해야합니다.

클라이언트가 작업을 수행하고 계산을 빠르게하는 것은 좋지만 클라이언트가 데이터를 조작 할 수 있기 때문에 데이터가 위험합니다.

서버를 가지고 있으면 모든 작업이 느려지지만 데이터는 더욱 안전합니다.

이중 접근 방식을 선택하고 클라이언트가 일부 데이터 만 계산하고 동기화 한 다음 유효성을 검사하여 나머지를 서버에서 실행하도록 할 수 있습니다.

은 또한에 따라 얼마나 빨리 게임 실행, 계산하는 데이터의 양, 서버와 밴드/연결의 속도, 등 ... 당신은 두 가지 방법을 모두 프로토 타입 및 에뮬레이션 할 몇 가지 테스트를 시도해야

클라이언트와 서버가로드됩니다.

게임이 작다면 더 많은 서버 측 작업을 선택하게됩니다. 반면에 복잡한 게임의 경우 클라이언트에게 더 많은 작업을 공유하는 것이 가장 좋습니다. 어쨌든 나는 항상 절충이 필요하다고 생각합니다.여기

당신이 찾을 수있는 몇 가지 링크입니다 유용

Multiplayer Game Programming Introduction

Real time strategy networking

Multiplayer Programming thread (old but still with many useful links)

Lag Compensation

Prevent Multiplayer Cheating

첫 링크는 저에게 많은 도움을 주었고 imho는 여전히이 주제에 대한 최고의 리소스 중 하나입니다.

책은

Multiplayer Game Programming

1

불행히도 나는 WebGL 기반 온라인 게임에서 경험이 없지만 일반적으로 게임 논리를 클라이언트 측에서 실행하고 결과를 동기화하는 좋은 방법입니다.

이 접근법에서는 어떤 클라이언트가 어떤 게임 개체를 "소유"했는지 추적하는 것이 중요합니다. 클라이언트는 자신의 개체에서 업데이트 (생성, 업데이트, 삭제) 만 보내고 다른 클라이언트로부터 다른 게임 개체의 업데이트를받습니다.

또한 "Player has entered/left"등과 같은 추가 메시지를 전달하기 위해 메시징 프레임 워크를 설정할 수 있습니다.

이 개념은 내가 만든 게임에 유용함이 입증되었으며,이 개념이 귀하에게 유용 할 것으로 기대합니다.

0

하지 WebGL이 확실하지만, 내가 알기로 다음과 같은 접근 방식 좋을 것이다.

  1. 는 서버에서 실행되는 객체 (특정 클라이언트와 관련된) 모든 렌더러를 요청, 서버 (플레이어에서 공통입니다) 모든 개체를 초기화하고 클라이언트 시작에 그들에게
  2. 를 실행합니다.
  3. 클라이언트는 수신 된 모든 렌더러에 대해 UI에서 개체를 렌더링합니다.
  4. 클라이언트가 UI를 업데이트하면 변경 내용이 서버에 알리고 서버가 그에 따라 개체를 업데이트합니다.
  5. 플레이어간에 공통적 인 개체가 한 플레이어에 의해 수정되면 각 플레이어 (클라이언트)에게 UI 변경.

이 방법은 UI/클라이언트 특정 개체가 아닌 일반 개체에만 적용됩니다.

1

당신은 서버의 게임 상태와 논리를 가지고 있어야 , 그렇지 않으면 당신의 게임은 사기성에 열렬하다. 서버는 게임 상태의 궁극적 인 권위입니다.

0

보안상의 이유로 모든 논리는 서버 측에 있어야하며 모든 데이터 업데이트는 서버에 있어야합니다.

그러나 클라이언트는 먼저 클라이언트 예측이라고하는 논리를 예측하고 애니메이션을 재생할 수 있습니다.

부정 행위가없는 경우 서버 측에서 클라이언트 논리를 확인하고 모두 수행합니다. 부정 행위가있는 경우 서버는 클라이언트에게 다시 올바른 상태로 돌아가도록 알릴 수 있습니다.

서버용 node.js를 사용하는 경우 오픈 소스 프레임 워크 pomelo이 있습니다. 그리고 완전한 소스 코드 데모와 온라인 데모도 있습니다 : lordofpomelo