Interações entre o cliente/servidor do jogo e o Amazon GameLift - Amazon GameLift

Interações entre o cliente/servidor do jogo e o Amazon GameLift

Os componentes da solução de hospedagem Amazon GameLift interagem entre si de maneiras específicas para executar sessões de jogo em resposta à demanda dos jogadores. Este tópico descreve como os componentes se comunicam entre si quando o servidor de jogos está hospedado em frotas do EC2 gerenciadas pelo Amazon GameLift, frotas autogerenciadas do Amazon GameLift Anywhere ou em uma solução híbrida.

Os componentes da solução de hospedagem incluem um servidor de jogos, o serviço do Amazon GameLift, um serviço de backend do lado do cliente e um cliente de jogos. O servidor de jogos usa o SDK do servidor Amazon GameLift para interagir com o serviço do Amazon GameLift. O serviço de backend usa a API do serviço do Amazon GameLift (parte do SDK da AWS) para interagir com o serviço em nome do cliente do jogo. Ao entrar em uma sessão de jogo, o cliente do jogo se conecta diretamente a uma sessão de jogo usando o endereço IP e o número da porta exclusivos da sessão de jogo.

Diagrama de interações

O diagrama a seguir ilustra como os componentes de hospedagem de jogos interagem para que o serviço do Amazon GameLift possa acompanhar o status da disponibilidade do servidor de jogos e iniciar sessões de jogo em resposta às demandas dos jogadores.

Comportamento do cliente/servidor do jogo para as principais interações, conforme descrito neste tópico.

Comportamentos de interação

As seções a seguir descrevem a sequência de eventos em cada uma das principais interações.

Inicializar um processo do servidor de jogos

Na inicialização, um processo de servidor de jogos estabelece comunicação com o serviço do Amazon GameLift e relata seu status como pronto para hospedar uma sessão de jogo.

  1. Um novo processo do executável do servidor do jogo começa a ser executado em um recurso de hospedagem.

  2. O processo do servidor de jogos chama as seguintes operações do SDK do servidor em sequência:

    1. InitSDK() para inicializar o SDK do servidor, autenticar o processo do servidor e estabelecer comunicação com o serviço do Amazon GameLift.

    2. ProcessReady() para comunicar a prontidão para hospedar uma sessão de jogo. Essa chamada também relata as informações de conexão do processo, que os clientes do jogo usam para se conectar à sessão do jogo e outras informações.

    O processo do servidor espera por prompts do serviço do Amazon GameLift.

  3. O Amazon GameLift atualiza o status do processo do servidor para ACTIVE e disponível para hospedar uma nova sessão de jogo.

  4. O Amazon GameLift começa a chamar periodicamente o retorno de chamada onHealthCheck para solicitar o status de integridade dos processos do servidor. Essas chamadas continuam enquanto o processo do servidor permanece ativo. O processo do servidor deve responder como íntegro ou não dentro de um minuto. Se o processo do servidor responder como não íntegro ou não responder, em algum momento o serviço do Amazon GameLift mudará o status ativo do processo do servidor e deixará de enviar solicitações para iniciar a sessão do jogo.

Criar uma sessão de jogo

O serviço do Amazon GameLift inicia uma nova sessão de jogo em resposta a uma solicitação de um jogador para jogar o jogo.

  1. Um jogador utilizando o cliente do jogo solicita ingressar em uma sessão de jogo. Dependendo de como o jogo lida com o processo de ingresso de jogadores, o cliente do jogo envia uma solicitação ao serviço de backend.

  2. Se o processo de ingresso do jogador exigir o início de uma nova sessão de jogo, o serviço de backend envia uma solicitação para uma nova sessão de jogo para o serviço do Amazon GameLift. Essa solicitação chama a operação StartGameSessionPlacement() da API de serviço. (Como alternativa, o serviço de backend pode chamar StartMatchmaking() ou CreateGameSession().)

  3. O serviço do Amazon GameLift responde criando um tíquete GameSessionPlacement com status PENDING. Ele retorna as informações do tíquete ao serviço de backend, para que ele possa acompanhar o status do tíquete de posicionamento e determinar quando a sessão do jogo está pronta para os jogadores. Para ter mais informações, consulte Configurar notificações de eventos para o posicionamento de sessões de jogo.

  4. O serviço do Amazon GameLift inicia o processo de posicionamento da sessão de jogo. Ele identifica quais frotas examinar e pesquisa essas frotas em busca de um processo de servidor ativo que não esteja hospedando uma sessão de jogo. Ao localizar um processo de servidor disponível, o serviço do Amazon GameLift faz o seguinte:

    1. Cria um objeto GameSession com as configurações da sessão de jogo e os dados do jogador da solicitação de posicionamento e define o status como ACTIVATING.

    2. Solicita que o processo do servidor inicie uma sessão de jogo. O serviço invoca o retorno de chamada onStartGameSession do processo de servidor e transmite o objeto GameSession.

    3. Altera o número de sessões de jogo do processo do servidor para 1.

  5. O processo do servidor executa sua função de retorno de chamada onStartGameSession. Quando o processo do servidor estiver pronto para aceitar conexões de jogadores, ele chama a operação ActivateGameSession() do SDK do servidor e aguarda por conexões de jogadores.

  6. O serviço do Amazon GameLift atualiza o objeto GameSession com informações de conexão para o processo do servidor (conforme relatado na chamada para ProcessReady()) e define o status da sessão do jogo como ACTIVE. Ele também atualiza o status do tíquete GameSessionPlacement para FULFILLED.

  7. O serviço de backend chama DescribeGameSessionPlacement() para verificar o status do tíquete e obter informações sobre a sessão do jogo. Quando a sessão do jogo está ativa, o serviço de backend notifica o cliente do jogo e transmite as informações de conexão da sessão do jogo.

  8. O cliente do jogo usa as informações de conexão para se conectar diretamente ao processo do servidor de jogo e ingressar na sessão de jogo.

Adição de um jogador a um jogo

Opcionalmente, um jogo pode usar sessões de jogadores para acompanhar as conexões dos jogadores às sessões de jogo. As sessões de jogadores podem ser criadas individualmente ou como parte de uma solicitação de posicionamento de sessão de jogo.

  1. O serviço de backend chama a operação CreatePlayerSession() da API do serviço com um ID de sessão do jogo.

  2. O serviço do Amazon GameLift verifica o status da sessão do jogo (deve ser ACTIVE) e procura um slot de jogador aberto na sessão de jogo. Se o slot estiver disponível, o serviço fará o seguinte:

    1. Cria um objeto PlayerSession e define o status como RESERVED.

    2. Responde à solicitação de serviço de backend com as informações da sessão do jogador.

  3. O serviço de backend transmite as informações da sessão do jogador para o cliente do jogo junto com as informações de conexão da sessão do jogo.

  4. O cliente do jogo usa as informações de conexão e o ID da sessão de jogador para se conectar diretamente ao processo do servidor de jogo e solicitar o ingresso na sessão de jogo.

  5. Em resposta a uma tentativa de ingresso do cliente de jogo, o processo do servidor de jogos chama a operação AcceptPlayerSession() da API do serviço para validar o ID da sessão do jogador. O processo do servidor aceita ou rejeita a conexão.

  6. O serviço do Amazon GameLift executará um dos seguintes procedimentos:

    1. Se a conexão for aceita, o Amazon GameLift define o status PlayerSession como ACTIVE e o transmite PlayerSession para o processo do servidor de jogos.

    2. Se o processo do servidor do jogo não chamar AcceptPlayerSession() para o ID da sessão do jogador dentro de um determinado período após a solicitação CreatePlayerSession() original, o serviço do Amazon GameLift alterará o status PlayerSession para TIMEDOUT e reabrirá o slot do jogador na sessão do jogo.

Remoção de um jogador

Para jogos que usam sessões de jogadores, o processo do servidor de jogos notifica o serviço do Amazon GameLift quando um jogador se desconecta. O serviço usa essas informações para acompanhar o status dos slots dos jogadores em uma sessão de jogo e pode permitir que novos jogadores usem os slots abertos.

  1. Um jogador se desconecta da sessão do jogo.

  2. O processo do servidor de jogo detecta a conexão perdida e chama a operação RemovePlayerSession() do SDK do servidor.

  3. O serviço do Amazon GameLift altera o status da sessão do jogador para COMPLETED e reabre o slot do jogador na sessão de jogo.

Encerramento da sessão de jogo

No final de uma sessão de jogo ou ao encerrá-la, o processo do servidor notifica o serviço do Amazon GameLift sobre o status da sessão do jogo.

  1. O processo do servidor de jogos encerra a sessão do jogo e inicia o encerramento do processo chamando a operação ProcessEnding() do SDK do servidor.

  2. O serviço do Amazon GameLift faz o seguinte:

    1. Carrega os logs de sessão de jogo no Amazon Simple Storage Service (Amazon S3).

    2. Altera o status da sessão do jogo para TERMINATED.

    3. Altera o status do processo do servidor para TERMINATED.

    4. Dependendo de como a solução de hospedagem é projetada, os recursos de hospedagem recém-disponíveis são alocados para executar um novo processo de servidor de jogos.