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

Guia do Lag em Jogos › L1 Processo do jogo no cliente

Perda de precisão do tempo em float Float time precision loss on long sessions

ID da causa cg-float-time · Responsável principal Desenvolvimento do cliente (Equipe de desenvolvimento)

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

Se a hora do jogo fica guardada em um formato decimal de baixa precisão (float), quanto mais tempo o jogo fica aberto, pior fica a resolução temporal (a menor diferença de tempo que dá para distinguir), e movimentos e efeitos começam a tremer.

Por quê O tempo desde que o jogo foi aberto é acumulado em float ou passado assim mesmo para os shaders → Efeito Quanto mais tempo o jogo fica aberto, maior fica a menor diferença que o float consegue representar → Na tela Só no cliente aberto há dias, personagens, animações e efeitos com movimento tremem; reiniciando, tudo volta ao normal

Sintomas
Engasgos
Fatores
Jitter
Quem é afetado
Só eu
Quando
Quanto mais tempo ligado
Responsável
Responsável principal Desenvolvimento do cliente (Equipe de desenvolvimento)
O que fazer (Equipe de desenvolvimento)
Guardar o tempo decorrido em double (64 bits) ou em inteiro, fazer o tempo passado aos shaders voltar a zero periodicamente, fazer testes automatizados de longa duração, de vários dias.
Números de referência
Um float de 32 bits tem pouco mais de 7 dígitos significativos; com o jogo aberto há um dia (cerca de 86.400 s), a resolução temporal fica em torno de 8 ms, cerca de metade de um frame a 60 FPS (16,7 ms), e, em uma semana, em torno de 60 ms, mais que um frame inteiro.
No gráfico
Subida lenta · Reports de tremor, por tempo de cliente aberto
Onde olhar
Pedir, junto com cada report de tremor, há quanto tempo o cliente está aberto e comparar antes e depois de reiniciar. No desenvolvimento, testar com a hora de início do jogo ajustada para vários dias atrás
Confirma se
Treme só no cliente aberto há dias, some ao reiniciar e piora quanto mais tempo o jogo fica aberto
Descarta se
Treme logo depois de abrir: “Buffer de interpolação ausente ou curto demais” ou “Resolução do timer”
Como verificar
Verificação no ambiente do jogador
Saiba mais
Aparece principalmente em MMOs mobile em que o jogador deixa a caça automática ligada por dias sem fechar o jogo. O Time.time do Unity também é float, por isso o Unity oferece à parte o Time.timeAsDouble, em double, e recomenda usá-lo.

Fontes

  1. Time.timeAsDouble Unity
    Versão double de Time.time; com o jogo aberto por muito tempo, é mais precisa que float e, na maioria dos casos, é a recomendada
  2. Floating-point numeric types (C# reference) Microsoft
    Precisão do float: cerca de 6–9 dígitos; double: cerca de 15–17 dígitos

Veja também

Mesma camada: L1 Processo do jogo no cliente

Mesmo sintoma (Engasgos) em outras camadas

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