【问题标题】:SKScene getting slower after every restartSKScene 每次重启后都会变慢
【发布时间】:2015-07-17 03:14:36
【问题描述】:

这是我的代码。我假设这是因为 deinit 从未被调用,并且每次用户开始玩(GameScene)时,内存都会从 20 MB 跳到 40 MB 到 60 等,并且每次用户死亡并重新启动游戏后 FPS 都会下降。

有人知道为什么吗?

GameViewController.swift
import UIKit
import SpriteKit

extension SKNode {
    class func unarchiveFromFile(file : NSString) -> SKNode? {
        if let path = NSBundle.mainBundle().pathForResource(file as String, ofType: "sks") {
            var sceneData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)!
            var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)

            archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
            let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as! GameScene
            archiver.finishDecoding()
            return scene
        } else {
            return nil
        }
    }
}


class GameViewController: UIViewController{

    @IBOutlet var skSceneReal: SKView!


    override func viewDidLoad() {
        super.viewDidLoad()

    }
    override func viewWillAppear(animated: Bool) {
        if((self.skSceneReal) != nil)
        {
            if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
                // Configure the view.
                var skView = self.view as! SKView
                skSceneReal.showsFPS = false
                skSceneReal.showsNodeCount = false

                /* Sprite Kit applies additional optimizations to improve rendering performance */
                skSceneReal.ignoresSiblingOrder = true
                /* Set the scale mode to scale to fit the window */
                scene.scaleMode = .AspectFill
                scene.viewController = self
                skSceneReal.presentScene(scene)
            }

        }
    }

    deinit
    {
        println("deinit worked")
    }

    override func viewWillDisappear(animated: Bool) {
        self.skSceneReal.removeFromSuperview()
        self.skSceneReal = nil;
    }

    override func shouldAutorotate() -> Bool {
        return true
    }

    override func supportedInterfaceOrientations() -> Int {
        if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
            return Int(UIInterfaceOrientationMask.AllButUpsideDown.rawValue)
        } else {
            return Int(UIInterfaceOrientationMask.All.rawValue)
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Release any cached data, images, etc that aren't in use.
    }

    override func prefersStatusBarHidden() -> Bool {
        return true
    }




}


GameScene.swift
...
var gameEnding = false;
func gameOver(){
    if(!gameEnding) {
        gameEnding = true;
        // Deallocate/reset the view/scene.
        // ???? DONT KNOW WHAT TO DO ????
        // Present move segue.(Created in storyboard) Source: GameVC, Destination: GameOverVC
        self.viewController?.performSegueWithIdentifier("move", sender: self)
    }


}

还有一个从 GameOverViewController 中的按钮返回到 GameViewController 的模态转换(在 Storyboard 中创建)。

【问题讨论】:

  • 您是否要展示一个新的SKScene
  • 看看这是否是您的问题。 stackoverflow.com/q/30892837/2158465
  • @ABakerSmith 不,我们不是。我们正在尝试从 SKScene 呈现 GameOverViewController。
  • @EpicByte 感谢您的参考,但我们已经看过并尝试过,但无济于事。不过再次感谢!

标签: ios swift memory-management sprite-kit skscene


【解决方案1】:

我遇到了同样的问题。我通过将场景中的所有节点清空来修复它,而不是显示 UIViewController,而是显示另一个 SKScene。这似乎解决了问题并正确释放了 GameScene。

这是我的游戏结束方法:

- (void) gameOver {
    [self removeAllActions];
    [self removeAllChildren];


    SKTransition *reveal = [SKTransition flipHorizontalWithDuration:0.5];

    SKScene *newScene;
        newScene = [[GameOverScene alloc] initWithSize:self.size andNewHighscore:score];


    [self.view presentScene:newScene transition: reveal];    
}

【讨论】:

  • 您好,非常感谢您的回答。你知道有什么方法可以做到这一点,并提供一个 UIViewController 吗? (或者将它的 UIViewController 转换为 SKScene - 不知何故?)再次感谢!
猜你喜欢
  • 2018-01-29
  • 1970-01-01
  • 2021-01-18
  • 2011-10-11
  • 2023-03-24
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多