iOS过坑技巧iOS 学习笔记程序员

SpriteKit那些让我神伤的坑(1):我的内存被狗吃了吗?

2016-02-17  本文已影响969人  MarkNote

我说过要进军游戏开发领域。
于是我就做了。
Swift是iOS开发的未来,所以这次我选择基于 Swift而不是OC。之前做过一些准备,所以上手Swift并不难。
考虑到SpriteKit已经被Xcode直接支持,于是顺手也就上了SpriteKit。不过使用SpritKit的经历可不愉快。一路用下来,坑太多。

今天就说其中一个吧。
在使劲对游戏做压力测试的时候(使劲玩自己的游戏!!)的时候,我发现游戏越来越慢。
果然监控之!不看不知道,一看吓一跳:

memory.jpg

这是什么鬼?内存居然不断自己增长,哪怕什么都没做。
我的内存被狗吃了吗?
我开始了寻找失去的内存。仔细检查每一处可能出现的地方,确保创建的对象不用的时候可以释放。
根据以前的经验,尤其是放在容器或数组中的对象。
找了2天,毫无结果。除了一个发现:使用Instrument分析的时候发现内存泄漏的地方似乎是SpriteKit自己的循环中,和我自己的代码一点关系都没有。

我开始拿出大招...
这个大招我平时根本不用,不是不好用,而是好用但是累,这个大招好比金庸所描写的七伤拳:杀敌一千,自损八百
这个大招就是:一块块的注释掉代码,逐块排查
这个大招真是大招,大招一上我累的够呛。不过在折腾之后终于有了结果。在ViewController中

override func viewDidLoad() {
  super.viewDidLoad()
  
  if let scene = GameScene(fileNamed:"GameScene") {
   // Configure the view.
   let skView = self.view as! SKView
   #if (arch(i386) || arch(x86_64))
    skView.showsFPS = true
    skView.showsNodeCount = true
   #else
    skView.showsFPS = false
    skView.showsNodeCount = false
   #endif
   
   skView.showsPhysics = true
   skView.ignoresSiblingOrder = true   
   scene.scaleMode = .AspectFill
   skView.presentScene(scene)
  }
 }

当我注掉下面这一行的时候,内存终于不再自动增长:

skView.showsPhysics = true

顺手查了一下,不少人遇到这个问题,比如:
http://stackoverflow.com/questions/34846482/memory-leak-for-showsphysics
很显然,这是SpriteKit的一个大大的bug。
关键是开始的时候谁会想得到呢?
好吧,这个问题耗费了我大约3天的宝贵生命。如果你看到了我的这段文字,说不定你将来就不用这样耗费3天呢。
你真是赚大了,呵呵~

上一篇下一篇

猜你喜欢

热点阅读