Aller au contenu

Algo : Arrêtez de jeter ! Recyclez !

Qui n’a pas eu le soucis que ce soit dans C2 ou même ailleurs , de se dire : mon jeu a l’air bien codé, je comprend pas pourquoi cela rame, ou que c’est pas super fluide ou qu’il y a des accoups etc….

Il n’y a pas de réponse précise, mais quelques pistes à aborder, l’une d’entre elles est le recyclage. Ne voyez pas là un article long et détaillé qui va vous expliquer comment cela marche dans x langages, mais juste peut être une idée.

Alors, euh, les sprites c’est la poubelle jaune, c’est ca !

En fait c’est comme à la maison, à toujours vouloir jeter, on se retrouve avec un amas de saloperies à ne plus savoir où les mettre. Alors c’est quoi la solution ? un incinérateur de sprites et un purificateur de RAM ? Les écolos vous diront que vos sprites cramés risque de percer la couche d’ozone et que le purificateur de RAM n’empêchera pas à votre CPU de choper le cancer thermico-court-circuital (oui je sais j’aime bien les noms savants).

Alors c’est quoi la solution pour contenter tout le monde ? Le recyclage bien sur ! et cela ne coûte pas plus cher promis !

Faites le tri

Le problème généralement des algos qui rament, c’est qu’on demande de faire pas mal de choses à nos machines en même temps, et très souvent des calculs qui ne servent pas forcément à grand chose. Ceci est d’autant plus vrai par ex sur un moteur de particules  ou sur un jeu où il y a de nombreux sprites (des ennemis par exemple) qui se baladent sur nos écrans.

La question qu’il faut se poser est : qu’est ce qui doit être détruit et qu’est ce qui ne doit pas être détruit ?

Parlons le même langage

En effet, en programmation quand on parle de destruction, la plupart du temps on dit qu’on tue une instance comme un sprite par ex, et qu’on le libère de la mémoire pour récupérer cette mémoire et l’allouer à autre chose.

Mais est ce vraiment nécessaire ? Reprenons notre exemple de particules, sachant que je met à part du moteur de particules déjà présent dans C2, car ici on parle juste pour l’exemple uniquement. En effet, j’aurais pu prendre pour exemple un nombre de sprites conséquents, je prend l’exemple de particules juste parce que dans ce cas là c’est plus parlant.

Donc reprenons,  dans les faits, cela veut dire que le programme va créer admettons 1000 particules, en tuer 10 en recréer 50 et ainsi de suite.

A un moment donné même vous (sauf si on met évidemment un compteur) ne saurez plus trop combien il y en a à l’écran. Et là encore cela peut poser problème. Si votre algo pour une raison x ou y fait que vous vous retrouvez à un moment donné avec 800 particules de plus, votre programme va ramer et en plus votre programme continuera d’en créer, d’en détruire, d’allouer la mémoire et de la désallouer et….bouuh quel bazar.

Recyclez je vous dis !

Le recyclage consiste à dire qu’on ne détruit pas la particule, mais on la désactive (donc pas de mise à jour de position, de couleur ou autre), et donc on ne l’affiche plus. Et quand le besoin s’en fera sentir on la rappelera tout simplement.

Reprenons notre exemple : On prend 1000 particules qu’on crée. J’en ai 10 qui sortent de l’écran. NON ! on ne les détrtuit pas ! on les désactives. Le jeu continue et là ho j’ai besoin de 10 particules supplémentaires, alors on va aller piocher dans la piscine (appelée pool) des particules désactivées et on va les « ramener à la vie » et ainsi de suite.

Ainsi vous pouvez contrôler exactement combien de particules seront présents en mémoire. Le joueur aura l’impression d’avoir des particules et des particules mais en fait il y en aura toujours le même nombre au maximum à l’écran. C’est juste que les particules seront recyclées à l’infini. Ainsi si vous savez que votre jeu est très fluide avec 1000 particules max, alors cette solution va vous permettre en utiliser autant que vous voulez en recyclant les anciennes qui auront été désactivées soit parce qu’elles sont sorties de l’écran, soit parce qu’elles auront touché le sol etc…

Après faut détruire quand même !

Alors bien sur il ne faut pas tout recycler, mais dites vous que quand vous en aurez fini pour de bons avec vos particules, là vous pourrez les détruire définitivement bien entendu.

Bien sur j’ai donné l’exemple de particules pour que ce soit plus facile à comprendre techniquement parlant, mais ceci est valables pour tous les objets qui ont besoin d’être présents en nombre dans le programme, que ce soit des ennemis ou autre chose. Comprendre ici que je ne parle pas forcément des particules de Construct 2 qui ont leur propre moteur intégré (et qui utilise peut être cette technique d’ailleurs).

Cependant, si vous avez des sprites à mettre à gogo, des ennemis qui virvoltent de partout ou tout simplement un large spectre de « gnangnans » animés à mettre dans vos publications, pensez au recyclage si nécessaire !

Alors convaincu ? mettez vous au vert ! et pensez à recycler quand vous le pouvez, et vous verrez, vous gagnerez en performances à un moment ou à un autre 😉

A bientôt les constructeurs !