2.0 Mon épopée pour optimiser le chargement des maps

Inscrit
10 Octobre 2016
Messages
6
Reactions
7
#1
Salut, il y'a quelques mois j'avais le projet d'optimiser le chargement des maps, je vais vous expliquer mon approche et du résultat final (?).

> Mais pourquoi ?
L'idée c'est de faire à peu près comme le chargement de maps sur Dofus-Touch, on charge une image pour le sol et en suite on charge normalement le reste des calques,
Il faut savoir que le client officiel de Dofus pèse maintenant 4go, dont 2go sont uniquement dédié aux tiles des maps, maintenant imaginons qu'on enlève toute les tiles de sols du jeu et qu'on charge tout le sol via une requete http, dans la théorie on pourrait gagner beaucoup d'espace, le jeu prendrait probablement moins de RAM et serait globalement plus rapide.

Sans parler du fait qu'avoir ce genre d'image peut être utile pour un fan-site et autres sans avoir à reproduire tout le process de chargement de maps du jeu

> Déjà, de quoi je parle exactement ?
Je parle de ça https://ground.ether-game.eu/95420420/0.jpg
Vous pouvez retrouver la liste des 13 973 maps ici https://ground.ether-game.eu
Ça correspond a un fichier jpg qui contient le background + background color + toute les tiles du calque 0

> Comment je m'y suis pris pour avoir tout ça ?
A la base j'aurais pu juste faire un genre de tools qui charge toute les maps au format DLM et sauvegarder une image, sauf que c'est assez compliqué de gérer la color correction de flash, les shadow etc..
J'ai donc préféré modifier un DofusInvoker 2.51, en y ajoutant une fonction pour passer à travers toute les maps du jeu, en y chargeant uniquement les sols et le background et y prendre une capture de map. D'après moi c'est la meilleure façon d'avoir un bon résultat,
Le process prend environs 4h si mes souvenirs sont bons, le dossier final fait 3.5go
(il faut savoir que j'ai essayé de récupérer les autres calques séparément, et ça fait 80go :sue:)

> Quel est le résultat ?
J'ai donc modifié mon DofusInvoker pour y ajouter tout le chargement du sol via des requêtes, et pour le moment j'en suis pas vraiment satisfait; le temps de chargement des maps est quasi identique à la normal, j'ai l'impression que mes images sont bien trop lourde ou que mon serveur web est trop lent (?), et que donc ça prend trop de temps à charger, faute d'un résultat significatif par rapport au temps de travail que ça demande, je m'en suis donc arreté là,

Tout ça pour dire que si vous avez idées pour optimiser tout ça je suis prenneur et que si ça marche bien le résultat sera open-source
 
Inscrit
10 Octobre 2016
Messages
6
Reactions
7
#2
Un peu de benchmark pour completer mon propos,

Les chargements basiques sont effectué avec le cache du jeu désactivé
Le chargement en HTTP est varié selon le cache du serveur web, dans l'idée si il y'a deux fois la même requêtes dans un moyen/court interval, la deuxième requête sera plus rapide à charger

> MapId: 88085777
1) Chargement basique:​
- Map GFX loaded in 132 ms​
- Layer 0 in 75 ms​
- Layer 2 in 10 ms​

2) Chargement via HTTP:​
a) 1ère requête​
[HTTP] Ground loaded in 182 ms​
Map GFX loaded in 26 ms​
Layer 0 in 5 ms​
Layer 2 in 9 ms​
b) 2ème requête​
[HTTP] Ground loaded in 59 ms​
Map GFX loaded in 35 ms​
Layer 0 in 5 ms​
Layer 2 in 11 ms​
> MapId: 88086289
1) Chargement basique:​
- Map GFX loaded in 40 ms​
- Layer 0 in 117 ms​
- Layer 2 in 8 ms​
2) Chargement via HTTP:​
a) 1ère requête​
[HTTP] Ground loaded in 169 ms​
Map GFX loaded in 24 ms​
Layer 0 in 5 ms​
Layer 2 in 8 ms​
b) 2ème requête​
[HTTP] Ground loaded in 45 ms​
Map GFX loaded in 22 ms​
Layer 0 in 5 ms​
Layer 2 in 7 ms​


Par contre, j'ai la fibre et un très bon PC toutes ces valeurs peuvent grandement changer selon la connexion et la PC de la personne qui fait le test, pour moi les deux façons sont assez égales voir un peu mieux pour la version HTTP,

La seconde étape va être de quantifier l'espace disque gagné en retirant toute les tiles dont on ne se sert plus
 
Dernière édition:
Inscrit
10 Octobre 2016
Messages
6
Reactions
7
#3
https://i.gyazo.com/bd192cde2afc1b2104bd346b0d720adf.gif

Au final le plus long reste de recevoir les infos du MapComplementaryInformationsDataMessage pour afficher les elements interactifs et les joueurs, à voir comment ça pourrait s'optimiser, peut être demander l'information de la map avant que la map soit chargé si c'est pas déjà le cas

Pour le moment en supprimant une partie des tiles non utilisé on gagne 1go d'espace disque mais je suis presque sûr qu'on peut en supprimer bien plus, j'ai aussi l'impression d'avoir gagné pas mal de RAM, mais j'ai pas encore trop pousser ce sujet
 
Inscrit
28 Decembre 2020
Messages
2
Reactions
2
#4
Plop !

Je suis pas du tout dans le domaine, mais si tu faisais en sorte de recive le MapComplementaryInformationsDataMessage au moment du clic pour aller sur la prochaine map (au moment du clic tu identifie la futur mapid sur laquelle tu arrive)
Comme ça au moment ou t'arrive vraiment sur l'autre map tes infos sont déjà reçu.

En soit, le temps du trajet du personnage permet de charger les infos pour la map d'après.

J'ai aucune idée si ça fonctionne comme ça et si c'est possible. Juste une idée comme ça :)

Bon courage !
 
Inscrit
6 Avril 2016
Messages
74
Reactions
14
#5
Salut, il y'a quelques mois j'avais le projet d'optimiser le chargement des maps, je vais vous expliquer mon approche et du résultat final (?).

> Mais pourquoi ?
L'idée c'est de faire à peu près comme le chargement de maps sur Dofus-Touch, on charge une image pour le sol et en suite on charge normalement le reste des calques,
Il faut savoir que le client officiel de Dofus pèse maintenant 4go, dont 2go sont uniquement dédié aux tiles des maps, maintenant imaginons qu'on enlève toute les tiles de sols du jeu et qu'on charge tout le sol via une requete http, dans la théorie on pourrait gagner beaucoup d'espace, le jeu prendrait probablement moins de RAM et serait globalement plus rapide.

Sans parler du fait qu'avoir ce genre d'image peut être utile pour un fan-site et autres sans avoir à reproduire tout le process de chargement de maps du jeu

> Déjà, de quoi je parle exactement ?
Je parle de ça https://ground.ether-game.eu/95420420/0.jpg
Vous pouvez retrouver la liste des 13 973 maps ici https://ground.ether-game.eu
Ça correspond a un fichier jpg qui contient le background + background color + toute les tiles du calque 0

> Comment je m'y suis pris pour avoir tout ça ?
A la base j'aurais pu juste faire un genre de tools qui charge toute les maps au format DLM et sauvegarder une image, sauf que c'est assez compliqué de gérer la color correction de flash, les shadow etc..
J'ai donc préféré modifier un DofusInvoker 2.51, en y ajoutant une fonction pour passer à travers toute les maps du jeu, en y chargeant uniquement les sols et le background et y prendre une capture de map. D'après moi c'est la meilleure façon d'avoir un bon résultat,
Le process prend environs 4h si mes souvenirs sont bons, le dossier final fait 3.5go
(il faut savoir que j'ai essayé de récupérer les autres calques séparément, et ça fait 80go :sue:)

> Quel est le résultat ?
J'ai donc modifié mon DofusInvoker pour y ajouter tout le chargement du sol via des requêtes, et pour le moment j'en suis pas vraiment satisfait; le temps de chargement des maps est quasi identique à la normal, j'ai l'impression que mes images sont bien trop lourde ou que mon serveur web est trop lent (?), et que donc ça prend trop de temps à charger, faute d'un résultat significatif par rapport au temps de travail que ça demande, je m'en suis donc arreté là,

Tout ça pour dire que si vous avez idées pour optimiser tout ça je suis prenneur et que si ça marche bien le résultat sera open-source
Très bonne idée !

Pourquoi le serveur web ? tu pourrais charger les images a partir du client non ? plutot qu'un serveur web.

Si tu n'arrives pas a faire beaucoup mieux que le système d'ankama, c'est probablement juste flash :teeth: le passage a unity va faire du bien.

Sinon il me semble qu'il y a déja un système de cache du sol dans le client quand une map est chargée right ? tu peux peut être t'en inspirer ?
 
Inscrit
12 Mars 2017
Messages
24
Reactions
20
#6
Superbe initiative,

Je serais parti sur la même idée que Skinz, pourquoi un serveur web ? Sachant que des requêtes HTTP sont souvent bloquante, je vois pas ou tu peux espérer gagner du temps.
Sinon pour avoir un gain, essayer de pre-shot la prochaine map qui va arriver au client et de déjà charger l'image, puis mettre en cache le tout pour ne pas avoir à refaire les requêtes me semble être une bonne piste

:)
 
Inscrit
10 Octobre 2016
Messages
6
Reactions
7
#7
L
Superbe initiative,

Je serais parti sur la même idée que Skinz, pourquoi un serveur web ? Sachant que des requêtes HTTP sont souvent bloquante, je vois pas ou tu peux espérer gagner du temps.
Sinon pour avoir un gain, essayer de pre-shot la prochaine map qui va arriver au client et de déjà charger l'image, puis mettre en cache le tout pour ne pas avoir à refaire les requêtes me semble être une bonne piste

:)
Le but c'est pas bon plus de rajouter 3go d'images de sol des maps au client du jeu, ça serait probablement contre productif, les requêtes ne sont pas bloquante, preshot le chargement semble être une bonne idée, je vais voir ce que je peux y faire
 
Inscrit
6 Avril 2016
Messages
74
Reactions
14
#8
L


Le but c'est pas bon plus de rajouter 3go d'images de sol des maps au client du jeu, ça serait probablement contre productif, les requêtes ne sont pas bloquante, preshot le chargement semble être une bonne idée, je vais voir ce que je peux y faire
Tu pourrais compresser tes images. Tu pourrais également retirer des gfx du client toutes les tiles qui ne sont plus utilisé.

Je ne sais pas quelle taille elle font, mais c'est certain que les charger a partir du disque sera plus rapide que de les télécharger a partir d'un serveur web, tu devrais regarder le temps que ça prend pour en avoir le coeur net.
 
Haut Bas