在Swift中管理内存(SceneKit游戏)

时间:2016-03-08 18:09:04

标签: ios swift

在我的GameViewController中,我有这个代码初始化游戏:

scnView = SCNView(frame: self.view.frame)
    scnView.backgroundColor = UIColor(red: 100.0/255.0, green: 149.0/255.0, blue: 237.0/255.0, alpha: 1.0)
    scnView.showsStatistics = true
    scnView.antialiasingMode = SCNAntialiasingMode.Multisampling2X
    scnView.overlaySKScene = SKScene(size: self.view.bounds.size)
    scnView.playing = true
    self.view.addSubview(scnView)
    self.view.sendSubviewToBack(scnView)

    // Set up the scene
    let scene = GameScene(view: scnView, delegate: self)
    scene.rootNode.hidden = true
    scene.physicsWorld.contactDelegate = scene

    // start playing the scene
    scnView.scene = scene
    scnView.delegate = scene
    scnView.scene!.rootNode.hidden = false
    scnView.play(self)

它设置场景和环境。当我调用它时,内存使用量达到40MB并保持不变。当我结束游戏时,我运行此代码:

self.scnView.removeFromSuperview()
self.scnView = nil
self.initializeGame()

我删除视图并从头开始重新启动游戏。然而,内存分配增加到70MB并且越多,我就越多。我尝试在GameControllerView中移动我的.dae文件分配,以便只调用一次代码:

static let HomeLifeguard_1 = SCNScene(named: String(format: "assets.scnassets/Models/HomeLifeguard_1.dae"))

我尝试使用deinit {}并将我的大多数变量设置为nil,但没有任何变化。我不明白什么是记忆。不应该scnView = nil自动释放内存吗?

1 个答案:

答案 0 :(得分:1)

我也遇到相同的情况,并且找到了解决该错误的解决方案。您必须异步删除和释放scnView。只需看下面的代码即可。

    _scnView.antialiasingMode = SCNAntialiasingModeNone;
    __block SCNView *strongScnView = _scnView;
    _scnView = nil;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [strongScnView setScene:nil];
            [strongScnView removeFromSuperview];
            [strongScnView stop:nil];
            strongScnView = nil;
        });