# Lag

Lag é uma palavra em inglês que se refere a atrasos que se podem experimentar na comunicação entre computador (internet, por exemplo), podendo aplicar-se a outras situações, como comunicação via satélite ou mesmo em comunicação escrita.
Em computação, lag refere-se ao tempo que um pacote de dados leva a partir de um computador local até ao seu destino e, depois, de volta (ver ping). A causa de lag na maior parte dos casos é devido a uma alta latência, porém também pode ser causada por um fraco poder de processamento, seja do lado do servidor ou cliente.
O efeito do lag é verificável quando vemos, por exemplo, um jornalista no exterior, ao vivo, leva algum tempo a responder às perguntas que lhe são feitas no estúdio. Isso provoca uma reação desagradável nos espectadores.
Em MMORPGs, lag é o elevado período de tempo em que o computador do usuário fica atrasado em relação ao servidor principal, devido à baixa taxa de transferência da conexão ou excesso de pessoas no servidor. Mas geralmente o LAG ocorre devido a distância entre o remetente e o destinatário do pacote de dados, já que, quanto maior a distância, maior o tempo o pacote demorará a chegar ao destino. Também deve-se à baixa taxa de transferência da conexão local ou então porque outros computadores dessa rede estão a ocupar bastante conexão tornando esta mais lenta.
Uma baixa cadência (Frames Por Segundo) pode resultar em o jogo tornar-se menos responsivo e poderá gerar perda de dados na comunicação com o servidor: assim, é possível que um baixo FPS aumente o lag.
Existem vários métodos para reduzir ou disfarçar atrasos (em inglês: delays), apesar de muitos destes tem suas desvantagens e podem não ser aplicáveis em todos os casos. Se a sincronização de um jogo não é feita por ele mesmo, os usuários podem escolher jogar em servidores mais próximos geograficamente deles para reduzir latências, ou no caso de servidores mais simples, eles optam por abandonar os clientes com alta latência para não ter que lidar com problemas resultantes. Entretanto, essas são as opções de solução mais raras. Em vez disso, os jogos normalmente são projetados com compensação de atrasos incluso.

## Causas

Enquanto um jogo com um único jogador mantém o estado do jogo principal na máquina local, um jogo online exige que ele seja mantido em um servidor central, a fim de evitar inconsistências entre clientes individuais. Como tal, o cliente não tem controle direto sobre o estado do jogo central e só pode enviar solicitações de alteração para o servidor e só pode atualizar o estado do jogo local recebendo atualizações do servidor. Essa necessidade de comunicação causa um atraso entre os clientes e o servidor, e é a causa fundamental por trás do atraso. Embora existam inúmeras razões por trás do por que um jogador tenha experiências atrasadas, elas podem ser resumidas como hardware insuficiente do cliente ou do servidor ou uma má conexão entre o cliente e o servidor.
Geralmente, os jogos consistem em uma sequência de estados em loop, ou "quadros". Durante cada frame, o jogo aceita a entrada do usuário e executa os cálculos necessários (IA - Inteligência Artificial, gráficos etc.). Quando todo o processamento estiver concluído, o jogo atualizará o estado do jogo e produzirá uma saída, como uma nova imagem na tela e/ou um pacote a ser enviado ao servidor. A frequência com que os quadros são gerados é frequentemente referida como a taxa de quadros. Como o estado de jogo central está localizado no servidor, as informações atualizadas devem ser enviadas do cliente para o servidor, a fim de ter efeito. Além disso, o cliente deve receber as informações necessárias do servidor, a fim de atualizar completamente o estado. Gerar pacotes para enviar ao servidor e processar os pacotes recebidos só pode ser feito sempre que o cliente é capaz de atualizar seu estado local. Embora os pacotes possam teoricamente ser gerados e enviados mais rapidamente do que isso, isso só resultaria no envio de dados redundantes se o

### Efeitos

Os efeitos visíveis do atraso variam não apenas dependendo da causa exata, mas também de todas e quaisquer técnicas de compensação de atraso que o jogo possa implementar. Como todos os clientes experimentam algum atraso, a implementação desses métodos para minimizar o efeito nos jogadores é importante para uma jogabilidade agradável. O Lag causa inúmeros problemas para questões como a prestação precisa do estado do jogo e a detecção de batidas. Em muitos jogos, a defasagem é muitas vezes, desaprovada porque interrompe a jogabilidade normal. A gravidade do atraso depende do tipo de jogo e da sua tolerância inerente ao atraso. Alguns jogos com um ritmo mais lento, podem tolerar atrasos significativos sem qualquer necessidade de compensação, enquanto outros com um ritmo mais rápido, são consideravelmente mais sensíveis e requer um uso extensivo de compensação para ser jogável (como o gênero de atirador, em primeira pessoa). Devido aos vários problemas que o atraso pode causar, os jogadores que têm uma ligação à Internet insuficientemente rápida, por vezes, não são permitidos ou não podem jogar com outros jogadores ou servidores que têm um servidor de servidor distante ou têm latência elevada entre si. Casos extremos de atraso podem resultar em dessincronização extensiva do estado do jogo.

## Soluções e compensação de atrasos

Existem vários métodos para reduzir ou disfarçar atrasos (os famosos delays), apesar de muitos destes tem suas desvantagens e podem não ser aplicáveis em todos os casos. Se a sincronização de um jogo não é feita por ele mesmo, os usuários podem escolher jogar em servidores mais próximos geograficamente deles para reduzir latências, ou no caso de servidores mais simples, eles optam por abandonar os clientes com alta latência para não ter que lidar com problemas resultantes. Entretanto, essas são as opções de solução mais raras. Em vez disso, os jogos normalmente são projetados com compensação de atrasos incluso.
Muitos problemas podem ser resolvidos simplesmente permitindo que os clientes acompanhem seu próprio estado e enviem estados absolutos para o servidor ou diretamente para outros clientes. Por exemplo, o cliente pode saber exatamente qual a posição do jogador ou qual a posição de tiro. Essa solução funciona e irá eliminar todos os problemas relacionados a atrasos. Infelizmente, isso também depende da suposição de que o cliente é honesto. Não há nada que prevê se o jogador modificará os dados que eles enviaram, diretamente para o cliente ou indiretamente por meio de um proxy, a fim de garantir que eles sempre alcançaram seus alvos. Em jogos online, o risco de engano pode tornar esta solução inviável, e os clientes estarão limitados ao envio de estados relativos (isto é, se o vetor se moveu ou disparou).

#### O lado do cliente

Como os clientes normalmente não têm permissão para definir o estado do jogo principal, mas sim recebê-lo do servidor, a principal tarefa da compensação do lado do cliente é tornar o mundo virtual com a maior precisão possível. Como as atualizações vêm com um atraso e podem até ser descartadas, às vezes é necessário que o cliente preveja o fluxo do jogo. Uma vez que o estado é atualizado em etapas discretas, o cliente deve ser capaz de estimar um movimento baseado em amostras disponíveis. Dois métodos básicos podem ser usados para conseguir isso; Extrapolação e interpolação. [6]
A extrapolação é uma tentativa de estimar um futuro estado do jogo. Assim que um pacote do servidor é recebido, a posição de um objeto é atualizada para a nova posição. Aguardando a próxima atualização, a próxima posição é extrapolada com base na posição atual e no movimento no momento da atualização. Essencialmente, o cliente assumirá que um objeto em movimento continuará na mesma direção. Quando um novo pacote é recebido, a posição pode ser corrigida ligeiramente.
A interpolação funciona essencialmente armazenando em buffer um estado de jogo e tornando o estado do jogo para o jogador com um atraso ligeiro e constante. Quando um pacote do servidor chega, em vez de atualizar a posição de um objeto imediatamente, o cliente começará a interpolar a posição, a partir da última posição conhecida. Durante um intervalo de interpolação, o objeto será processado movendo suavemente entre as duas posições. Idealmente, este intervalo deve corresponder exatamente ao atraso entre os pacotes, mas devido à perda e atraso variável, raramente é esse o caso.