通过UIViewRepresentable调整SCNView大小时出现内存问题?

时间:2020-06-14 13:54:55

标签: swift memory-leaks swiftui scenekit metal

在我的项目中,我将SCNView封装在UIViewRepresentable中,该高度应根据另一视图的DragGesture调整高度。

问题是在拖动时或拖动手势结束后,内存使用量异常高。在Instruments中检查内存泄漏是否没有泄漏。它也仅在物理设备中发生,而不在模拟器中发生。

使用模拟器时,

simulator mem use 不论是否调整大小,内存使用量都稳定在19MB左右。

使用物理设备时,

physical memory use 每次重新调整大小时,内存使用量都会急剧增加,并且在结束后不会下降。 (最糟糕的是,在崩溃之前,我看到的内存使用量约为1.9GB。) 这里的任何专家都知道发生这种情况的原因以及如何解决?预先感谢。

更新:我注意到DragGesture结束后,如果我要移动SCNView的摄像机,则内存将恢复为正常值。

这里是主ContentView的代码。
基本上是一个拆分视图布局,如果要调整RoundedRectangle(用作句柄),则顶视图和底视图将调整大小。正是在调整大小时会导致内存高峰问题,最坏的情况是会导致崩溃和Message from debugger: Terminated due to memory issue

        VStack {
            SceneView()
                .frame(height: (UIScreen.main.bounds.height / 2) + self.gestureTranslation.height)
            RoundedRectangle(cornerRadius: 5)
            .frame(width: 40, height: 6)
            .foregroundColor(Color.gray)
            .padding(2)
            .gesture(DragGesture(coordinateSpace: .global)
                    .onChanged({ value in
                        self.gestureTranslation = CGSize(width: value.translation.width + self.prevTranslation.width, height: value.translation.height + self.prevTranslation.height)

                    })
                    .onEnded({ value in
                        self.gestureTranslation = CGSize(width: value.translation.width + self.prevTranslation.width, height: value.translation.height + self.prevTranslation.height)

                        self.prevTranslation = self.gestureTranslation
                    })
            )
            Rectangle()
                .fill(Color.green)
                .frame(height: (UIScreen.main.bounds.height / 2) - self.gestureTranslation.height)
        }
    }

这里有SCNView的UIViewRepresentable包装器的代码。

struct SceneView: UIViewRepresentable {

    typealias UIViewType = SCNView

    func makeUIView(context: Context) -> SCNView {
        let scene = SCNScene(named: "SceneAssets.scnassets/Cube.scn")
        let view = SCNView()

        view.scene = scene

        view.allowsCameraControl = true
        view.defaultCameraController.interactionMode = .orbitTurntable
        view.defaultCameraController.inertiaEnabled = true

        return view
    }

    func updateUIView(_ uiView: SCNView, context: Context) {

    }

}

这是我用来描述问题的完整测试项目:https://github.com/vincentneo/swiftui-scnview-memory-issue

0 个答案:

没有答案