如何解决世界跟踪性能受到资源限制的影响
我制作了一个可以跟踪手部位置并根据手指位置移动 AR 对象的应用程序。主要方法使用视觉框架。代码运行没有任何问题,但是在相机中检测到手的瞬间,程序在正常运行之前冻结了近一秒钟。这是我称之为视觉框架的代码。
// MARK: - SCNSceneRendererDelegate
func renderer(_ renderer: SCNSceneRenderer,didRenderScene scene: SCNScene,atTime time: TimeInterval) {
updateCoreML()
}
这是控制台日志中的输出。每当我重新启动应用程序时,都会打印出来。
=================================================================
Main Thread Checker: UI API called on a background thread: -[UIView bounds]
PID: 4771,TID: 5232327,Thread name: com.apple.scenekit.scnview-renderer,Queue name: com.apple.scenekit.renderingQueue.ARSCNView0x106705f90,QoS: 33
Backtrace:
4 AR_1 0x00000001029146b4 $s4AR_114ViewControllerC12updateCoreMLyyF + 11688
5 AR_1 0x0000000102917a0c $s4AR_114ViewControllerC8renderer_14didRenderScene6atTimeySo16SCNSceneRenderer_p_So0J0CSdtF + 72
6 AR_1 0x0000000102917a74 $s4AR_114ViewControllerC8renderer_14didRenderScene6atTimeySo16SCNSceneRenderer_p_So0J0CSdtFTo + 92
7 SceneKit 0x00000001e0d578f0 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 1505520
8 SceneKit 0x00000001e0dde3d4 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 2057172
9 SceneKit 0x00000001e0c56040 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 450624
10 SceneKit 0x00000001e0c5785c EC930BC7-1D62-3C34-AE79-B49A41F6198E + 456796
11 SceneKit 0x00000001e0d5d010 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 1527824
12 SceneKit 0x00000001e0d5d87c EC930BC7-1D62-3C34-AE79-B49A41F6198E + 1529980
13 SceneKit 0x00000001e0d5de20 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 1531424
14 SceneKit 0x00000001e0d5e204 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 1532420
15 SceneKit 0x00000001e0e009a0 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 2197920
16 SceneKit 0x00000001e0cb5958 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 842072
17 SceneKit 0x00000001e0dc9be0 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 1973216
18 libdispatch.dylib 0x00000001030a56c0 _dispatch_client_callout + 20
19 libdispatch.dylib 0x00000001030b5f14 _dispatch_lane_barrier_sync_invoke_and_complete + 176
20 SceneKit 0x00000001e0dc9b64 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 1973092
21 GPUToolsCore 0x00000001032a4f44 -[DYDisplayLinkInterposer forwardDisplayLinkCallback:] + 172
22 QuartzCore 0x00000001afc8b6fc 8510F139-0824-3686-A9AA-3E198539A021 + 83708
23 QuartzCore 0x00000001afd64a80 8510F139-0824-3686-A9AA-3E198539A021 + 973440
24 CoreFoundation 0x00000001ac910dd0 727F2644-EB4E-3D57-BC2E-E6803BA92366 + 511440
25 CoreFoundation 0x00000001ac935fe8 727F2644-EB4E-3D57-BC2E-E6803BA92366 + 663528
26 CoreFoundation 0x00000001ac935378 727F2644-EB4E-3D57-BC2E-E6803BA92366 + 660344
27 CoreFoundation 0x00000001ac92f08c 727F2644-EB4E-3D57-BC2E-E6803BA92366 + 635020
28 CoreFoundation 0x00000001ac92e21c CFRunLoopRunSpecific + 600
29 Foundation 0x00000001adbdddf0 7698BF3E-0CF6-31C0-85E9-562714F01276 + 36336
30 SceneKit 0x00000001e0cb5ea4 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 843428
31 SceneKit 0x00000001e0cb61bc EC930BC7-1D62-3C34-AE79-B49A41F6198E + 844220
32 libsystem_pthread.dylib 0x00000001f8467cb0 _pthread_start + 320
33 libsystem_pthread.dylib 0x00000001f8470778 thread_start + 8
2021-03-04 20:42:49.062465+0900 AR_1[4771:5232327] [reports] Main Thread Checker: UI API called on a background thread: -[UIView bounds]
PID: 4771,QoS: 33
Backtrace:
4 AR_1 0x00000001029146b4 $s4AR_114ViewControllerC12updateCoreMLyyF + 11688
5 AR_1 0x0000000102917a0c $s4AR_114ViewControllerC8renderer_14didRenderScene6atTimeySo16SCNSceneRenderer_p_So0J0CSdtF + 72
6 AR_1 0x0000000102917a74 $s4AR_114ViewControllerC8renderer_14didRenderScene6atTimeySo16SCNSceneRenderer_p_So0J0CSdtFTo + 92
7 SceneKit 0x00000001e0d578f0 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 1505520
8 SceneKit 0x00000001e0dde3d4 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 2057172
9 SceneKit 0x00000001e0c56040 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 450624
10 SceneKit 0x00000001e0c5785c EC930BC7-1D62-3C34-AE79-B49A41F6198E + 456796
11 SceneKit 0x00000001e0d5d010 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 1527824
12 SceneKit 0x00000001e0d5d87c EC930BC7-1D62-3C34-AE79-B49A41F6198E + 1529980
13 SceneKit 0x00000001e0d5de20 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 1531424
14 SceneKit 0x00000001e0d5e204 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 1532420
15 SceneKit 0x00000001e0e009a0 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 2197920
16 SceneKit 0x00000001e0cb5958 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 842072
17 SceneKit 0x00000001e0dc9be0 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 1973216
18 libdispatch.dylib 0x00000001030a56c0 _dispatch_client_callout + 20
19 libdispatch.dylib 0x00000001030b5f14 _dispatch_lane_barrier_sync_invoke_and_complete + 176
20 SceneKit 0x00000001e0dc9b64 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 1973092
21 GPUToolsCore 0x00000001032a4f44 -[DYDisplayLinkInterposer forwardDisplayLinkCallback:] + 172
22 QuartzCore 0x00000001afc8b6fc 8510F139-0824-3686-A9AA-3E198539A021 + 83708
23 QuartzCore 0x00000001afd64a80 8510F139-0824-3686-A9AA-3E198539A021 + 973440
24 CoreFoundation 0x00000001ac910dd0 727F2644-EB4E-3D57-BC2E-E6803BA92366 + 511440
25 CoreFoundation 0x00000001ac935fe8 727F2644-EB4E-3D57-BC2E-E6803BA92366 + 663528
26 CoreFoundation 0x00000001ac935378 727F2644-EB4E-3D57-BC2E-E6803BA92366 + 660344
27 CoreFoundation 0x00000001ac92f08c 727F2644-EB4E-3D57-BC2E-E6803BA92366 + 635020
28 CoreFoundation 0x00000001ac92e21c CFRunLoopRunSpecific + 600
29 Foundation 0x00000001adbdddf0 7698BF3E-0CF6-31C0-85E9-562714F01276 + 36336
30 SceneKit 0x00000001e0cb5ea4 EC930BC7-1D62-3C34-AE79-B49A41F6198E + 843428
31 SceneKit 0x00000001e0cb61bc EC930BC7-1D62-3C34-AE79-B49A41F6198E + 844220
32 libsystem_pthread.dylib 0x00000001f8467cb0 _pthread_start + 320
33 libsystem_pthread.dylib 0x00000001f8470778 thread_start + 8
2021-03-04 20:42:57.812761+0900 AR_1[4771:5233782] [Technique] ARWorldTrackingTechnique <0x10341bc30>: World tracking performance is being affected by resource constraints [0]
我认为调用函数的时间不正确,这就是为什么它说性能受到资源限制的影响。我尝试使用 updateAtTime
委托,但它不起作用。调用单独的线程也可能有效,但我不确定。
解决方法
根据日志,在 updateCoreML()
中,您正在调用与 UIKit 更改有关的内容。
你可以尝试在下面的事情中包装这个函数吗?
// MARK: - SCNSceneRendererDelegate
func renderer(_ renderer: SCNSceneRenderer,didRenderScene scene: SCNScene,atTime time: TimeInterval) {
DispatchQueue.main.async { [weak self] in
self?.updateCoreML()
}
}
,
- 为什么主队列修复有效
您正在主队列之外调用 UIKit 函数(在您的情况下为 view.bounds
),这在 Swift 中是不允许的。
- 关于 ARC 和
[weak self]
的说明:
Weak
指的是块内对象的自动引用计数 (ARC)。
引用计数 - Swift 的内存管理。 你可以在这里读更多关于它的内容: https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html
在这种情况下,我们在我们的闭包捕获列表(参见:Closure Capture List)中使用 [weak self]
来确保 self(在您的情况下 ViewController strong>) 不是强保留。
换句话说,如果你的 ViewController 实例要被释放,在块执行被调用之前,该实例将被释放并且 self 等于 nil 一旦块被调用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。