2015-07-17 2 views
0

Это мой код. Я предполагаю это потому, что deinit никогда не вызывается, и каждый раз, когда пользователь начинает играть (GameScene), память перескакивает с 20 до 40 МБ на 60 и т. Д., А FPS падает каждый раз, когда пользователь умирает и перезапускает игру.SKScene становится медленнее после каждого перезапуска

Кто-нибудь знает, почему?

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) 
    } 


} 

И есть модальный переход обратно в GameViewController от кнопки в GameOverViewController (созданной в раскадровку).

+0

Вы пытаетесь представить новую 'SKScene'? – ABakerSmith

+0

Посмотрите, если это ваша проблема. http://stackoverflow.com/q/30892837/2158465 –

+0

@ABakerSmith Нет, мы не являемся. Мы пытаемся представить GameOverViewController из SKScene. – DHShah01

ответ

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];  
} 
+0

Привет, большое спасибо за ответ. Вы знаете какой-либо способ сделать это, и представить UIViewController? (или конвертировать его UIViewController в SKScene - так или иначе?) Еще раз спасибо! – dannybess

Смежные вопросы