Estado dos Registros de Hits
Oi! Sou Kevin Lee, engenheiro de software da equipe de Sistemas de Jogo de VALORANT. Nossa equipe é responsável por desenvolver muitos dos principais sistemas que auxiliam a mecânica de jogo de VALORANT, incluindo sistemas de movimentação, combate e entrada de comandos. Neste artigo, vou comentar sobre um dos sistemas mais importantes para a mecânica de um jogo FPS: o Registro de Hits.
Em um título como VALORANT, em que um único tiro na cabeça pode decidir a vitória ou a derrota da equipe, o registro de hits é, sem dúvida, um dos sistemas mais importantes. Nosso objetivo como desenvolvedores é garantir que o resultado do tiro disparado seja claro, não dê espaço para dúvidas e esteja, acima de tudo, certo.
De vez em quando, lemos posts e recebemos mensagens de jogadores mostrando clipes de momentos em que o registro de hits parecia estar quebrado. Levamos todas essas denúncias de problemas muito a sério, e analisamos cada um desses vídeos quadro a quadro para verificar se o sistema está funcionando como o esperado.
Considerando todas as análises que fizemos, achamos que o registro de hits de VALORANT está tendo um bom desempenho no momento. Claro que a possibilidade de existir bugs sempre continua de pé, e nos comprometemos a levá-los a sério quando aparecerem. Estamos sempre tentando melhorar a qualidade e a clareza de todos os nossos sistemas.
EXATIDÃO VS CLAREZA
Nas Notas da Atualização 0.50, vimos um grande número de problemas de registro de hits sendo mencionados. Após darmos uma olhada nas mensagens e vídeos enviados pelos jogadores em relação a isso, fizemos vários teste internos e conseguimos identificar alguns bugs raros que afetavam o registro de hits, mas nenhum deles era severo o suficiente a ponto de explicar a quantidade de mensagens que recebíamos. Quando analisamos mais atentamente, notamos que a maioria dos clipes enviados não tinham nenhum problema de exatidão, mas sim de clareza. Os tiros estavam sendo processados corretamente, mas suas representações visuais estavam levando os jogadores a interpretarem os resultados de forma errada. Isso destaca uma diferença importante que existe entre exatidão e clareza nesse sistema.
Ambos os elementos são importantes na hora de garantir que o disparo vai passar a impressão certa para o jogador, mas...
- Exatidão aborda o resultado do tiro, que pode estar certo ou não (ex.: quando um tiro acerta a cabeça do inimigo, mas acaba registrando como um tiro de corpo, ou quando jogadores inimigos aparecem de uma forma no cliente e de outra no servidor)
- Clareza aborda a dificuldade de interpretação de um tiro (ex.: o tiro acertou o ombro do personagem, mas a representação visual faz parecer que o tiro, na verdade, acertou a cabeça dele)
- Bugs que afetam a exatidão dos disparos são muito mais graves do que os que afetam a clareza visual
Esperamos que este artigo ajude a tirar algumas dúvidas sobre o sistema, assim todos podem analisar suas jogadas e interpretar os acontecimentos na tela de maneira correta. Vou explicar como esse sistema funciona e o que acontece desde o momento em que o botão de disparo é apertado até o momento em que o tiro é mostrado visualmente na tela.
Para mais detalhes técnicos sobre isso, confira este artigo sobre o código de rede de VALORANT feito no blog de tecnologia da Riot (em inglês).
Também vou falar sobre alguns casos comuns que vemos nas mensagens que o público manda avisando sobre "registros de hit quebrados" e tentar explicar o que está acontecendo em relação a tudo isso, além de esclarecer como planejamos melhorar a acuidade visual dessas situações.
DO CLIQUE DO BOTÃO AO HEADSHOT
Antes de mergulharmos em detalhes sobre o que acontece quando um tiro é disparado, precisamos primeiro entender como o jogo simula a situação. VALORANT é um jogo simulado em duas fases: a primeira ocorre no servidor (que é a autoridade que dita como a simulação será representada) e a segunda, no seu cliente (que prevê os resultados do servidor para fazer o jogo parecer mais ágil).
A simulação do jogo inclui tudo que ocorre na partida, como o posicionamento dos jogadores e quaisquer habilidades ou fumaças que estejam sendo usadas no campo de batalha. O jogo faz uma captura de tela a cada quadro da simulação e usa essas capturas para renderizar o quadro que aparece na sua tela. O servidor também segue esse mesmo esquema para seus próprios quadros (porém pulando a fase de renderização, já que não tem ninguém assistindo à tela do servidor).
Beleza, agora vamos analisar a seguinte situação: o inimigo aparece virando a esquina e você, com suas incríveis habilidades de posicionamento de retícula, coloca a mira bem em cima da cabeça dele. Com tudo pronto, você aperta o botão esquerdo do mouse para disparar... e aí? O que acontece?
Logo que você aperta o botão, esse comando é enviado para o nosso sistema de entrada (sujeito a uma pequena quantia de latência de hardware/sistema operacional, é claro) que, a cada quadro do jogo, processa todos os comandos recebidos desde o último quadro capturado. Ao atirar, o comando de entrada "disparo" é enviado para o servidor junto com uma marcação de tempo, que indica em que quadro da simulação o tiro foi dado.
É importante salientar que essa marcação de tempo é feita de acordo com o que está sendo renderizado na sua tela no momento em que o comando de entrada é recebido pelo servidor de VALORANT. Sendo assim, agora precisamos acompanhar esse tiro em duas simulações diferentes: uma no seu cliente e outra no servidor.
Vamos começar com a do cliente, que ocorre na sua máquina local. Logo após o comando ser enviado para o servidor, o cliente começa a exibir um clarão de disparo e uma trajetória para o tiro. Nos casos mais rápidos, isso acontecerá um quadro após você atirar, já que o jogo precisa renderizar um novo quadro na sua tela. Isso é um aspecto muito importante do processo, pois significa que o quadro em que o tiro é processado NÃO É o mesmo quadro em que a trajetória é exibida – esse processamento ocorre, no mínimo, um quadro antes.
E é exatamente isso que pode resultar em uma falha na acuidade visual do tiro. A maneira mais comum de resolver essa falta de sincronia é atrasando o projétil. No entanto, não queremos fazer isso porque, se fizermos, esse atraso adicionará latência de entrada ao projétil, que é algo que queremos minimizar em VALORANT. Em relação à confirmação do hit: o cliente espera até receber o resultado do servidor para, então, exibir uma confirmação de hit. E, para garantir consistência de jogo a todos os usuários e prevenir que cheaters usem hacks em seus clientes para falsificar resultados de tiro, esses resultados ficam sob autoridade total do servidor.
Enquanto isso, o servidor eventualmente recebe a mensagem que o cliente enviou dizendo que um tiro foi disparado. Devido à latência da conexão de internet, um tempo se passou desde que esse tiro foi dado. Para garantir que o tiro seja processado na mesma simulação exibida para o jogador, o servidor rebobina a simulação até chegar à marcação de tempo enviada pelo cliente antes de avaliar o registro de hit. Isso inclui rebobinar as posições dos jogadores e as poses de animação do momento do disparo. Feito tudo isso, o servidor finalmente envia de volta o resultado para o cliente. Para facilitar o exemplo que vou dar, vamos imaginar que o tiro foi na cabeça!
O cliente vai receber o resultado vindo do servidor e exibir tanto os efeitos visuais quanto o áudio apropriados para ele. Neste caso, seria um efeito visual e sonoro de headshot. Como o cliente precisa esperar que o servidor envie o resultado do tiro, existe um atraso entre a trajetória do tiro e os efeitos de impacto que é igual ao tempo de viagem de ida e volta da sua conexão de internet (por exemplo, 40 ms até o servidor = 80 ms de atraso entre a trajetória e o efeito visual do impacto), sem contar a pequena quantidade de tempo de processamento. Com latências mais altas, esse atraso pode se tornar evidente para o jogador.
Estamos sempre trabalhando para tentar aprimorar isso na questão da clareza da situação.
ESTUDO DE CASO 1: atingindo alvos em movimento
Nós notamos que, em vários relatos de problemas de registro de hits que recebemos, o alvo do tiro está correndo. Vamos analisar melhor o que acontece visualmente quando um tiro atinge um alvo que está correndo. Podemos ver que o jogador acertou o inimigo que estava correndo. Para ilustrar isso de maneira mais fácil neste exemplo, digamos que o cliente está rodando a 60 FPS. É possível notar que no quadro anterior à trajetória do tiro ser exibida, a mira do jogador está alinhada com a cabeça do oponente.
Entretanto, esse não é mais o caso no quadro que exibe a trajetória.
Agora vamos voltar para o exemplo em que o jogador acertou o tiro e olhar para o quadro em que os efeitos visuais do impacto foram renderizados. Existe uma lacuna evidente entre o posicionamento atual do jogador e o posicionamento dos efeitos visuais do acerto do tiro devido ao atraso causado pela latência da conexão de internet. Isso tudo pode ser bem confuso quando você está tentando entender o seu próprio tiro, já que, provavelmente, o seu foco está no posicionamento atual do inimigo, não no posicionamento dele na hora em que o tiro foi dado. Essa mesma confusão acontece em situações em que um dos jogadores agacha ou anda de lado (que é exatamente o que analisaremos no Estudo de Caso 2).
Este estudo de caso demonstra a falta de clareza que existe no sistema de registro de hits atual. O ideal seria que os jogadores não tivessem que saber de tudo isso para poder analisar a situação da maneira correta. Como desenvolvedores, é nosso papel reconhecer que isso está acontecendo e investigar formas de melhorar a clareza em casos como esse
ESTUDO DE CASO 2: movimentação de agachamento VS. efeitos visuais de tiro
Neste cenário, você está no meio de um tiroteio a distância. Mesmo podendo se arrepender disso no futuro, você segura o botão esquerdo do mouse e lança uma rajada de tiros no oponente. Pelo menos uma dessas balas vai acertar um tiro na cabeça dele, né? Mas a resposta é não: você acaba acertando 3 tiros no corpo dele com sua Vandal, causando 117 de dano antes de receber um headshot em troca.
A fúria sobe à sua cabeça e você corre para analisar a gravação após a partida, tendo completa certeza de que você foi vítima de um registro de hit ruim. Você nota que o inimigo estava se agachando para tentar esquivar dos seus disparos e, para sua surpresa, também vê o efeito visual de um hit bem em cima da cabeça dele enquanto ele estava se agachando. Mas espera aí... o seu relatório de combate só mostrava tiros no corpo! Como assim? O que aconteceu?
Aqui vai o link de um post real do reddit intitulado "Headshots not registering when a player crouches (em inglês)" ("Headshots não estão sendo registrados quando um jogador agacha") para ajudar a ilustrar esse cenário hipotético.
Quando nossa equipe começa a investigar casos de registros de hits errados, esses são os exemplos mais comuns de registro "incorreto" de hits que vemos. Porém, na verdade, o registro está funcionando perfeitamente nesses casos. Os tiros estão acertando onde você mirou (não estou contando os possíveis erros de movimentação ou dispersão, claro) quando você apertou o botão de disparo, e o impacto está sendo devidamente registrado no servidor.
Entretanto, existem alguns fatores que fazem com que essas situações em particular sejam tão confusas:
- Os efeitos visuais dos hits ficam atrasados por conta da latência da internet
- Os efeitos visuais são exibidos no local original do impacto do tiro
- O alvo se move (se agachando, na maioria das vezes)
Para dar mais um exemplo, digamos que o jogador tem 100 de ping e atinge o oponente no ombro. Como precisamos esperar até que o servidor confirme o hit, os efeitos visuais do impacto levam 100 ms para serem exibidos no local do corpo atingido. No entanto, durante esses 100 ms, o inimigo começou a se agachar, o que fez a cabeça do personagem que ele controla se mover para trás dos efeitos visuais que acabaram de surgir. Em um tiroteio tenso a longa distância, um tiro no corpo pode ser facilmente confundido com um tiro na cabeça por conta dos efeitos visuais.
Esse tipo de coisa acontecia o tempo todo durante a Atualização 0.50 do Beta, quando os efeitos de sangue foram involuntariamente desativados para todo mundo, e nossos efeitos visuais de faíscas tinham menos clareza na distinção entre tiros no corpo e na cabeça. Sempre tivemos efeitos visuais separados para indicar tiros nessas duas áreas, mas percebemos que não era sempre que eles eram exibidos claramente em combate.
Isso é uma falha na clareza do registro de hits que estamos tentando aprimorar desde então. Uma das soluções que estamos testando é atrelar os efeitos visuais do hit à parte do corpo atingida, assim haverá uma relação clara entre os dois elementos mesmo em casos de alta latência.
Segue abaixo uma comparação entre os efeitos atuais de tiros na cabeça sem sangue e os efeitos de um tiro no corpo:
PLANOS PARA MELHORAR CLAREZA
Esses dois estudos de caso destacam alguns elementos que precisam ser aprimorados em relação às confirmações atuais de hit feitas por efeito visual. Uma das alterações que estamos fazendo é tentar colocar os efeitos de sangue e faísca para aparecer na posição atual do personagem (de acordo com a parte do corpo atingida) e segui-lo enquanto se move. Isso ajudaria muito na acuidade visual em situações em que os inimigos agacham, como no estudo de caso 2, já que o efeito acompanhará os movimentos do corpo do personagem.
Em contrapartida, um lado ruim dessa abordagem é que existe a possibilidade de os efeitos de confirmação de hit se moverem junto com o personagem para trás de algum objeto que dá cobertura. Vamos pensar no seguinte: temos o Jogador A, que tem 100 ms de ping, atirando no Jogador B, que fica avançando e voltando para trás de uma das esquinas do mapa. Se o Jogador A acertar um tiro no Jogador B enquanto ele estiver voltando para trás da cobertura oferecida pela esquina antes de a confirmação do hit vir do servidor, o Jogador A não conseguirá ver a confirmação do hit sendo manifestada no jogo.
Já pensamos em adicionar várias partículas diferentes para mitigar esse problema, como algumas que seguem o jogador ou outras que surgem imediatamente no local do hit com base na simulação do cliente. Entretanto, essas soluções podem causar confusão caso as simulações do cliente e do servidor discordem uma da outra em relação ao resultado de um tiro. Os efeitos visuais precisam ser claros quanto ao que representam para que seja fácil interpretar os resultados dos disparos.
Continuaremos fazendo alterações nesse quesito e tentando implementar outras melhorias à acuidade visual do jogo, e esperamos ter novidades para compartilhar com o público sobre esse assunto em uma atualização futura.
CONTINUE ENVIANDO VÍDEOS
Espero que este artigo tenha ajudado você a entender melhor como os registros de hits funcionam em VALORANT e por que os resultados dos tiros são processados da forma que expliquei aqui. Continue enviando vídeos toda vez que você achar que o registro de hits não está funcionando corretamente. Nossa equipe faz o possível para assistir a todos os materiais enviados pelos jogadores.
Mesmo que o vídeo não mostre um problema de verdade, ele ainda nos ajuda a identificar bugs que realmente afetam a exatidão dos registros de hit mais rapidamente (meu coração sempre parece que vai sair pela boca toda vez que vejo "registro de hit" no título de um dos posts mais votados do reddit).
Clique aqui para ver um exemplo real do reddit de um bug que afeta a exatidão dos disparos(em inglês).