ios - tutorial - swift game



Augmentation de la mémoire dans SpriteKit même si removeAllChildren appelé (1)

Vous avez déjà trouvé le problème:

Deinit n'est pas appelé après qu'une scène a changé.

Si quand une scene change, le deinit de l'ancienne scène n'est pas appelé alors c'est le problème. Cela signifie que la vieille scène est toujours en mémoire.

Cela arrive probablement parce que vous avez un fort cycle de rétention . Cela signifie qu'un enfant (ou un enfant d'un enfant ...) de votre scène a une forte référence à la scène elle-même.

Vous devez trouver cette référence et la déclarer avec le mot clé weak .

https://code.i-harness.com

J'ai essayé de réparer une énorme augmentation de mémoire dans SpriteKit pendant plusieurs semaines maintenant mais n'ai trouvé aucune solution. J'ai essayé à peu près toutes les méthodes que j'ai rencontrées en ligne pour gérer la mémoire en SK mais j'ai encore des problèmes. Voici ma situation:

Je présente d'abord le SKScene "HomeScreen" et à partir de là, je change les scènes de page avec un UIButton dans mon contrôleur de vue comme ceci:

 func nextPage(sender: UIButton) {

    pageNumber = pageNumber + 1

    let switchPage = SKTransition.crossFadeWithDuration(3.0)
    switchPage.pausesOutgoingScene = false

    switch pageNumber {
    case 1: self.skView.presentScene(Page01(size: (self.view?.bounds.size)!), transition: switchPage)
    case 2: self.skView.presentScene(Page02(size: (self.view?.bounds.size)!), transition: switchPage)
    case 3: self.skView.presentScene(Page03(size: (self.view?.bounds.size)!), transition: switchPage)
    case 4: self.skView.presentScene(Page04(size: (self.view?.bounds.size)!), transition: switchPage)
    case 5: self.skView.presentScene(Page05(size: (self.view?.bounds.size)!), transition: switchPage)
    case 6: self.skView.presentScene(Page06(size: (self.view?.bounds.size)!), transition: switchPage)
    case 7: self.skView.presentScene(Page07(size: (self.view?.bounds.size)!), transition: switchPage)
    case 8: self.skView.presentScene(Page08(size: (self.view?.bounds.size)!), transition: switchPage)
    case 9: self.skView.presentScene(Page09(size: (self.view?.bounds.size)!), transition: switchPage)
    case 10: self.skView.presentScene(Page10(size: (self.view?.bounds.size)!), transition: switchPage)
    case 11: self.skView.presentScene(Page11(size: (self.view?.bounds.size)!), transition: switchPage)
    default:
        break
    }
}

Et voici mon graphique de la mémoire de Xcode:

Comme vous pouvez le voir, ma mémoire pour HomeScreen (HS) commence à 38.1 et au moment où j'ai parcouru toutes les scènes et revenir à l'écran d'accueil, il se termine à 112. J'ai également chargé chaque page individuellement et enregistré la mémoire pour confirmer l'augmentation.

Dans chaque SKScene, je charge différents objets puis dans willMoveFromView je les supprime comme suit:

    override func willMoveFromView(view: SKView) {

    //Remove the Scroller Components
    self.view?.removeGestureRecognizer(self.page01Drops.panGestureRecognizer)
    self.page01Drops = nil

    //Remove Environment
    self.randomObjectFromScene.texture = nil

    self.anotherRandomObject.removeFromParent

    self.removeAllActions()
    self.removeAllChildren()
}

Voici un peu plus d'informations: - Deinit n'est pas appelé après qu'une scène change.

  • Je n'ai aucune fuite lors du test de l'application avec Instruments.

  • Tous les SKTextures sont d'abord chargés en UIImages en utilisant stringByAppendingPathComponent.

  • Toutes les méthodes willMoveFromView contiennent removeAllActions et removeAllChildren.

Est-ce que quelqu'un sait pourquoi ma mémoire augmente?

Mettre à jour un peu plus de code

Voici comment je charge mon skView dans viewDidLoad:

    skView = view as! SKView
    skView.showsFPS = true
    skView.showsNodeCount = true
    skView.ignoresSiblingOrder = false
    skView.presentScene(homeScreen(size: skView.bounds.size))

Et voici un peu de ma Page01 SKScene:

class Page01: SKScene {
    //Preload Textures
    let aaronHead01Texture = SKTexture(image: UIImage(contentsOfFile:NSBundle.mainBundle().resourcePath!.stringByAppendingPathComponent("P01_head01.png"))!)
    let aaronHead02Texture = SKTexture(image: UIImage(contentsOfFile:NSBundle.mainBundle().resourcePath!.stringByAppendingPathComponent("P01_head02.png"))!)
    //more textures for body parts of character that will be changed

    var aaronHead: SKSpriteNode!
    //More SKSpriteNodes for other body parts

    override init(size: CGSize){
        super.init(size: size)

        self.aaronHead = SKSpriteNode(texture: self.aaronHead01Texture)
        self.aaronHead.anchorPoint = CGPoint(x: 0.5, y: 0.1)
        self.aaronHead.position = CGPoint(x: 10, y: 284)
        self.aaronHead.zPosition = 1.0
        self.aaronBody.addChild(aaronHead)

    }




sprite-kit