iOS 7 Sprite Kit de libérer de la mémoire
Je suis la construction d'un jeu pour iOS qui vise pour le nouvel iOS 7 et Sprite Kit, à l'aide de l'émetteur de nœuds et de la physique pour améliorer le gameplay. Alors que le développement de l'application, j'ai couru dans un grave problème: vous pouvez créer vos scènes, des nœuds, des effets, mais lorsque vous avez terminé et nous devons retourner à l'écran principal, comment vous libérer toute la mémoire allouée par ces ressources?
Idéalement ARC doit se libérer de tout, et la demande devrait revenir à la consommation de mémoire de niveau qu'il avait avant la création de la scène, mais ce n'est pas ce qui se passe.
J'ai ajouté le code suivant, que la méthode dealloc de la vue, qui tire la scène et est responsable de la suppression de tout une fois fermé (supprimé):
- (void) dealloc
{
if (scene != nil)
{
[scene setPaused:YES];
[scene removeAllActions];
[scene removeAllChildren];
scene = nil;
[((SKView *)sceneView) presentScene:nil];
sceneView = nil;
}
}
- sceneView est une UIView, qui est le conteneur de la scène
- scène est une extension de la SKScene classe, création de tous les SKSpriteNode objets
Je serais très reconnaissant de toute aide à ce sujet.
- Même problème ici, ma scène continue de fonctionner même lorsque j'appelle dismissViewControllerAnimated, avez-vous réussi à le résoudre?
- Oui, je l'ai fait, il n'y avait rien que je puisse faire de la scène ou de Sprite Kit pour la matière, j'ai tout simplement besoin de retirer de la scène et de la vue contenant complètement de la vue parent, couper tous ses liens vers les autres parties du système, pour que la mémoire pour être libéré ainsi.
Vous devez vous connecter pour publier un commentaire.
J'ai eu beaucoup de problèmes de mémoire avec Sprite Kit, et j'ai utilisé un tech ticket de support pour obtenir des informations, et il peut se rapporter ici. Je me demande si à partir d'une nouvelle SKScene totalement libérer toute la mémoire de la précédente utilisée. J'ai trouvé ceci:
La sous-tendent la mémoire allouée par +textureWithImageNamed: peut (généralement) être libéré lors du passage à la nouvelle SKScene. Vous ne pouvez pas compter sur cela. iOS libère la mémoire cache de +textureWithImageNamed: ou +imageNamed: quand elle le juge nécessaire, par exemple lorsqu'il détecte une condition de mémoire insuffisante.
Si vous voulez la mémoire libérée dès que vous avez terminé avec les textures, vous devez éviter l'utilisation de +textureWithImageNamed:/+imageNamed:. Une alternative pour créer des SKTextures est: d'abord créer UIImages avec +imageWithContentsOfFile: et puis créer SKTextures résultant de la UIImage objets en appelant SKTexture/+textureWithImage:(UIImage*).
Je ne sais pas si cela aide ici.
Tous que le code est superflu. À condition que vous n'avez pas de fuites de mémoire ou de conserver des cycles dans votre code, une fois que vous relâchez le Sprite Kit de vue, tout sera effacé de la mémoire.
Sous le capot Sprite Kit utilise un mécanisme de mise en cache, mais nous n'avons aucun moyen de le contrôler, ni ne doit, nous devons, si elle est correctement mise en œuvre (ce qui est sûr de supposer).
Si ce n'est pas ce que vous voyez dans les Instruments case pour conserver les cycles, les fuites. Vérifiez que dealloc de la scène et de point de vue n'est appelée. Assurez-vous qu'aucune des références fortes à vue, une scène ou d'autres nœuds restent dans d'autres objets (en particulier les singletons et les variables globales).
Après la lutte contre ce pour un couple de jours, la clé était en fait:
[sceneView presentScene:nil];
Ou pour Swift:
sceneView.presentScene(néant)
qui peut être fait dans viewDidDisappear. Sans cela, votre vue va s'accrocher à la scène pour la vie chère, même après avoir été rejeté, et de continuer à mâcher de la mémoire.
Swift 3:
Dans mon expérience personnelle, je l'ai résolu avec l'aide de l'Xcode instruments, tout d'abord avec le moniteur d'activité qui m'a montré tout de suite l'énorme augmentation de la mémoire, de l'affectation et de fuites.
Mais il est également un moyen utile, la console de débogage avec
C'est une autre aide pour voir si
deinit
a été appelé à chaque fois que vous souhaitez supprimer une scène.Vous de ne jamais avoir de solides références à la
scene
ouparent
dans vos classes, si vous avez quelqu'un que vous devez trasform à faibles comme par exemple:Même chose pour le protocole, vous pouvez le déclarer à faibles comme cet exemple d'utilisation de la propriété
class
:ARC faire tout le travail, nous avons besoin de mais, si vous pensez que vous avez oublié d'écrire correctement certains biens (initiliazation, blocs..) j'ai utilisé également quelques fonctions comme ce pour mon debug phases :
J'ai eu un problème semblable à vous @user2857148.
Je voudrais présenter un VC avec:
Dans le
@implementation myViewController
j'ai eu :Le problème était :
depuis dans :
parentVC a été déclarée avec un fort :
Solution 1:
et la modifier pour :
résolu le problème pour moi.
Explication:
La référence à la parentVC (
myViewController
) qui a été unUIViewController
a été stocké quelque part. Depuis ce CR a une référence forte à la SKScene , il se trouvait avec elle. J'ai même eu de la console de sortie de cette SKScene comme il était toujours actif. Mon meilleur quess sur les raisons de ce qui m'est arrivé que j'ai de fortes présomptions.Solution 2:
Dans mon
myViewController
sous :J'ai appelé :
Lors du départ de l'actuelle VC (
myViewController
) j'ai mis le pointeur à zéro, le retrait de la mémoire et tout le long avec elle.Ces 2 solutions ont fonctionné pour moi. Je l'ai testé avec le débogueur. La consommation de mémoire est allé en haut et en bas correctement.
Espère que cela aide à la compréhension du problème et des solutions.
Essayer de garder le sceneView avant de retirer de la scène.
Il a pris des mesures, mais j'ai complètement résolu mon problème:
1) Dans Mon ViewControl, j'ai créé une méthode pour forcer les détruire tous les enfants:
2) Depuis, j'avais créé un protocole fort dans ma Scène, qu'il mentionne dans mon ViewControl et ma scène était fort aussi, j'ai détruit toutes les références de la manière suivante: