2013-05-12 2 views
1

멀티 플레이 게임을 만들기 시작했지만 만기가 없어서 여러 가지 방법을 시도했지만 나에게 맞는 느낌이 들지 않습니다. 그래서, 내가 가장 잘 사용해야하는 플랫폼/도구/언어/기술에 대한 조언이 필요합니다. 나는 Photon, AppWrap, Skiller, Gamooga 및 다른 것들을 믿지 않는다고 말해야한다. 나는 그들이 큰 규모가 될 것이라고 믿지 않으며 너무 비싸지도 않을 것이다. 또는 나는 너무 커다 (나는 크기를 의미하지 않는다. 내가 필요로하지 않는 것이 얼마나 많은지를 의미한다). 나의 필요를 위해.빌딩 턴 기반 멀티 플레이 게임 서버

먼저 게임 세션 진행 과정을 간략하게 설명합니다.

  • 각 플레이어는 질문을 받고 10 초 이내에 대답해야 게임 세션을 시작

    1. 세 선수.
    2. 플레이어가 대답하면 다른 플레이어 (있는 경우)가 이미받은 답변을 볼 수 있어야하며 주어진 즉시 답변을 볼 수 있어야합니다. 기본적으로 모든 답변은 실시간으로 다른 고객이 받아야하지만 (부정 행위를 피하기 위해) 우리가 답변 한 후에 만 ​​받아야합니다. 시간이 초과되면 응답하지 않은 사람은 점수를받지 못하고 다음 질문이 실행됩니다.
    3. 승자를 결정하고 다음 질문으로갑니다. N 라운드 후에 게임 세션을 마칩니다.

    둘째, 고려한 몇 가지 요구 사항에 대해 설명하겠습니다.

    • 게임은 iOS/Android/Web에서 실행해야합니다. 이렇게하면 HTTP를 기반으로 만들 수 밖에 없습니다.
    • Google Cloud Endpoints에 대한 정보를 얻었습니다. iOS/Android/JS SDK, Google Cloud Platform, Google BigQuery 등 다양한 기능을 제공합니다. 그러나 내가 실시간 응답 전달이 필요하기 때문에 적합하지 않은지 (채널 API는 있지만 iOS 용 클라이언트 SDK는없고, 사람들은 그다지 좋지 않다고 말함).
    • 그런 다음 Node.js와 긴 폴링 (클라이언트 측 AFNetworking)을 찾았지만 관리하기가 어렵습니다. 클라이언트에게 게임 상태 업데이트를 제공해야합니다 (델타를 보내야합니다). 그렇게하면 각 플레이어마다 모든 변경 사항을 개별적으로 추적해야합니다. 그리고 플레이어가 연결되면 이미 변경 사항이 있는지 확인해야합니다. 그러면 즉시 전송됩니다. 그렇지 않은 경우 '변경'이벤트를 수신 한 다음 전송하십시오. 최종 코드에서는 이해하기가 너무 어색하고 어려워 보이며 올바른 방법을 모릅니다. socket.io는 서버 측에서 더 나은 것을 만들어야하지만 클라이언트 용 iOS SDK는 없습니다.

    여기에서 어디로 가야할지 모르겠다. 어떤 도움을 주시면 감사하겠습니다.

  • 답변

    4

    턴 기반 아키텍처는 실제로 지연이 실제로 큰 문제가 아니며 데이터가 지속적으로 전송되지 않으므로 실제로 복잡하지 않습니다.

    나는 중매를위한 웹 서비스와 실제 게임을 처리하는 두 개의 웹 서비스를 만들 것입니다.

    매치 메이킹은 단순히 플레이어를 대기열에 올려 놓기에 충분할만큼 경기가있을 때 서비스는 한 그룹의 플레이어를 선택하고 sessionID를 할당하고 플레이어를 게임 서비스에 전달합니다.

    게임 서비스의 경우 클라이언트와 서비스에서 처리 할 수있는 것을 구별하는 것이 중요합니다.

    게임 서비스는 클라이언트를 포함하여 각 sessionID에 대한 모든 게임 정보를 저장합니다. 이렇게하면 단일 서비스로 수백 개의 게임을 동시에 쉽게 관리 할 수 ​​있습니다. 플레이어가 질문에 대답하면 세션 ID로 서버에 요청할 것입니다. 서버는 세션에서 클라이언트를 반복하여 정보를 그들에게 보냅니다.

    클라이언트는 사용자가 응답 할 때까지 숨기기 질문을 처리 할 수 ​​있습니다. (해킹이 염려되는 경우 다른 질문 정보를 암호화 할 수도 있습니다.)

    서버는 또한 타이머가 만료되면 모든 클라이언트에 응답을 보내고 이후의 응답은 무시할 때 세션의 타이머도 추적합니다. 정수를 세션에 저장하고 sessionID와의 통신으로 래핑하여 답변을 과거 질문과 구별 할 수 있습니다. 클라이언트에서 예측을위한 타이머를 가질 수는 있지만, 부정 행위를 피하기 위해 서버는 타이머에 대한 권한이되어야합니다.

    +0

    > 클라이언트에서 예측을위한 타이머를 사용할 수는 있지만, 부정 행위를 피하기 위해 서버가 타이머에 대한 권한이어야합니다. 하지만 한 클라이언트의 대기 시간이 70ms이고 다른 클라이언트의 대기 시간은 500ms입니다. 그것은 첫째로 불이익을 당할 것임을 의미합니다. 부정 행위를 허용 할 수있는 방법이 있습니까? – bobby

    +0

    예측을 사용하지 않으면 게임 UI가 세션이 끝났음을 나타 내기 위해 약간 시간이 걸릴 수 있지만 타이머가 끝나면 서버에서 응답을 무시합니다. 인터넷이 너무 느려 타이머가 다 떨어지기 전에 응답을 얻지 못할 수도 있지만 어딘가에 지연을 설명해야합니다. 타이머가 클라이언트에 있으면 해킹하기가 너무 쉽습니다. –

    +0

    아, 미안, 나는 그 말을 깜빡했다. 질문에 대한 대답은 숫자입니다. 3 명의 선수가 있고 그들의 대답에 따라 각각 1, 2, 3 등을 받게됩니다. 아무도 옳지 않다면, 첫 번째 장소는 그 대답이 가장 가까운 플레이어를 받게됩니다. 가까운 대답이 거의 없다면 첫 번째 장소는 가장 먼저 대답 한 플레이어를 받게됩니다. 따라서, 이런 종류의 상황에서는 레이턴시가 작은 플레이어가 유리할 것입니다. – bobby

    1

    사기꾼을 보호하기 위해 자신의 인증 토큰을 사용하는 secure ssl https 프로토콜을 사용하십시오.

    클라이언트는 실제 시간이 아닌 각 플레이어의 시간 범위를 추적해야합니다. 라운드가 각 클라이언트에서 끝나면 개별 시간 범위가 서버로 전송됩니다.

    이렇게 생각하십시오. 라운드를 시작할 때 서버를 폴링하는 3 명의 클라이언트가 있습니다. 세 가지 네트워크 속도가 다를 수 있기 때문에 실제로 누가 먼저 시작할지 모릅니다. 따라서 각 클라이언트가 최종적으로 초록색 불빛을 수신하면 해당 장치에서 타이머가 시작되고 그 시간에 해당 장치에서 클라이언트 장치에서 수신됩니다. 누가 3 라운드에서 서버로 돌아갈 때까지 기다렸는지 결정합니다.

    그냥 게임의 논리에서 우려되는 주제가 있습니다. 여기 몇 가지 예가 있어요. 사용자 신원 및 인증. (게임 센터) 게임 데이터 지속성 및 저장. (AWS DynamoDB와 같은 클라우드 데이터베이스) 게임 검색 대기열. (AWS SQS) 비관적 동시성을 사용하는 데이터베이스에서는이 작업을 시도하지 마십시오. 일치 알림 플레이어는 잠자는 클라이언트를위한 준비가되었습니다. (AWS SNS에서 APNS로 엔드 포인트 (이 모바일 장치)) 다음 이동을위한 폴링 또는 알림. (AWS SQS 또는 SNS) 나는 데이터베이스를 폴링하지 않을 것이다. 이러한 서비스는 단지 좋은 예입니다. 나는 아마존에서 일하지 않는다. 그들은 일어나서 달리기가 가장 쉽지만 더 좋은 서비스가있을 것이다.

    기본적으로 내가 얻는 것은 기본 호스팅 사이트에서 전통적인 MySQL 데이터베이스 이상을 원할 것입니다. 이러한 클라우드 서비스 중 일부는 전용 서버에서 모든 인프라를 직접 만드는 것과 비교하여 매우 저렴하게되었습니다. 또한 기하 급수적으로 확장 가능합니다. 위에서 설명한 모든 작업을 수행하여 클라우드 서비스를 사용하여 한 달에 15 달러 미만으로 시작할 수 있습니다. 가장 좋은 방법은 관리자 포털에서 스위치를 톡톡 치는 것으로 임계 값을 높이는 것입니다. 그건 좋은 문제가 될 것입니다.

    관련 문제