在我的项目中,我将SCNView
封装在UIViewRepresentable
中,该高度应根据另一视图的DragGesture
调整高度。
问题是在拖动时或拖动手势结束后,内存使用量异常高。在Instruments中检查内存泄漏是否没有泄漏。它也仅在物理设备中发生,而不在模拟器中发生。
使用模拟器时,
使用物理设备时,
每次重新调整大小时,内存使用量都会急剧增加,并且在结束后不会下降。 (最糟糕的是,在崩溃之前,我看到的内存使用量约为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