All Posts By

vini

Escondendo o Lag – O que os olhos não vêem, o coração não sente

By | Programming | 12 Comments

Bom pessoal, eu sou o Vinícius Pachá, mais um dos programadores do Projeto Tilt. E estou aqui para falar um pouco do Networking das nossas armas, em especial a nossa Sniper!

Em primeiro lugar, O que é uma Sniper no nosso jogo? Bom, em termos técnicos eu diria que é uma arma de longo alcance onde o dano é instantâneo, ou seja, não existe nenhum projetil correndo pelo cenário, não existe nenhuma trajetória, nós apenas traçamos uma reta a partir do personagem na direção que ele está mirando até bater em alguma coisa.

Ok, Let’s Do This!

Definido o que é a Sniper do Tilt… Vamos programar! (Parece bem fácil né?)
1° Passo: Quando eu atirar eu mando uma mensagem chamada “FeedbackDaSniper” pra todos os players dizendo: Atirei na posicao X e na direção Y;
2° Passo: Se acertei alguém, manda uma mensagem de Dano para esse player com a quantidade de dano e se eu matei, Instantaneamente manda um feedback de que o outro player morreu;
3° Passo: Cada player assim que recebe a mensagem “FeedbackDaSniper” renderiza na tela um efeito de laser partindo da posição do tiro;

Após tudo programado fomos testar e tivemos uma surpresa…

1VersaoMatando
Quando eu mato alguém


Quando eu morro

Mesmo com todo mundo com ping por volta de 40ms, 30ms, aconteceram coisas estranhas. Para o jogador que matou, tudo era bom: ele atirava em alguem, e se acertava e havia dano suficiente para matar o alvo morria na mesma hora. Porém, para quem morria, mesmo em 30ms ele já havia mudado de posição e quando a mensagem do tiro chegava o jogador não estava mais na reta do tiro, e morria mesmo assim pois recebeu o dano do primeiro player. Para quem morria era muito frustante, a galera reclamava: “Pô, morri mas o tiro nao me acertou =( “.
Não adianta fazer um jogo multiplayer onde 1 lado fica satisfeito, porém o outro se sente injustiçado.

A importância do Feedback

Quando falamos de jogos Multiplayer e Netcode temos que encarar o nosso pior inimigo, o lag. Para quem não sabe, lag é uma entidade maligna, que refere-se ao intervalo de tempo entre o início de uma atividade e o momento em que os efeitos desta se tornam aparentes. E não adianta, sempre existiu e sempre existirá lag. Então nossa maior duvida era, como disfarçar o lag?? Então, vamos relembrar o que aconteceu, eu atirei, ele morreu pra mim, ele morreu pra ele também, porém ele não teve o Feedback de que o tiro acertou nele. Ok, achamos o problema. Então tudo que tinhamos que fazer era achar um jeito do jogador que morreu ter o feedback de que ele foi realmente atingido pelo raio da sniper para ele ficar feliz!

Como Prever o Imprevisível

Muitas vezes em jogos Multiplayer nos deparamos com ações que são imprevisíveis, ações instantaneas que só conseguiriamos prever se estivessemos dentro da mente do jogador. E a Sniper é uma arma instantanea, é impossivel prever quando o player vai apertar o botão do tiro, entao a solução que achamos foi enganar o player.
E esse foi o resultado:

2VersaoMatando
Quando eu mato alguém

2VersaoMorrendo
Quando eu morro

Vendo as 2 imagens claramente o raio da sniper está em direções diferentes, mas… Será que isso é problema?
Bom, desse jeito quem matou fica feliz, quem morreu fica “feliz”, e o jogo não parece nem um pouco lagado, então é claro que não tem problema, o mais importante é fazer com que os jogadores não sintam o lag, mesmo que ele exista.
Ta bom ta bom… mas como fizemos isso?
Ao invés de mandar uma mensagem avisando Atirei na posicao X e na Direção Y, o player assim que atira, verifica se o outro player está na reta do tiro dele e se estiver manda uma mensagem “Acertei no player X”, e quando o outro player recebe essa mensagem, ele recalcula a direção a qual a sniper deve atirar para que a sniper o acerte. Assim o lag fica escondido por causa do feedback.

É isso aí galera, se você quiser testar a nossa Sniper, faça logo sua inscrição no nosso grupo de testers www.projecttilt.com/bitcakestudio/testers e venha jogar conosco por www.projecttilt.com/bitcakestudio/tilt.
Obs: Nossos testes acontecem todas as quintas de 20:00 às 21:00

Bom Teste!