如何最小化(内存泄漏)ARKit Scene中的应用程序内存,单击返回按钮?

时间:2019-05-09 09:29:41

标签: ios swift memory-leaks scenekit arkit

如何在单击后退按钮后最大程度地减少ARKit Scene中的应用程序内存消耗?

因为每次我在应用程序中打开ARview时,内存使用量都在增加。 当我返回时,它不会释放内存,并且在再次打开ARview之后,内存使用量甚至进一步增加。

class ARViewController: UIViewController, ARSCNViewDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        setupScene()
        setupFocusSquare()
    }

    func setupScene() {
        sceneView.delegate = self
        sceneView.session = session
        sceneView.antialiasingMode = .multisampling4X
        sceneView.automaticallyUpdatesLighting = false
        sceneView.preferredFramesPerSecond = 60
        sceneView.contentScaleFactor = 1.3
        enableEnvironmentMapWithIntensity(25.0)
        if let camera = sceneView.pointOfView?.camera {
            camera.wantsHDR = true
            camera.wantsExposureAdaptation = true
            camera.exposureOffset = -1
            camera.minimumExposure = -1
            camera.maximumExposure = 3
        }
    }

    func setupFocusSquare() {
        focusSquare?.isHidden = true
        focusSquare?.removeFromParentNode()
        focusSquare = FocusSquare()
        sceneView.scene.rootNode.addChildNode(focusSquare!)
        textManager.scheduleMessage("TRY MOVING LEFT OR RIGHT", inSeconds: 5.0, messageType: .focusSquare)
    }
}

1 个答案:

答案 0 :(得分:1)

附带的源代码不足以回答如何准确解决内存泄漏。我将介绍如何检测泄漏的步骤。因此,您可以将此类信息添加到问题中,也可以自己解决问题。

Xcode有几种检测内存泄漏的工具:

  1. 调试内存图。以调试模式启动应用程序。导航至屏幕并返回几次,以增加内存。然后点击调试工具栏上的“调试内存图”按钮。

Debug Memory Graph

因此,您将看到应用程序的当前内存图。尝试在左栏检测到一些异常:

memory graph

也许您将看到很少的视图控制器或场景视图。尝试了解保留此对象的内容,并在需要时使用弱属性。

  1. 通过点击产品->个人资料来使用工具:

Profile

2.1。选择泄漏工具:

Leaks

通过点击“记录”按钮(红色圆圈)来运行该应用程序,并进行若干导航以显示问题并返回。在底部,您将看到一些泄漏(如果有)。按大小对它们进行排序,并在负责图书馆中关注。应该有您的应用名称。

Responsible Library

如果发现有趣的内容,则可以选择该行并查看负责的堆栈跟踪。

2.2使用分配工具:

Allocations

通过点击“录制”按钮(红色圆圈)运行该应用程序。导航到有问题的屏幕,然后点击一次。然后点击标记生成按钮:

Mark Generation

导航到有问题的屏幕,然后再次返回。然后再次单击“标记生成”。再次重复此步骤,您将在底部看到三代:

Generations

因此,您将看到哪些对象在前进和后退之间保持活动状态。您可以扩展例如Generation B并查看保留了哪个对象。通过单击某些行,您将看到负责的代码。

根据前面步骤的结果,您可能会了解问题出在哪里,并添加一些代码来解决某些对象的保留周期或不必要的保留。