web-dev-qa-db-fra.com

Détruire des sprites dans Phaser

J'ai du mal à détruire les sprites dans Phaser.

J'ai un objet JavaScript, appelons-le Block. Block a une propriété Sprite, qui est définie comme suit:

this.Sprite = this.game.add.Sprite(this.x, this.y, 'blocks', this.color);

À un certain moment dans mon code, Block est référencé par deux tableaux différents:

square[0] = Block;
destroy[0] = Block;

Sur un certain cycle Update (), je dois détruire le Sprite, j'utilise donc le code suivant:

square[0].Sprite.destroy(true); //Destroy the Sprite.
square[0] = null; //Remove the reference.

Lors du prochain cycle Update (), lorsque je regarde destroy [0], je m'attendrais à voir:

destroy[0].Sprite: null

Cependant ce que je vois c'est:

destroy[0].Sprite: b.Sprite

Avec les propriétés juste par défaut et définies sur false. Mon souci est que, si je définissais maintenant destroy [0] sur null, qu'adviendrait-il de cet objet Sprite? 

Va-t-il simplement flotter ou sera-t-il automatiquement nettoyé? Devrais-je détruire l'objet Block en premier d'une manière quelconque? différent de kill ()?

Toute pensée à ce sujet sera grandement appréciée.

16
alexania

Différence entre tuer et détruire

Kill est supposé arrêter le rendu, mais l'objet existe toujours. C'est bien si vous voulez créer un objet réutilisable. Vous pouvez créer l'objet à nouveau sans le coût de la création de l'objet à nouveau.

Destroy devrait supprimer l'objet et tout ce qui s'y rapporte. Vous l'utilisez pour envoyer l'objet au récupérateur de place.

Veuillez noter que pour certains objets tels que du texte, vous ne pouvez pas utiliser kill, vous ne pouvez utiliser que destroy

Référence: http://www.html5gamedevs.com/topic/1721-how-to-remove-text/#entry12347

20
Ibnu Triyono

@ibnu est correct. Destroy nukes l'objet, alors que kill interrompt le rendu. Cependant, votre question concerne les fuites de mémoire et la GC. Je ne suis pas un professionnel de la GC, mais voici ce que je pense qui se passe.

//create an object
this.Sprite = this.game.add.Sprite(this.x, this.y, 'blocks', this.color);
//create additional references to the object
square[0] = Block;
destroy[0] = Block;
//destroy the object via Phaser's call. Remove 1/2 reference
square[0].Sprite.destroy(true); //Destroy the Sprite.
square[0] = null; //Remove the reference.

Mais destroy[0].Sprite contient toujours une référence à votre Sprite "détruit". this.Sprite probablement aussi. En effet, la méthode de destruction Phaser supprime uniquement les propriétés spécifiques à Phaser de l'objet. JS est en charge de l'objet générique Garbage Collection . L'objet échappe à cela parce que vous avez toujours des références valides dans la portée. 

Résolvez ce problème en supprimant la référence de la portée destroy[0].Sprite = null ou en attendant que l'état suivant modifie la portée (en supposant que détruire n'est pas une variable statique). Vous n'êtes pas obligé de gérer vous-même les ressources mémoire, JS! = C. Assurez-vous simplement de ne pas leak variables sur différents périmètres.

Qu'est-ce que la récupération de mémoire JavaScript? (bien que je ne pense plus que la commande delete soit recommandée pour GC, ce n'est certainement pas nécessaire dans Phaser)

1
James L.