2011-02-11 7 views
13

저는 게임 엔진 (플레이어 이동 등을 계산하는)이 서버에서 실행되는 작은 축구 게임을 디자인하고 있으며 렌더링 및 키보드/마우스 처리는 클라이언트에 의해 수행됩니다. 서버 (하스켈)를 들어 나는 게임 엔진 하스켈에서 게임 엔진과 네트워크 서버를 가장 잘 동기화하는 방법은 무엇입니까?

20ms마다 정도에 대한

  • Yampa/Reactimate 클라이언트 - 서버 통신에

    • Happstack를 사용하려면, 클라이언트는 키보드와 마우스를 보내야합니다 HTTP GET을 통해 서버에 이벤트를 보내고 현재 게임 상태 (JSON으로 인코딩 된 볼 및 플레이어 위치)를 받아 렌더링합니다. SDL 인프라를 게임 루프, 입력 처리 및 렌더링에 사용하려고 생각하고 있습니다.

      서버는 기본적으로 두 개의 스레드를 실행합니다. 대기열 서버는 HTTP GET을 수신하고 대기열에 키보드/마우스 명령을 넣고 두 번째 대기열에서 현재 게임 상태를 읽고 HTTP GET 요청에 응답합니다.

      두 번째 스레드는 Yampa Arcade paper에서 설명한대로 Yampa 게임 엔진을 실행합니다. 게임 엔진은 가능한 한 빨리 새 라운드를 계산하고 (틱 없음) 결과를 렌더링 대기열에 넣습니다.

      Architecture

      일반 질문 :이 실현 가능한 아키텍처처럼 보입니까?

      특정 질문 : 서버 측 렌더링 대기열을 어떻게 디자인 할 것입니까? Chan을 사용하려면 어떻게해야합니까? 게임 엔진이 클라이언트 측의 "똑딱 거리는 것"보다 평균적으로 빠르면 대기열이 길어지고 길어집니다. 이것이 Chan과 어떻게 다룰 수 있습니까?

      귀하의 의견은 대단히 환영합니다!

  • 답변

    6

    게임 자체에 대해 좀 더 설명해 주시겠습니까? 축구 경기를 생각할 때 순간적으로 입력을 처리해야하는 실시간 피드백이 필요한 게임을 생각하면 플레이어 입력 정보가 ​​네트워크를 통해 즉시 전송 될 것으로 예상됩니다. 20ms가 상당히 지연되고 플레이어가 자신의 캐릭터를 이동하려고하는 키를 누르고있을 때 눈에 띄게 될 것이라고 생각합니다. 특정 유형의 가비지 수집기에서 경험할 수있는 저속함과 같은 느낌 일 것입니다.

    그런 게임 (그 게임에 대한 게임)에 HTTP를 사용하려는 이유를 이해할 수 없지만 거의 모든 게임에서 UDP를 사용하므로 게임 유형에 따라이 경로를 사용하게 될 것입니다. This tutorial은 그런 종류의 물건에 대해 배우기에 좋습니다.

    또한 네트워크 데이터 형식을 선택하는 데 궁금한 점이 있습니다. 왜 수신/전송시 단순한 구문 분석/형식 지정이 필요한 형식을 원하겠습니까? 나는 많은 양의 데이터를 보내고 이것이 종종 상당한 시간을 추가 할 것이라고 생각한다. 문자열을 사용하려고한다면 최소한의 구문 분석이 필요한 가장 간단한 형식을 사용하려고합니다. 관련 시스템에서 나는 소켓을 사용하여 통신하는 다중 프로세스 실시간 시스템이었고, 원래는 XML 문자열을 네트워크 데이터 형식으로 사용 했었습니다. 그리고 그것은 똑같은 머신에서 모든 프로세스가 매우 비효율적이었습니다. 우리는 게임 로직을 & 엔티티를 구현하는 수단으로 게임의 맥락에서 FRP 생각하면 나는 대부분의 네트워크 게임을 믿을 수 있도록 Yampa & 서버 측 렌더링에 관한

    는 서버 & 클라이언트 엔티티가 있습니다.일반적으로 렌더링 할 수있는 객체는 클라이언트 엔티티이고 렌더링 할 수없는 객체는 서버 엔티티입니다. 일부 엔티티는 둘 다에 대한 표현을 가지고 있습니다. 따라서이 경우에는 Yampa를 서버 &에서 실행하고 서버 측에서 렌더링과 관련된 것을 피하려고합니다. 렌더링 가능한 객체는 주로 내가 믿는 클라이언트 측에 충실해야한다. 서버에서 렌더링 명령을 내 보내야하는 특별한 이유가 있습니까?

    +0

    고마워요. 내가 찾고 있던 입력과 비슷합니다. 서버 사이드 렌더링에 관해서 : 저는 게임 엔진이 플레이어와 공의 위치 (단지 X, Y, Z 좌표)를 계산하고 이것을 렌더링 큐와 HTTP를 통해 클라이언트로 보내고 싶었습니다. 나는 여전히 당신의 링크를 통해 모든 방법을 사용해야 만하지만, 이미 이것이 막 다른 골목이 이미 여행 한 것처럼 내게 나타납니다 ... – martingw

    2

    당신은, 나 또한 비슷한 서버 - 클라이언트를 관심을 작성하고 한때 하스켈에서 열린 축구 경기. 소스 코드는 github (server, client)에서 찾을 수 있습니다. 당시 내가 하스켈 초보자 였을 때, 스레딩 (및 blogged about them)과 관련하여 몇 가지 문제가 있었지만 실제로 프로젝트를 끝내지는 못했지만 적어도 코드에서 어떻게하지 않는지 볼 수 있습니다. (결국 나는 서버 - 클라이언트 아키텍처를 버리고 freekick2이라고 썼습니다.) 아키텍처 자체가 실현 가능하다고 생각합니다.

    그러나 snk_kid와 마찬가지로 내가 HTTP를 사용하려는 이유를 모르겠습니다. (눈에 띄는) 대기 시간없이 네트워크를 통해 실행되도록하려면 클라이언트 측 예측 (UDP를 사용해야 할 수도 있음) (here's 유익한 자료).

    +0

    고마워, 앤티! 코드를 살펴 보겠습니다. CS 부분도 건너 뛰게 될 것 같아요,이 UDP 바이올린은 복잡해 보입니다 ... – martingw