domingo, 1 de fevereiro de 2015

Hardcore Devel #3

Dando continuidade ao projeto MinArena!

Olá! Hoje estaremos falando sobre jogos online e latência! O projeto MinArena é um projeto de jogo online e como tal sofre todos os problemas que os sistemas distribuídos sofrem, que são latência e sincronização. Esses desafios já foram abordados e até levemente documentados em alguns lugares de modo a apresentar soluções e até os problemas que essas soluções geram.

Bom, vamos começar falando um pouco sobre o básico de sistemas distribuídos. Quando falamos a respeito disso, pensamos em processos, não necessariamente máquinas, rodando separadamente e comunicando-se entre si. Processos rodando separadamente mas sem nenhuma conexão não podem ser considerados sistemas distribuídos.

Mas o normal é pensarmos em máquinas distintas, até porque essa é uma das primeiras idéias ao se pensar em sistemas distribuídos: Usar o poder de várias máquinas para executar uma mesma tarefa. Então coloque dois computadores com um cabo conectando-os e daí vocẽ ja pode começar a perceber os problemas que podem surgir disso. A primeira coisa a se pensar é o tempo de propagação do sinal de um ponto a outro, o segundo é a qualidade do sinal.

Esses tempos de propagação são os geradores de latência. Ela não é problemática quando não estamos lidando com sistemas de tempo real, mas não é o caso do nosso jogo. Então devemos procurar formas de solucionar os problemas de latência para fornecer uma boa experiência do jogador. Imagine-se jogando um Quake 3, ou Call of Duty onde você mal consegue saber quando está vivo ou morto ou a posição real de seus inimigos.

O segundo problema diz respeito a mensagem chegar no destino e chegar consistente. Existem técnicas para solucionar o primeiro requisito mas ainda não existe a forma perfeita para se solucionar o segundo, então vamos focar simplesmente na chegada ao destino e supor que o pacote sempre aparece redondinho. Na verdade existem já abstrações o suficientes para garantir a chegada das mensagens, porém iremos mostrar porque ela não é suficiente para nós.

P: Como resolver o problema da latência e da sincronização?
R: Fixando intervalos de tempo.

Bom, não há possibilidade de sincronizar os relógios perfeitamente devido ao problema da latência. Se você diz a hora para alguem, o tempo já se modificou enquanto você o fazia, e geralmente a precisão para sistemas de tempo real é de milisegundos! Não há forma de sincronizar todas as máquinas com o mesmo tempo!

Então nós fazemos o seguinte: Vamos dar os passos do sistema a cada intervalo fixo de tempo. Digamos que a cada um segundo o sistema faz alguma coisa. Isso deve dar tempo o suficiente para que as pessoas enviem suas informações e recebam uma resposta que não esteja desatualizada. Quanto menor o seu intervalo de tempo, mais próximo do tempo real a coisa vai parecer. Se você pensar em um intervalo de tempo infinitamente pequno você vai estar em tempo real, mas isso não é possível(ainda) por questões físicas.

P: Como resolvemos o problema da garantia de entrega?
R: Repetindo a mensagem e perguntando se chegou.

Bom, a primeira coisa que se faz em comunicações de rede é descobrir se o outro lado está respondendo! Infelizmente não há uma forma perfeita de se fazer isso. O que podemos fazer é enviar uma mensagem e supor um tempo limite de resposta. Se ela não chegou em tempo satisfatório, quer dizer que o servidor está fechado.

Não existe garantia de entrega. O que se faz é aumentar a probabilidade de sucesso aumentando o número de mensagens enviadas. Se existe uma possibilidade de uma mensagem chegar no servidor, enviá-la repetidamente irá aumentar essa chance. O que pode ser feito é o envio de uma resposta sinalizando o recebimento do pacote para evitar congestionamento na rede.

O problema de abstrações que "garantem" a entrega é a sobrecarga gerada. Enviar um pacote sob uma dessas abstrações demora muito mais tempo do que enviar o pacote diretamente. Isso torna inviável aplicações de tempo real.

- Então é impossível fazer aplicações de tempo real?

Não, mas é muito difícil. O grande truque é conseguir enganar os usuários pensando que o requisito se mantém. Não é uma tarefa simples mas para os jogadores de mmorpg e moba, saibam que estão sendo enganados esse tempo todo.

Nenhum comentário:

Postar um comentário