L’insoutenable légèreté d’une expérimentation
Voici un lien vers une expérimentation qui montre l’importance du recyclage dans un jeu réalisé avec Phaser : http://blog.robomatix.net/phaser-test/phaser2/phaser-getFirstExists-for-recycling/. Vous pourrez constater la différence au bout de milles itérations. Utiliser F5 pour revenir au menu et passer d’un exemple à l’autre...
Cette expérimentation a largement été inspiré par celle de Jeremy Dowell dont il est question dans cette partie d’un tutoriel sur Phaser.
Explications
Si on ne recycle pas les sprite, la mémoire se remplit de choses devenues inutiles ce qui fini par la saturée si on pousse l’expérimentation à l’extrême... Par contre, en recyclant les sprites, on ne remplit la mémoire qu’avec ce dont on a besoin. Elle reste ainsi sollicitée seulement par ce qui est nécessaire. On peut laisser tourner à l’infini l’expérimentation avec le recyclage, la mémoire ne sera que peu sollicitée et l’animation restera fluide...
Un peu de code...
- /* add a group
- ******************************************************/
- this.squaresGroup = game.add.group();
- this.squaresGroup.enableBody = true;
- generateSquares: function () {
- for (var i = 0; i < 50; i++) {
- // Some variables
- var x = i * 10;
- var velocityY = this.game.rnd.integerInRange(600, 800);
- // Generates a square or recycles one
- var square;
- square = this.squaresGroup.getFirstExists(false);
- if (!square) {
- // Generate a new square
- square = game.add.sprite(x, 0, 'blackSquare');
- this.squaresGroup.add(square);
- // Init the square
- square.anchor.setTo(0, 0.5);
- // Add physic body
- game.physics.arcade.enableBody(square);
- square.enableBody = true;
- this.squaresGenerated++;
- }
- // Init the square
- square.anchor.setTo(0, 0.5);
- square.reset(x, 0);
- square.body.velocity.y = velocityY;
- // Kill the square when out of the world
- square.checkWorldBounds = true;
- square.outOfBoundsKill = true;
- }
- this.iteration++;
- this.iterationLabel.setText('Iterations : ' + this.iteration.toString());
- this.squaresGeneratedLabel.setText('Squares generated : ' + this.squaresGenerated.toString());
- }
Tout d’abord, on doit ajouter un groupe pour contenir nos sprites. C’est ce qui est fait dans le premier cadre de code.
La magie du recyclage se fait dans le second cadre. Il s’agit d’une fonction appelé par un timer à interval régulier... Dans ce qui suit, je vais mettre en avant ce qui permet de recycler.
Voici le premier élément :
- // Generates a square or recycles one
- var square;
- square = this.squaresGroup.getFirstExists(false);
- if (!square) {
- // Generate a square
- }
Ce code vérifie si un sprite square
inutilisé existe dans le groupe this.squaresGroup
, sinon, il en créait un...
- // Init the square
- square.anchor.setTo(0, 0.5);
- square.reset(x, 0);
- square.body.velocity.y = velocityY;
- // Kill the square when out of the world
- square.checkWorldBounds = true;
- square.outOfBoundsKill = true;
Cette partie initialise ou ré-initialise un sprite square
selon le cas.
Il deux chose importante pour le recyclage dans cette partie du code. square.reset(x, 0);
permet de réinitialisé le sprite. Noter que ’x,0’ changera selon les cas, mais il est important d’utiliser la méthode reset
.
Une autre chose qui est absolument nécessaire est cette partie :
- // Kill the square when out of the world
- square.checkWorldBounds = true;
- square.outOfBoundsKill = true;
Ce code permet de ’tuer’ le sprite lorsqu’il sort de l’aire du jeu en lui-même. Une fois tué, il pourra être recyclé !
square.checkWorldBounds = true;
dit que l’on va vérifier si un élément est dans les limites du jeu.
square.outOfBoundsKill = true;
dit que l’on ’tue’ un sprite lorsqu’il sort des limites du jeu... Il sera ainsi disponible pour être recyclé !
Quelques liens
Tout d’abord, pour voir mon expérimentation en ligne : http://blog.robomatix.net/phaser-test/phaser2/phaser-getFirstExists-for-recycling/
Le dépôt de cette expérimentation : https://github.com/robomatix/phaser-getFirstExists-for-recycling.
L’exemple officiel : http://examples.phaser.io/_site/view_full.html?d=groups&f=recycling.js&t=recycling
La documentation officielle, toujours bonne à lire
http://docs.phaser.io/Phaser.Group.html#getFirstExists
http://docs.phaser.io/Phaser.Sprite.html#reset
http://docs.phaser.io/Phaser.Sprite.html#checkWorldBounds
http://docs.phaser.io/Phaser.Sprite.html#outOfBoundsKill
Répondre à cet article
Tous les champs sont obligatoires
Suivre les commentaires :
|
