Digital Foundry explica como um programador inteligente reduz em 70% o tempo de carregamento em GTA Online
E está a pedir à Rockstar que acrescente as suas alterações ao jogo.
GTA Online continua a ser um jogo popular (e incrivelmente lucrativo) sete anos após o seu lançamento, graças ao afluxo constante de novos conteúdos, mas uma coisa que a Rockstar parece não conseguir melhorar é o famoso longo tempo de carregamento do jogo. Durante o fim-de-semana, um programador empreendedor chamado t0st finalmente descobriu porque é que GTA Online demora tanto tempo a carregar - mesmo em máquinas com processadores e armazenamento rápidos como a PlayStation 5 e o PC - e resolveu esses problemas, reduzindo os seus tempos de carregamento em 70%.
O blog escrito por t0st que explica as questões e correções é brilhante, completo com excelentes ilustrações MSPaint, mas é um pouco difícil de seguir se não tiver experiência de programação. Vou tentar resumi-la o melhor que puder!
Então: depois da penosa espera por um carregamento de seis minutos para GTA Online no seu PC de gama média, t0st abriu o Gestor de Tarefas da próxima vez que carregou o jogo e reparou em algo estranho: após a marca de um minuto, a utilização do CPU do seu computador aumentou drasticamente, mas o armazenamento e a utilização da rede eram quase inexistentes. Isso sugeriu que os longos tempos de carregamento não foram causados pelos servidores da Rockstar ou pela leitura de dados de um disco - em vez disso, algo estava a utilizar o CPU. Algo que exigia uma tonelada de processamento para completar, e só utilizava um único thread.
Munido deste conhecimento, t0st utilizou uma série de ferramentas de programação e de depuração para descobrir dois grandes problemas.
Primeiro, o jogo estava a ler num ficheiro de texto todos os itens que se podem comprar no jogo - e depois de todos os 63.000 itens, conta novamente cada caractere no ficheiro de texto de 10MB. Fazer esta contagem uma vez não é nada de especial, mas fazê-lo 63.000 vezes adiciona um enorme desperdício de tempo do CPU.
Em segundo lugar, para preparar todos os dados do item que foram lidos, o jogo regista tanto os dados associados a esse item (por exemplo, o seu nome, preço, categoria, estatísticas) como um hash desse item (essencialmente uma 'impressão digital' calculada que o identifica de forma única). Cada vez que o jogo armazena um item da lista - o que, recorde-se, acontece 63.000 vezes - verifica o valor de hash do item que está a ser armazenado em relação ao valor de hash de cada outro item que já foi armazenado.
No início, isto não leva muito tempo, mas à medida que o número de itens carregados com sucesso no jogo aumenta, esta verificação leva cada vez mais tempo. No total, t0st estima que verifica num total de 1.984.531.500 (quase dois mil milhões!), mais uma vez ocupando uma tonelada de tempo do CPU. O jogo faz isto para garantir que não há itens duplicados na lista final, mas dado que a lista está completamente vazia para começar e o ficheiro a ser carregado não tem duplicados, a verificação é essencialmente inútil.
Para resolver os problemas, t0st escreveu o seu próprio código que substitui algumas das funções do jogo. Para resolver a questão da "leitura em itens", criou uma cache básica, que calcula uma vez o comprimento da lista de itens, e depois devolve esse mesmo valor sem voltar a fazer o cálculo sempre que o comprimento é pedido pelo código da Rockstar. Isto reduz de 63.000 para uma o número de vezes que a verificação precisa de ser feita, poupando uma enorme quantidade de trabalho desnecessário.
A segunda correcção é ainda mais fácil. Como t0st considerou que não há necessidade de verificar itens duplicados, o seu código apenas insere o novo item diretamente, sem sequer executar a verificação de hash. Isso significa que nenhuma das quase dois mil milhões de verificações precisa de ser feita, e o CPU pode disparar através do processo.
Com ambas as correções no seu lugar, os carregamentos de GTA Online são muito mais rápidas. No PC de t0st, evitar a verificação de itens duplicados reduz o tempo de carregamento de seis minutos para quatro minutos e meio, e adicionar também a fixação de carga do item reduz ainda mais este tempo, para apenas um minuto e 50 segundos. Isto é uma redução do tempo de carregamento de 69.4 por cento, o que é absolutamente incrível, dado que requereu a modificação de apenas duas funções.
Então, o que acontece agora? Bem, se for um programador de jogos experiente com as ferramentas certas, pode descarregar o código fonte aqui e tentar a correção por si mesmo. Note que modificar as funções do jogo enquanto o jogo está a funcionar desta forma é um comportamento de hacking clássico, por isso proceda com cuidado para que não acabe com um ban permanente.
Para todos os outros, a sua melhor aposta é esperar que a Rockstar implemente as correções numa futura atualização de GTA. A relativa simplicidade da correção e a magnitude da poupança de tempo devem significar que vale pelo menos a pena investigar, especialmente para jogadores nas consolas ou PCs com processadores AMD mais antigos. Como o próprio t0st o disse:
"Se isto de alguma forma chegar à Rockstar: os problemas não devem levar mais de um dia para serem resolvidos por um único dev. Por favor, faça algo quanto a isso :<
"Poderia mudar para um hashmap para a des-duplicação ou ignorá-lo completamente no arranque como uma correção mais rápida. Para o analisador JSON - basta trocar a biblioteca por uma mais eficaz. Não creio que haja uma saída mais fácil.
ty <3"
Dada a atenção que esta história tem recebido desde que foi publicada a 28 de Fevereiro, espera-se que a Rockstar ofereça pelo menos uma resposta, dado o tempo de carregamento que GTA Online tem tido ao longo da sua longa história. Iremos atualizar esta história se a Rockstar falar publicamente sobre o assunto.