SpriteKit那些让我神伤的坑(1):我的内存被狗吃了吗?
我说过要进军游戏开发领域。
于是我就做了。
Swift是iOS开发的未来,所以这次我选择基于 Swift而不是OC。之前做过一些准备,所以上手Swift并不难。
考虑到SpriteKit已经被Xcode直接支持,于是顺手也就上了SpriteKit。不过使用SpritKit的经历可不愉快。一路用下来,坑太多。
今天就说其中一个吧。
在使劲对游戏做压力测试的时候(使劲玩自己的游戏!!)的时候,我发现游戏越来越慢。
果然监控之!不看不知道,一看吓一跳:
这是什么鬼?内存居然不断自己增长,哪怕什么都没做。
我的内存被狗吃了吗?
我开始了寻找失去的内存。仔细检查每一处可能出现的地方,确保创建的对象不用的时候可以释放。
根据以前的经验,尤其是放在容器或数组中的对象。
找了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天呢。
你真是赚大了,呵呵~