Florida 1865 - juillet 2024 - Amélioration de la vitesse du jeu sous Gdevelop

Aujourd'hui je travaille a réduire le lag ou pour le dire autrement améliorer la vitesse du jeu.

Je suis en train de travailler sur le jeu Florida 1865 et je veux montrer que les populations qui était sous esclavage une fois libéré, vont chercher à trouver des terres vides. Cela veut dire faire bouger à l'écran des centaines d'éléments en meme temps. 

En effet il y a plus de 600 éléments à l'écran qui interagissent en même temps et il faut trouver la bonne dynamique pour garder un gameplay agréable.


Actuellement je suis à 362 ms par image et je vise 100 u 150 ms (millisecondes) par images


Etape 1 Reduction du nombre de chronomètre pour le menu securite et l'affichage des couleurs

je tente de réduire le nombre de chronomètre qui tourne en simultané (plus de 500 tout de même) pour les remplacer par quelqu'uns. En effet, chaque objet du jeu a un chronomètre et cela prend beaucoup de puissance de calcul.

Chaque zone qui réalise une carte de couleur a un chronomètre, on décide de réduire à un seul qui fait le calcul pour chaque zone.



voici le résultat que je dois garder, le niveau de sécurité qui varie en fonction de la présence de soldats ennemis



Et donc ca marche avec les nouvelles règles avec un seul chronomètre ☺️.



Cela m'a permit e passer a 343 ms soit un gain de 19 ms, on continue. #Les petites gouttes d'eau font les grandes rivières.



2. Reduction du nombre de chronomètre chez les travailleurs blancs pour se distancer.

Travailleurs blanc c'est une catégorie sociale et un des types d'unités.

Il y en a plus de 500 sur la carte, c'est nécessaire pour créer une dynamique sociale.

Je prend un chronomètre au ieu de 500 et j'obtiens une baisse à 219 ms 😱.


Ici la règle est que les travailleurs soient à un certain nombre de pixels les uns des autres.



3. Reduction du nombre de chronomètre pour l'exode rural des travailleurs blancs.


Mais là méthode de réduction des chronomètres ne marche pas toujours.


Ici le code avec des chronometre d'objet fonctionne mieux qu'un seul chronometre

ce code ci 230 ms




ce code la 340 ms




Au final j'arrive a 257 ms avec ce resultat quand je reduis le nombre d'opérations



4. Reduction du nombre de chronomètre pour la carte sécurité 

On part à 352 ms sans aucune règle (juste les valeurs monte)






Avec les nouvelles règles


Je passe à 261 MS.




Version à tester

https://gd.games/instant-builds/06d3f88d-73e0-408b-b099-6f0a35e7a741

Version public

https://gd.games/antmdh/reconstruction-1865









5. Je cherche encore a travailler la vitesse du jeu


je suis a 239 ms




sans la règle de distance des travailleurs blanc je sis a 166 il y a donc 100ms a gagner


ca marche je suis arrivé a 195 ms meme si le probleme c'est qu'il parte tous dans la mer ;-)



J'essaye maintenant d'ajouter les memes règles pour els travailleurs  noir mais j'arrive à 3000 ms 



Je regarde regle par regle

1ere regle 169 ms


2e regle

avec la règle suivante on passe à 185 mais j'essaye de réduire


ici j'augmente à 195 (pas vraiment le but)

et l'a je redescend à 168, il semble que le fait d'impliquer un choronometre pour lui demander de regarder tout les 6 secondes augmente le lag au lieu de le diminuer


3e regle 188 ms


C'est la derniere règle qui fait tout planter





6. On est toujours dans l'amélioration de la vitesse

1. regles qui fait tous planter population noir

Sans la derniere regle 199 ms

j'ai repéré le bug et maitenant je suis a 248 ms


7. Je réorganise mes règles

Je réorganise les pages et voici mon plan actuel


J'observe qu'il manque la dynamique d'exode rural pour la population noir mais cela n'améliore pas la vitesse


8. Je regarde si la vitesse en local est plus rapide que la vitesse sur la version online

J'ai exporté ma version en APK mais cela ne va pas plus vite que la version testé en ligne ou sur mon ordinateur. (L'animation de troupe sélectionné dure jusqu'à 5 secondes au lieu de une )


Je dois encore réduire la vitesse 


9. Je fais un test pour comparer si un chrono ou 500 chrono influence fortement la vitesse


1er cas une image qui change chaque seconde, le chrono est dans la valeur

= 1,49 ms

2e cas, 500 image qui change chaque seconde, le chrono est dans la valeur

= 3,23 ms

3e cas, 500 image qui change chaque seconde, un seul chrono

= 3,72 ms

=> 1ere conclusion, le nombre de chronometre ne varie pas, mais la méthode d'écriture oui

Faisons plus complexe

500 images qui bouge dans des sens differents et 500 chronometre 

=5,2 ms

v500 images qui bouge dans des sens differents et 1 chronometre 

=4,71 ms


Conclusion oui le nombre de chronomètre a une incidence dans la vitesse pour Gdevelop


Code ci dessous



{"000kind":"GDEVELOP_EventsAndInstructions_CLIPBOARD_KIND-jsBdHbLy912y8Rc","content":{"eventsList":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"methode 1 - 500 chronometre"},{"type":"BuiltinCommonInstructions::ForEach","object":"pastille","conditions":[{"type":{"value":"DepartScene"},"parameters":[""]}],"actions":[{"type":{"value":"ResetObjectTimer"},"parameters":["pastille","\"chronopastille\""]}]},{"type":"BuiltinCommonInstructions::ForEach","object":"pastille","conditions":[{"type":{"value":"CompareObjectTimer"},"parameters":["pastille","\"chronopastille\"",">=","1"]}],"actions":[{"type":{"value":"ResetObjectTimer"},"parameters":["pastille","\"chronopastille\""]},{"type":{"value":"SetNumberObjectVariable"},"parameters":["pastille","chiffre","=","RandomInRange(0,9)"]}]}],"eventsCount":3,"actionsList":[],"actionsCount":0,"conditionsList":[],"conditionsCount":0}}


{"000kind":"GDEVELOP_EventsAndInstructions_CLIPBOARD_KIND-jsBdHbLy912y8Rc","content":{"eventsList":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"methode 2 - 1 chronometre"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"DepartScene"},"parameters":[""]}],"actions":[{"type":{"value":"ResetTimer"},"parameters":["","\"chronodescene\""]}]},{"type":"BuiltinCommonInstructions::ForEach","object":"pastille","conditions":[{"type":{"value":"CompareTimer"},"parameters":["","\"chronodescene\"",">=","1"]}],"actions":[{"type":{"value":"SetNumberObjectVariable"},"parameters":["pastille","chiffre","=","RandomInRange(0,9)"]},{"type":{"value":"AnimatableCapability::AnimatableBehavior::SetIndex"},"parameters":["pastille","Animation","=","pastille.chiffre"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"CompareTimer"},"parameters":["","\"chronodescene\"",">=","1"]}],"actions":[{"type":{"value":"ResetTimer"},"parameters":["","\"chronodescene\""]}]},




{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Methode 3 - 500 chronometre et pastille qui bouge"},{"disabled":true,"type":"BuiltinCommonInstructions::ForEach","object":"pastille","conditions":[{"type":{"value":"DepartScene"},"parameters":[""]}],"actions":[{"type":{"value":"ResetObjectTimer"},"parameters":["pastille","\"chronopastille\""]}]},{"type":"BuiltinCommonInstructions::ForEach","object":"pastille","conditions":[{"type":{"value":"CompareObjectTimer"},"parameters":["pastille","\"chronopastille\"",">=","1"]}],"actions":[{"type":{"value":"SetNumberObjectVariable"},"parameters":["pastille","chiffre","=","RandomInRange(0,9)"]}],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"AddForceVersPos"},"parameters":["pastille","pastille.CenterX()+pastille.chiffre","pastille.CenterY()+pastille.chiffre","10","1"]},{"type":{"value":"ResetObjectTimer"},"parameters":["pastille","\"chronopastille\""]}]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"AddForceVersPos"},"parameters":["pastille","pastille.CenterX()+pastille.chiffre","pastille.CenterY()+pastille.chiffre","10","1"]},{"type":{"value":"ResetObjectTimer"},"parameters":["pastille","\"chronopastille\""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"AnimatableCapability::AnimatableBehavior::SetIndex"},"parameters":["pastille","Animation","=","pastille.chiffre"]}]},



{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"methode 4 - 1 chronometre et 500 pastilles qiu bouge"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"DepartScene"},"parameters":[""]}],"actions":[{"type":{"value":"ResetTimer"},"parameters":["","\"chronodescene\""]}]},{"type":"BuiltinCommonInstructions::ForEach","object":"pastille","conditions":[{"type":{"value":"CompareTimer"},"parameters":["","\"chronodescene\"",">=","1"]}],"actions":[{"type":{"value":"SetNumberObjectVariable"},"parameters":["pastille","chiffre","=","RandomInRange(0,9)"]},{"type":{"value":"AddForceVersPos"},"parameters":["pastille","pastille.CenterX()+pastille.chiffre","pastille.CenterY()+pastille.chiffre","10","1"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"CompareTimer"},"parameters":["","\"chronodescene\"",">=","1"]}],"actions":[{"type":{"value":"ResetTimer"},"parameters":["","\"chronodescene\""]},{"type":{"value":"AnimatableCapability::AnimatableBehavior::SetIndex"},"parameters":["pastille","Animation","=","pastille.chiffre"]}]}],"eventsCount":13,"actionsList":[],"actionsCount":0,"conditionsList":[],"conditionsCount":0}}



10. Je travaille avec un seul type d'objet

Comme je suis capable de faire changer de sens 500 elements avec 3 ms, je dois etre capable de faire la meme chose ici, je remplace mes items par un seul items civil avec plusieurs animations (noir, blanc, aristocrate, indiens) au lieu de 4 ou 5 items differénts (travailleurs noirs, travailleurs, blanc, etc.)



Ma vitesse si je suis sans aucune règle de dynamique de population

= 12,87 ms

4.1 avec les regles qui donne les infos de debut

17 ms

Après le code, cela fonctionne super bien pour la mise en position des civils, il sont répartis dès la premiere secondes de jeu

et la vitesse est à 15,89 ms mais une fois les troupes installé


11. Je travail avec une structure mouvement instantané et calcul de valeur continue

Je travail avec une règle

En tache de fond, de manière continue, les valeurs sont calculés en arrière plan

Par contre le mouvement de manière instanté pendant 3 secondes et j'introduit une dynamique aléatoire qui choisit un item par frame pour le faire bouger


Voici le résultat 



Et je suis à 87 ms 


Voici mon code





Et en corrigeant encore mon code j'arrive à 52 ms en faisant en sorte qu'un maximum de calcul et de déplacement se fasse pour chaque entité 1 fois par 600 frames donc chaque élément bouge 3 secondes si c'est nécessaire une fois tout les 10 secondes, l'illusion est parfaite


Résultat final







Commentaires