Em um cliente que está em janela em segundo plano, o jogo, a engine e o SO reduzem frames e processamento. Os pacotes recebidos não são processados a tempo e acumulam ou estouram o buffer.
Por quê Limite de frames em segundo plano nas opções do jogo ou no driver de vídeo (ex.: o driver da NVIDIA permite escolher de 20 a 200 por segundo), economia de energia, configuração da engine que pausa em segundo plano. O SO também prioriza CPU e GPU para a janela em primeiro plano → Efeito Menos pacotes processados por frame, a fila acumula, e quando o buffer de recepção estoura os pacotes são descartados → Na tela Ao trazer a janela para a frente, tudo aparece de uma vez, ou alguns NPCs nunca aparecem
Responsável principal Desenvolvimento do cliente (Equipe de desenvolvimento) · Também envolvidos Externo (Externo)
O que fazer (Equipe de desenvolvimento)
Manter a recepção de rede em uma thread separada do game loop, garantir uma vazão mínima de processamento mesmo em segundo plano, ligar a opção de execução em segundo plano da engine (no Unity, runInBackground).
O que fazer (Externo)
Orientar os jogadores a desligar o limite de frames em segundo plano do driver de vídeo e o modo de economia de energia do PC.
Números de referência
No Unity, com a opção runInBackground desligada, o game loop para no instante em que a janela perde o foco. Se a recepção acontece só nesse loop, nenhum pacote é processado nesse tempo.
No gráfico
Lacuna e depois tudo junto · Intervalo entre frames do cliente, pacotes processados por frame
Onde olhar
No mesmo PC, deixar uma janela na frente e outra atrás e comparar trocando os papéis. Medir o intervalo entre frames dos dois processos com o PresentMon e, com logs do jogo, ver o estado de foco da janela e os pacotes processados por frame
Confirma se
Só em segundo plano o intervalo entre frames aumenta muito (com limite do driver, achata no intervalo correspondente ao número de frames configurado) ou o processamento para, e ao trocar as janelas o problema passa para o outro cliente
Descarta se
Acontece igual na janela da frente: a causa não é o limite em segundo plano. Sempre o mesmo cliente com problema, seja qual for a posição da janela: opções de exibição ou versão diferentes
Como verificar
Verificação no ambiente do jogador
Fontes
Application.runInBackgroundUnity O padrão de runInBackground é false, e nesse caso o app pausa em segundo plano