Netcode: o que é e porquê o Rollback é um fator determinante para os jogos de lutas?
O Netcode se tornou um fator essencial no cenário dos jogos de luta pois estes ainda continuam populares com o decorrer do tempo, e em meio a tantas opções de jogos, desde os já consagrados e com maior evidência como Killer Instinct, Street Fighter 5, Mortal Kombat 11,The King of Fighters 15, Tekken 7, Dragon Ball Fighterz, Guilty Gear Strive e Super Smash Bros Ultimate, temos futuras promessas como Multiversus, DNF Duel e Project L.
O Rollback netcode se popularizou com a chegada de Guilty Gear Strive, no qual a Arc System implementou um netcode de qualidade incrível, tornando possível a jogatina online com uma qualidade de conexão semelhante a um gameplay local.
No entanto, para entender melhor o porquê do Rollback ter tanta importância, iremos nos aprofundar no funcionamento dos Netcodes dos jogos de luta, e iremos começar pelo Delay-Based Netcode.
Atualmente, a maioria dos jogos de lutas atuais rodam a 60 frames por segundo, o que significa que 1 frame tem cerca de 16 milissegundos (ms) de tempo real. Em uma jogatina offline jogador vs jogador, se acontecer de ambos pressionarem um botão na mesma janela de 16 milissegundos, o jogo receberá e processará as entradas no mesmo quadro e aplicará a lógica conforme o esperado. Ambos verão a mesma saída, porque há apenas o console/computador fazendo os cálculos.
Se tratando do modo online, a história muda completamente!
No modo online há mais de um “intermediador” no processo das informações além da máquina que está rodando o jogo, neste caso, o outro intermediador será a internet. Dessa forma, há um pequeno atraso na entrega das informações, pois elas vão da plataforma para a rede e da rede para dentro da plataforma do oponente, seja ela console ou PC.
Isso se mede em ping: quantidade de tempo que leva para o encaminhamento de informações entre jogadores.
Tomando como exemplo um ping de 90ms, levará cerca de 45 milissegundos (em média) para que as informações cheguem ao outro lado, isso equivale a mais ou menos cerca de 3 frames dentro do jogo. Tendo isto em mente, vamos entender o funcionamento do netcode baseado em delay conhecido como “Delay-Based Netcode“.
Se tratando do modo online, pegando o exemplo de 90ms que falamos acima, se pressionar o botão no 5° frame de animação do seu personagem, o próprio jogo irá atrasar artificialmente o comando efetuado por você, nesse caso, a ação irá sair no 8° frame de animação, pois este seria o tempo de envio da informação por meio da rede.
No exemplo a seguir da Code Mystics, podemos ver que ambos apertaram os botões ao mesmo tempo, mas os personagens só irão efetuar o movimento assim que essa informação chegar ao oponente, esse atraso artificial é o tempo necessário para essa troca de informação. Esse tempo entre o apertar do botão, até o momento da entrega dessa informação para os jogadores é conhecido como “input delay“.
Contanto que cada comando possa viajar pela rede nesses 3 frames, o jogo permanece estável e consistente mas essa não é a realidade da internet.
A qualidade da conexão faz toda a diferença
O maior problema desse tipo de Netcode é a inconsistência da internet. Como as redes não são plenamente consistentes (principalmente as redes Wi-Fi), o delay-based netcode têm dificuldades para lidar com as oscilações da rede. Se caso em uma luta um dos jogadores tenha atraso no envio das informações devido a oscilação na rede, o jogo simplesmente não pode prosseguir sem a informação de ambos os jogadores, dessa forma ele não terá escolha a não ser parar e aguardar a chegada da informação, fazendo com que o jogo “congele” a luta por curtos ou até mesmo longos períodos de tempo devido a problemas de rede.
O vídeo abaixo ilustra melhor essa situação. Observe que em determinado tempo, ao tomar dois golpes de seu oponente, a personagem da direita se defende do ataque, mas neste exato momento ocorre uma oscilação na rede, o comando de defesa aconteceu no 2° frame, mas devido a oscilação, esse comando não mais chegaria com os 3 frames de atraso, ou seja, no 5º frame. Desse modo, para que o delay-based netcode cumpra a sua função de entregar a resposta ao mesmo tempo para os jogadores, ele “congela” a luta até a rede estabilizar, assim que ela estabiliza, ele entrega a resposta no 5° frame.
Quando o atraso de entrada flutua muito, seja entre duas partidas diferentes ou mesmo durante a mesma partida. Os jogadores de jogos de luta perdem a confiança de que tudo o que fizerem funcionará conforme o esperado. E quando não conseguem cumprir o plano de jogo que sabem que os ajudaria a vencer, o jogo online torna-se extremamente frustrante e muitas vezes inútil.
Já se tratando do Rollback Netcode, o maior diferencial dele para o Delay-Based Netcode é o modo como ele lida com a incerteza da conexão.
“Eu vou manter o jogo rodando, pode deixar comigo!”
O Rollback não espera a entrada perdida do oponente congelando o jogo assim como o delay-based faz, em vez disso, ele continua rodando o jogo normalmente. Os comandos feitos na tela do jogador são processados imediatamente, semelhante ao modo offiline e nos casos em que a informação chega com atraso para o oponente, o netcode de rollback continua a simular o jogo.
Mas, quando essa informação finalmente chegar ao seu destino, o jogo terá avançado além do tempo em que o oponente pressionou aquele botão, e o jogo já terá mostrado um resultado diferente na tela. Para corrigir isso, o rollback retrocederá a simulação, aplicará a entrada correta e mostrará o novo resultado ao jogador imediatamente.
No vídeo abaixo, temos uma luta entre Fulgore e Jago, ambos jogadores pressionam soco no 1° frame. Mas digamos que a entrada de Jago tenha uma oscilação na rede causando atraso no envio da informação e ela acabe chegando 3 frames atrasada. Como o Rollback não pausa a luta nesse prazo de demora para a entrega da informação, observe que Jago permanece imóvel. No entanto, quando finalmente a informação chega ao seu destino no 4° frame, o jogo percebe que o comando verdadeiro aconteceu no 1° frame.
O jogo então deve consertar o passado executando alguns cálculos em segundo plano, e compensará o atraso cortando frames de animação para igualar o tempo de resposta de ambos os oponentes. Vale lembrar que esse corte de frames será visto apenas pelo o jogador de Fulgore, pois o atraso ocorreu no envio da entrada efetuada pelo o Jago, e esse atraso em questão foi de mais ou menos 45 milissegundos o que é quase imperceptível a olho nú.
Tudo acontece em uma fração de segundos!
O jogo pode estar mostrando coisas ligeiramente diferentes para cada jogador, dependendo da qualidade da conexão e do que está acontecendo no momento dos rollbacks.
Conforme podemos ver no exemplo abaixo:
Também não há como sua entrada ser invalidada ou “comida” pelo atraso da rede. O que pode ocorrer no Delay-Based Netcode quando o jogo está aguardando uma entrada remota e não responde para ambos os jogadores. Portanto, um jogador pode se sentir confiante de que o os botões que pressionam serão executados independentemente da qualidade da rede, aumentando muito a consistência do jogo online.
O funcionamento central do Rollback “puro” é bom mas não é o ideal. Não há atraso nos comandos, no entanto, visualmente, o corte de frames pode ser muito brusco. Dependendo da qualidade da conexão a impressão que fica é que está acontecendo “teleports” conforme Street Fighter 5 nos mostra.
O corte de frames na animação do golpe é efetivo, mas o resultado puro pode não ser o melhor
Vamos para o ponto onde o Rollback brilha, com a implementação do sistema de previsão, o modo utilizado em Guilty Gear Strive.
No exemplo anterior, mostramos que Jago ficou imóvel aguardando a chegada da informação para efetuar o comando no tempo correto. No entanto, é possível prever o que o jogador irá fazer com um grau de precisão incrível, este é o Rollback baseado em “previsão”.
O Rollback analisa a luta a todo o momento sem parar, então caso um comando tenha sido efetuado mas ocorra alguma perda após a entrada. O rollback irá duplicar o comando anterior a perda para todos os frames que ficaram sem entrada. Se o jogador estava segurando a defesa antes da perda no envio da comunicação, o jogo manterá o personagem se defendendo nesse espaço de tempo. Se o jogador estava andando para frente antes da perca, o jogo manterá o personagem andando para frente. Portanto, se a previsão do Rollback foi a correta, não será necessário cortar frames de animação para compensar o atraso, dispensando a reversão.
Observe no vídeo abaixo que Fulgore estava andando para frente, mas no 3° frame ocorreu uma perda na entrada. Sendo assim, o Rollback pegou a última entrada feita pelo o jogador de Fulgore e o manteve andando. As interrogações mostram a perca que aconteceu em cada frame de animação, os quadradinhos laranjas é a previsão que o Rollback está fazendo.
O explendor do funcionamento de um Rollback bem projetado
Abaixo temos o seguimento do que mostramos acima, só que desta vez, a informação de entrada chegou ao seu destino. Dessa forma, o Rollback irá comparar os comandos reais com a sua própria previsão frame a frame. se a previsão estiver correta, nada acontecerá. A gameplay seguirá normalmente, mas caso a previsão esteja incorreta, acontecerá o sistema de reversão. O Rollback vai para o frame onde a previsão errou e corrige com o movimento correto, cortando os frames de animação.
Se houver um pico de rede durante qualquer um desses momentos em que a entrada não foi alterada, será completamente invisível para ambos os jogadores. Mesmo em conexões duvidosas, uma grande porcentagem desses atrasos coincidirá aleatoriamente com momentos em que o jogador não mudou o comando inicial antes da perda.
Um jogo com o delay-based netcode teria que parar e esperar esse tempo em que ocorreu a perda. Ademais, um jogo baseado no rollback verifica se as entradas verdadeiras estão corretas com a sua previsão. E assim, quando a informação chega, não há necessidade de mudar nada, a conexão parece completamente perfeita.
Jogos que utilizam o Rollback netcode
- Super Street Fighter II Turbo HD Remix (2008)
- Marvel vs Capcom 2 (2009)
- Touhou Suimusou: Immaterial and Missing Power (2009)
- Street Fighter X Tekken (2012)
- PlayStation All-Stars Battle Royale (2012)
- Touhou Hisoutensoku (2012)
- Killer Instinct (2013)
- Eternal Fighter Zero (2014)
- Melty Blood Actress Again Current Code (2015)
- Brawlhalla (2015)
- Street Fighter V (2016)
- Mortal Kombat XL (2016)
- For Honor (2017)
- River City Ransom: Underground (2017)
- Marvel vs. Capcom: Infinite (2017)
- Injustice 2 (2017)
- Umineko: Golden Fantasia (2017)
- Acceleration of Suguri 2 (2018)
- The King of Fighters ’97 Global Match (2018)
- Street Fighter 30th Anniversary Collection (2018)
- Lethal League Blaze (2018)
- Mortal Kombat 11 (2019)
- Fight of Gods (2019)
- Samurai Shodown V Special (2019)
- Power Rangers: Battle for the Grid (2019)
- Fight of Animals (2019)
- Garou: Mark of the Wolves (2020)
- Maiden & Spell (2020)
- Mighty Fight Federation (2020)
- The Last Blade 2 (2020)
- Samurai Shodown NeoGeo Collection (2020)
- Super Smash Bros. Melee (2020)
- Fighting EX Layer (2020)
- Spelunky 2 (2020)
- Guilty Gear -Strive (2021)
- Fly Punch Boom! (2020)
Por fim, o que você achou do funcionamento dos Netcodes no jogos de luta? Comente abaixo e compartilhe conosco sua opinião! Em seguida, não se esqueça de se inscrever em nosso canal do YouTube e seguir o Combo Infinito nas redes sociais para mais notícias Facebook; Twitter, Instagram.
Fonte: Fightin’ Words
Em seguida, veja as últimas notícias: