Jeux vidéo

Il réduit les temps de chargement de GTA Online : Rockstar le remercie et prépare un update

Un développeur a trouvé un moyen de réduire de 70% les temps de chargement du jeu en ligne GTA Online sur PC. Après avoir reperé cette optimisation, le studio de développement Rockstar Games l'a remercié et prépare une mise à jour.

Ils ont irrité plus d'un joueur de la version en ligne de Grand Theft Auto V depuis les 7 ans d'existence de ce dernière opus du célèbre jeu vidéo : les temps de chargement anormalement longs, pouvant mener jusqu'à 20 minutes d'attente (!) pour certains joueurs.

A tel point qu'un joueur agacé, qui a la petite particularité d'être un développeur, a fini par se plonger dans le code du jeu. 😉



Avant d'en arriver là, le développeur, qui répond sur son profil GitHub au nom de tostercx, a tout simplement commencé par observer le comportement de son gestionnaire des tâches au lancement du jeu sur son PC milieu de gamme.

Il remarque alors qu'après une première minute d'attente (au cours de laquelle sont chargées les ressources communes aux modes histoire et online du jeu), l'utilisation de son CPU augmentait de manière importante, mais que la sollicitation de la mémoire et du réseau de son poste était quasi nulle.

Cela suggérait que le temps de chargement n'était pas dû aux serveurs de Rockstar, l'éditeur du jeu vidéo, mais à quelque chose qui tournait sur le processeur, en ne travaillant qui plus est qu'avec un thread unique selon l'analyse de tostercx.

Le développeur s'est par la suite empressé de décompiler les sources du jeu pour se plonger dans ses milliers de lignes de code C++ et débuguer la bête de l'intérieur.

Il s'aperçoit que c'est un appel à la fonction sscanf (qui permet la lecture de texte depuis certain un format de données) qui semble être la cause de cet embouteillage au niveau du CPU. En creusant plus, le dev découvre que la fonction travaille sur du JSON. Mais pas n'importe quel JSON : un fichier JSON (tenez-vous bien) de 63 000 objets, d'environ 10 Mo. Les données présentes dans ce fichier correspondent à tous les items et upgrades payants du jeu, et chacun d'entre eux se voit passé en revue au moment du chargement.

10 Mo, c'est pas grand chose me direz-vous, mais c'est là qu'une particularité de la fonction sscanf vient broyer le tout : pour chaque octet de donnée ajouté lors de la lecture, la fonction compte chaque caractère de la chaîne de caractères de 10 Mo via un strlen. Et ça, sur autant d'entrées, ça prend PAS MAL de temps.

Un second problème est ensuite identifié par le développeur. Chaque item parsé atterrit dans un tableau où son stockées les données qui lui sont associées (son nom, son prix, sa catégorie, etc.). Le souci ? Cette insertion s'effectue après qu'un contrôle sur l'item ait été réalisé pour s'assurer qu'il n'existait pas déjà dans le tableau.



Alors que les premières insertions de ces contrôles dans le tableau prennent peu de temps, ils se démultiplient de manière colossale au fil des enregistrements, à tel point que selon les calculs du développeurs, le code effectue presque 2 MILLIARDS de contrôles pour remplir ce foutu tableau. 😱

Pour résoudre ces problèmes de performance, tostercx a écrit son propre code pour écraser les fonctions des développeurs du jeu et éviter ces appels et contrôles en cascade.

En exécutant à nouveau le jeu avec son propre code, le développeur découvre une réduction drastique de son temps de chargement, de l'ordre de 70% ! Plutôt bien payé pour la modification de seulement 2 fonctions ! 😅

Après avoir partagé sa découverte en ligne ainsi que son code sur GitHub, le fix du développeur a été repéré par Rockstar Games. Le studio l'a récompensé dans le cadre de son programme de bug bounty en lui versant la somme de 10 000 dollars, et travaille actuellement sur une correction qui sera prochainement déployée, pour le plus grand plaisir des joueurs. 😉

Vous pouvez retrouver les explications détaillées de tostercx, que j'ai essayé de vous synthétiser du mieux que je le pouvais ici, sur le post dédié à ce fix sur son blog.

S'abonner aux Joies du Code sur Facebook

Suivre Les Joies du Code sur Twitter

À propos de l'auteur
Nicolas Lecointre
Chief Happiness Officer des développeurs, ceinture noire de sudo. Pour rire, j'ai créé Les Joies du Code. J'utilise Vim depuis 10 ans parce que je sais pas comment le quitter.