SpriteKitゲームを含むアプリケーションを開発しています。ゲームを終了した後のSpriteKit保持メモリ
私はモーダルプレゼンテーションを使用してビューコントローラからゲームを提示しています:私が気づいたことは、私が起動し、ゲームを閉じた後、メモリは以下のグラフに示すように増加し続けるということです。だから問題は: シーンをメモリから完全に削除する方法はありますか?
View Controllerの閉じるボタンをタップして閉じます。 scene.quitGame()
メソッドは、基本的にすべてのノードやアクションなどを解放します。理想的な世界では、SKScene
を完全に取り除く魔法のコマンドがあるので、それを行う必要はありません。
@IBAction func quit(_ sender: UIButton) {
scene.quitGame()
scene.removeFromParent()
self.removeFromParentViewController()
self.dismiss(animated: true, completion: nil)
scene = nil
}
編集:私は次のコードでのviewDidLoadからシーンを提示:
scene = GameScene(size: view.bounds.size)
let skView = view as! SKView
skView.showsFPS = false
skView.showsNodeCount = false
skView.ignoresSiblingOrder = true
scene.scaleMode = .resizeFill
if let heroImage2 = heroImage2, let myImage = myImage, let monsterImage = monsterImage{
scene.addPicture(img: heroImage2, myImage: myImage,monsterImage: monsterImage, bigMonsterImage: bigMonsterImage!)
}
skView.presentScene(scene)
scene.viewController = self
EDIT 2 - 私は永遠にアクションを繰り返しを含み、このメソッドの呼び出しをコメントアウトし、漏れが行くように見えます離れて
func createHerosAction(duration: Double = 5.0){
run(SKAction.repeatForever(
SKAction.sequence([
SKAction.run(addHero),
SKAction.wait(forDuration: duration)
])
), withKey:"createHeros")
}
func addHero() {
// Create sprite
if(heroImage == nil){
heroImage = UIImage(named: "hero")
}
let Texture = SKTexture(image: heroImage!)
let hero = SKSpriteNode(texture:Texture)
hero.size.width = size.width * 0.17
hero.size.height = hero.size.width
hero.name = "hero"
hero.zPosition = 2
let heroSide = arc4random_uniform(2)
hero.physicsBody = SKPhysicsBody(rectangleOf: hero.size) // 1
hero.physicsBody?.isDynamic = true // 2
hero.physicsBody?.categoryBitMask = PhysicsCategory.Hero // 3
hero.physicsBody?.contactTestBitMask = PhysicsCategory.Projectile // 4
hero.physicsBody?.collisionBitMask = PhysicsCategory.None // 5
let actualY = random(min: size.height*0.3 + hero.size.height/2 + size.height * 0.12, max: size.height - hero.size.height/2 - size.height * 0.15)
let pointRightOfScreen = CGPoint(x: size.width + hero.size.width/2, y: actualY)
let pointLeftOfScreen = CGPoint(x: -hero.size.width/2, y: actualY)
if(heroSide == 0){
hero.position = pointRightOfScreen
}else{
hero.position = pointLeftOfScreen
}
addChild(hero)
let actualDuration = random(min: CGFloat(2.0), max: CGFloat(5.0))
var actionMove = SKAction()
if(heroSide == 0){
actionMove = SKAction.move(to: pointLeftOfScreen, duration: TimeInterval(actualDuration))
}else{
actionMove = SKAction.move(to: pointRightOfScreen, duration: TimeInterval(actualDuration))
}
let numberOfUpsAndDown = random(min: CGFloat(1.0), max: CGFloat(10.0))
let variance = random(min: CGFloat(-70.0), max: CGFloat(70.0))
let mvHero = moveHeroUpAndDown(node: hero, variance: variance,duration: actualDuration/numberOfUpsAndDown)
let actionMoveDone = SKAction.removeFromParent()
let loseLifeAction = loseLife(node: hero)
hero.run(SKAction.sequence([actionMove, loseLifeAction, actionMoveDone]), withKey: "moveHero")
hero.run(mvHero, withKey: "UpAndDown")
}
EDIT 3:上に呼び出されるこのSKActionにあるようです。この行動を取り除いた後、漏れは止まった。
func loseLife(node: SKSpriteNode) -> SKAction{
let loseALifeAction = SKAction.run(){
if(self.gamePaused == false){
self.playSound(fileName: "losesound.wav")
if(self.lives > 0){
self.updateLives(newValue: self.lives - 1, lostLife: true)
//self.lives -= 1
}
print("lives: \(self.lives)")
if(self.lives <= 0){
print("hit me")
node.run(self.loseGame())
}
}
}
return loseALifeAction
}
このビューコントローラは繰り返し表示され、却下されますか?または、常にView Controllerが起動していますか?シーンは、ビューコントローラが設定しているデリゲートを定義していますか? –
シーンを保持しているビューコントローラーが表示され、閉じられています。 –
私はデリゲートを定義しませんでした。それはどのように機能するのですか? –