如何使用故事板停止当前模式分段上的ARView会话



我有两个包含ARView的ViewController。代码如下:

import UIKit
import RealityKit
import ARKit
class fvBoat: UIViewController, ARSessionDelegate {

@IBOutlet var arView: ARView!

let fvBoatAnchor = try! Vard.loadFvBoatScene()
var imageAnchorToEntity: [ARImageAnchor: AnchorEntity] = [:]


override func viewDidLoad() {
super.viewDidLoad()
fvBoatAnchor.generateCollisionShapes(recursive: true)
let fvBoat = fvBoatAnchor.fvBoatObject as? Entity & HasCollision
arView.installGestures(for: fvBoat!)
arView.scene.addAnchor(fvBoatAnchor)
arView.session.delegate = self
}

func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
anchors.compactMap { $0 as? ARImageAnchor }.forEach {
let anchorEntity = AnchorEntity()
let modelEntity = fvBoatAnchor.fvBoatObject!
anchorEntity.addChild(modelEntity)
arView.scene.addAnchor(anchorEntity)
anchorEntity.transform.matrix = $0.transform
imageAnchorToEntity[$0] = anchorEntity
}
}
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
anchors.compactMap { $0 as? ARImageAnchor }.forEach {
let anchorEntity = imageAnchorToEntity[$0]
anchorEntity?.transform.matrix = $0.transform
}
}
func installGestures(on object:ModelEntity){

object.generateCollisionShapes(recursive: true)
arView.installGestures([.rotation,.scale], for: object)
}
}

两个视图控制器都具有与上面相同的代码。

每当我使用Present Modally segue导航到下一个AR视图时,我的帧速率就会显著下降。当我转到下一个ARview时,如何确保ARview会话关闭?

ViewController 的情节提要视图

也尝试添加此函数,但不确定为什么它不起作用。。。

func leaveScene() {
arView?.session.pause()
arView?.removeFromSuperview()
arView = nil
}

您并没有关闭所有需要关闭的东西。

func leaveScene() {
arView?.session.pause()
arView?.session.delegate = nil
arView?.scene.anchors.removeAll()
arView?.removeFromSuperview()
arView?.window?.resignKey()
arView = nil
}

附言:但是arView不会从内存中释放。

这为我解决了这个问题。使用@Andy的代码,我添加了leaveScene函数,并将其调用为使用UI按钮的发送事件:

@IBAction func leaveScene(_ sender: UIbutton) {
leaveScene()
}

这使我的代码看起来像这样。


import UIKit
import RealityKit
import ARKit
class fvBridge: UIViewController, ARSessionDelegate {

@IBOutlet var arView: ARView!

let fvBridgeAnchor = try! Experience.loadFvBridgeScene()
var imageAnchorToEntity: [ARImageAnchor: AnchorEntity] = [:]


override func viewDidLoad() {
super.viewDidLoad()
fvBridgeAnchor.generateCollisionShapes(recursive: true)
let fvBridge = fvBridgeAnchor.fvBridgeObject as? Entity & HasCollision
arView.installGestures(for: fvBridge!)
arView.scene.addAnchor(fvBridgeAnchor)
arView.session.delegate = self
}

func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
anchors.compactMap { $0 as? ARImageAnchor }.forEach {
let anchorEntity = AnchorEntity()
let modelEntity = fvBridgeAnchor.fvBridgeObject!
anchorEntity.addChild(modelEntity)
arView.scene.addAnchor(anchorEntity)
anchorEntity.transform.matrix = $0.transform
imageAnchorToEntity[$0] = anchorEntity
}
}
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
anchors.compactMap { $0 as? ARImageAnchor }.forEach {
let anchorEntity = imageAnchorToEntity[$0]
anchorEntity?.transform.matrix = $0.transform
}
}
func installGestures(on object:ModelEntity){

object.generateCollisionShapes(recursive: true)
arView.installGestures([.rotation,.scale], for: object)
}
func leaveScene() {
arView?.session.pause()
arView?.session.delegate = nil
arView?.scene.anchors.removeAll()
arView?.removeFromSuperview()
arView?.window?.resignKey()
arView = nil
}

@IBAction func leaveScene(_ sender: Any) {
leaveScene()
}
}

最新更新