在swift中,移除场景后如何使内存恢复正常?
我用SpriteKit创建了一个简单的游戏,但是每次我运行游戏时,模拟器中的内存使用量都会增加大约30mb,但在游戏结束时,内存使用量不会减少 当我运行游戏超过十次时,模拟器变得越来越慢,最终崩溃 在这个简单的游戏中,我有两个控制器和一个游戏场景: MainController通过触发的按钮调用GameViewController 在GameViewController中,游戏场景的初始化方式如下:在swift中,移除场景后如何使内存恢复正常?,swift,memory,sprite-kit,skscene,Swift,Memory,Sprite Kit,Skscene,我用SpriteKit创建了一个简单的游戏,但是每次我运行游戏时,模拟器中的内存使用量都会增加大约30mb,但在游戏结束时,内存使用量不会减少 当我运行游戏超过十次时,模拟器变得越来越慢,最终崩溃 在这个简单的游戏中,我有两个控制器和一个游戏场景: MainController通过触发的按钮调用GameViewController 在GameViewController中,游戏场景的初始化方式如下: class GameViewController: UIViewController {
class GameViewController: UIViewController
{
var skView:SKView!
var scene:GameScene!
override func viewDidLoad() {
super.viewDidLoad()
scene = GameScene(size: view.bounds.size)
skView = view as SKView
skView.ignoresSiblingOrder = true
scene.scaleMode = .ResizeFill
scene.viewController = self
skView.presentScene(scene)
}
//with a prepareForSegue deinitialises the scene and skview:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "GameFinished"{
scene.removeAllActions()
scene.removeAllChildren()
scene.removeFromParent()
scene = nil
skView.presentScene(nil)
skView = nil
let target = segue.destinationViewController as MainController
}
}
}
在游戏场景中,viewController是一个属性
var viewController:GameViewController? = GameViewController()
segue通过以下方式触发:
self.viewController!.performSegueWithIdentifier("GameFinished", sender: nil)
我还尝试在游戏场景中将移除方法放入Denit中:
deinit{
self.removeAllActions()
self.removeAllChildren()
}
仍然不起作用您的
游戏视图控制器
强烈引用了您的游戏场景
。您的游戏场景
强烈引用了您的游戏视图控制器
。这将导致一个强大的引用循环,这意味着两个对象都不会被释放
您需要将游戏场景中的viewController属性声明为弱
weak var viewController:GameViewController? = GameViewController()
使用Swift 3、Xcode 8和iOS 10。
在避免强引用、处理SKTextures等之后,在关闭场景并返回“菜单”viewController后,内存级别没有恢复。
我使用的是:
override func sceneDidLoad() {...}
这在iOS 10中是可用的,但我想要iOS 8和9的兼容性,这就是为什么我
已更改为旧版本:
override func didMove(to view: SKView) {...}
除了与较旧的iOS版本兼容外,在关闭场景后,内存级别也会下降。这是一个惊喜。我可能漏掉了一些漏洞,但它对我有用。
我希望它能帮助别人 运行仪器并检查内存泄漏。不到30分钟前我也遇到过同样的问题。原来我有内存泄漏,所以我将我的视图和场景属性设置为“弱”,它消除了泄漏问题,但我不确定这是否是最好的方法。好的,我在游戏结束后使用dismissViewControllerAnimated而不是PerformsgueWithIdentifier,没有removeAllChildren和removeAllActions方法,它似乎“起作用”。。。每次游戏启动时,记忆都会以非常小的数量增加……怎么会发生这种情况?@FanZhang你能解释一下你是怎么做到的吗?我现在也遇到了同样的问题,我真的希望能得到解决…没什么特别的,只是在GameSecene:weak var viewController:GameViewController中实例化GameViewController?=GameViewController(),并在游戏结束时运行self.viewController?.dismissViewControllerAnimated(true,完成:nil)。谢谢!我的viewcontroller对SKView的引用已经很弱了,但是在我的SKScene中,对它所在的viewcontroller有一个很强的引用,通过创建一个弱var,我的内存使用率在弹出后又下降了。哇,这真是一个巨大的不同!这应该被标记为这个问题的正确答案。你能创建一个最小的可验证的例子来证明这个漏洞吗?@Whirlwind抱歉,我已经尝试过了,但我无法做到这一点。泄漏工具显示了一些与“SKAction.animate”相关的泄漏,我还没有解决。我原以为这就是问题所在,但现在,只有改为“didMove”时,内存问题才消失了。