Il explique avoir réduit le temps de chargement de GTA Online, qui prenait 6 minutes, à environ 1 minute 50, en corrigeant seulement deux fonctions très simples à l’origine du goulot d’étranglement.
Ce n’est pas un patch officiel : l’auteur a simplement corrigé, à titre expérimental, les deux fonctions problématiques via un hook de DLL. Quand on pense que Rockstar Games a généré plus de 1 000 milliards de wons de revenus rien qu’avec GTA Online depuis sa sortie fin 2013, il est assez sidérant qu’un problème aussi simple n’ait jamais été corrigé.
J’ai résumé ci-dessous les points clés du goulot d’étranglement. L’article original détaille de façon passionnante et très précise les mesures de performance, l’identification du problème et la méthode de résolution (code compris), donc cela vaut vraiment la peine de le lire.
- Json parsing with sscanf
- Le code du jeu analysait un fichier JSON de catalogue d’objets de 10 Mo, et appelait la fonction
sscanfpour chaque entrée (environ 63 000 au total).
La fonction strlen, appelée par sscanf, lisait la chaîne caractère par caractère jusqu’à la toute fin du fichier pour en déterminer la longueur.
- Le fait de relire cette chaîne de 10 Mo 63 000 fois de suite faisait perdre 1 minute 30 supplémentaire.
- Hash key not used
-
Dans la continuité du point précédent, lors de l’insertion des informations d’objets analysées dans un tableau, le code cherchait la position d’insertion par parcours séquentiel « depuis le début du tableau ».
-
Bien qu’une valeur de hachage soit utilisée pour vérifier les doublons, aucune table de hachage n’était employée ; rien que pour trouver la position d’insertion, le programme effectuait
((63000^2+63000)/2)vérifications, ce qui ajoutait encore 1 minute 40.
Aucun commentaire pour le moment.