한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Guia do Lag em Jogos › Design de sincronização

Feedback só depois da resposta do servidor (requisição-resposta) Request-response (no client-side feedback)

ID da causa sy-request-response · Responsável principal Desenvolvimento do cliente (Equipe de desenvolvimento) · Também envolvidos Desenvolvimento do servidor (Equipe de desenvolvimento)

Abrir o card interativo, com figuras e simulações →

Ao apertar o botão, não há animação nem som até a resposta do servidor chegar. O ping vira o tempo de resposta.

Por quê Skills, movimento e coleta de itens só são reproduzidos depois da confirmação do servidor → Efeito Desde o momento em que você aperta, nada acontece durante o tempo de ida e volta + a espera do tick → Na tela Com ping de 150 ms, todas as ações ficam 0,2 s mais lentas

Sintomas
Input lag
Fatores
Latência
Quem é afetado
Só eu
Quando
Sempre, Ao fazer ações específicas
Responsável
Responsável principal Desenvolvimento do cliente (Equipe de desenvolvimento) · Também envolvidos Desenvolvimento do servidor (Equipe de desenvolvimento)
O que fazer (Equipe de desenvolvimento)
Cliente: começar animações, sons e efeitos assim que o jogador aperta (feedback no cliente), mostrar só os resultados (dano, recompensas) depois da confirmação do servidor, aplicar movimento e ataque básico na hora com predição e, ao receber uma correção de posição do servidor, reaplicar a partir dela os inputs ainda não confirmados. Servidor: calcular o movimento a partir dos inputs recebidos e enviar correção só quando a diferença para a posição prevista pelo cliente passar do limite.
Números de referência
Tempo de resposta ≈ ping + metade do intervalo entre ticks + um frame. Com 20 ticks e ping de 150 ms, cerca de 190 ms.
No gráfico
Sempre alto desde o início · Tempo do input até o início da animação, RTT (ping)
Onde olhar
Registrar no log do cliente, em build de desenvolvimento, o horário do botão, do início da primeira animação ou som e da chegada da resposta do servidor, lado a lado com o RTT do jogo. Medir variando o ping com a emulação de rede da engine (Unreal NetEmulation.PktLag) ou com tc netem do Linux no servidor de testes
Confirma se
A animação sempre começa no mesmo instante em que a resposta do servidor chega, e o tempo do input até a animação é RTT + espera do tick, crescendo exatamente na medida do atraso inserido
Descarta se
A animação começa assim que o jogador aperta e só o resultado, como os números de dano, atrasa: design correto. Atraso maior que o intervalo entre ticks mesmo com ping baixo: aponta para espera dupla de tick ou problema de frame no cliente
Como verificar
Exige logs e métricas do servidor ou do cliente do jogo
Saiba mais
Para jogos que não precisam de resposta rápida, como os de turno, de cartas e idle, este modelo é o mais simples e seguro. O problema aparece quando um jogo com controle em tempo real usa esse modelo até para movimento e ataque básico.

Fontes

  1. Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization (Yahn W. Bernier, GDC 2001) Valve
    Um cliente que só espera o resultado do servidor mostra todas as ações 500 ms depois quando a latência é de 500 ms. A solução é predição no cliente e reconciliação com o servidor
  2. Using Gameplay Abilities in Unreal Engine Epic Games
    Local Predicted executa assim que o jogador aperta e o servidor dá a decisão final; Server Initiated não tem predição, e quem usa vê o atraso
  3. Understanding Networked Movement in the Character Movement Component for Unreal Engine Epic Games
    O cliente prevê e guarda os movimentos, só corrige quando o erro em relação ao servidor passa da tolerância (MAXPOSITIONERRORSQUARED) e, depois de corrigir, reaplica os movimentos guardados
  4. Using Network Emulation in Unreal Engine Epic Games
    Testa com latência mínima e máxima e taxa de perda de pacotes configuradas no servidor e no cliente; no console, a configuração usa comandos como NetEmulation.PktLag
  5. tc-netem(8) — Linux manual page iproute2
    Ferramenta de teste que insere atraso e jitter (delay TIME JITTER) e perda (loss random PERCENT) nos pacotes de saída para imitar uma rede real

Veja também

Mesma camada: Design de sincronização

Mesmo sintoma (Input lag) em outras camadas

Ver o card interativo, com figuras e simulações