在 SceneKit 中使用 GIFU 库播放 GIF 会导致应用程序 UI 冻结任何解决方案? UIView Animated 从后台线程调用

Posted

技术标签:

【中文标题】在 SceneKit 中使用 GIFU 库播放 GIF 会导致应用程序 UI 冻结任何解决方案? UIView Animated 从后台线程调用【英文标题】:Playing GIF using GIFU library in SceneKit causes app UI freeze any solution? UIView Animated being called from a background thread 【发布时间】:2020-06-15 20:19:48 【问题描述】:

我正在使用 AR Kit 进行图像跟踪,一旦检测到图像,我就会使用 GIFUhttps://github.com/kaishin/Gifu 库播放 GIF。使用以下代码成功。

在 VC 中我添加了 GIFImageView 如下:

  var imageView = GIFImageView(frame: CGRect(x: 0, y: 0, width: 600, height: 600))

并且在 ARSceneView 委托中的 didAdd 节点方法如下:

  func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) 
DispatchQueue.main.async  self.instructionLabel.isHidden = true 
if let imageAnchor = anchor as? ARImageAnchor 
  //      handleFoundImage(imageAnchor, node)

  let size = imageAnchor.referenceImage.physicalSize

  DispatchQueue.main.async() // If we remove this we are getting UIview setAnimation is being call from background thread error is coming.
    self.imageView.animate(withGIFNamed: "tenor.gif") // I actually access gif from Document folder i.e Data format
  
  let imgMaterial = SCNMaterial()

  imgMaterial.diffuse.contents = imageView

  let imgPlane = SCNPlane(width: size.width, height: size.height)

  imgPlane.materials = [imgMaterial]

  let imgNode = SCNNode(geometry: imgPlane)
  imgNode.eulerAngles.x = -.pi / 2

  node.addChildNode(imgNode)
  node.opacity = 1


我不知道控制台中的问题,我在下面看到了这个内容,在播放 GIF 之后,我无法与应用程序中的 UI 元素进行交互。如果有人处理过此类问题,请提供帮助。

[Animation] +[UIView setAnimationsEnabled:] 从后台线程调用。不支持从后台线程对 UIView 或子类执行任何操作,这可能会导致意外和隐蔽行为。

追踪=( 0 UIKitCore 0x00000001c2e87d70 27D3041D-A1DE-3C3A-8DC0-994B5982DC49 + 15252848 1 libdispatch.dylib 0x00000001035b6bd8 _dispatch_client_callout + 16 2 libdispatch.dylib 0x00000001035b84c8 _dispatch_once_callout + 84 3 UIKitCore 0x00000001c2e87cd4 27D3041D-A1DE-3C3A-8DC0-994B5982DC49 + 15252692 4 UIKitCore 0x00000001c2e87e5c 27D3041D-A1DE-3C3A-8DC0-994B5982DC49 + 15253084 5 UIKitCore 0x00000001c21ccb8c 27D3041D-A1DE-3C3A-8DC0-994B5982DC49 + 1903500 6 UIKitCore 0x00000001c2c2ec9c 27D3041D-A1DE-3C3A-8DC0-994B5982DC49 + 12790940 7 UIKitCore 0x00000001c2a357b0 27D3041D-A1DE-3C3A-8DC0-994B5982DC49 + 10721200 8 UIKitCore 0x00000001c2c2c9ec 27D3041D-A1DE-3C3A-8DC0-994B5982DC49 + 12782060 9 UIKitCore 0x00000001c2a32d10 27D3041D-A1DE-3C3A-8DC0-994B5982DC49 + 10710288 10 UIKitCore 0x00000001c2a33b30 27D3041D-A1DE-3C3A-8DC0-994B5982DC49 + 10713904 11 UIKitCore 0x00000001c2a33894 27D3041D-A1DE-3C3A-8DC0-994B5982DC49 + 10713236 12 场景套件 0x00000001d2afe7cc 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 2283468 13 场景套件 0x00000001d2afe930 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 2283824 14 场景套件 0x00000001d2b1e740 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 2414400 15 场景套件 0x00000001d2990d8c 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 785804 16 场景套件 0x00000001d2961138 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 590136 17 场景套件 0x00000001d2961060 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 589920 18 场景套件 0x00000001d2983d14 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 732436 19 场景套件 0x00000001d2980f80 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 720768 20 场景套件 0x00000001d297fcc0 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 715968 21 场景套件 0x00000001d297ec30 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 711728 22 场景套件 0x00000001d2aa7870 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 1927280 23 场景套件 0x00000001d2aa75c4 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 1926596 24 场景套件 0x00000001d2aae844 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 1955908 25 场景套件 0x00000001d293a178 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 430456 26 场景套件 0x00000001d293bac8 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 436936 27 场景套件 0x00000001d2a33a4c 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 1452620 28 场景套件 0x00000001d2a342b8 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 1454776 29 场景套件 0x00000001d2a34824 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 1456164 30 场景套件 0x00000001d2a34bb8 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 1457080 31 场景套件 0x00000001d2acf310 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 2089744 32 ARKit 0x00000001d9ec1104 64C95206-B840-361E-B8AC-F70B23A324B4 + 958724 33 场景套件 0x00000001d29954f4 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 804084 34 场景套件 0x00000001d2a9ab14 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 1874708 35 libdispatch.dylib 0x00000001035b6bd8 _dispatch_client_callout + 16 36 libdispatch.dylib 0x00000001035c5858 _dispatch_lane_barrier_sync_invoke_and_complete + 124 37 场景套件 0x00000001d2a9aaa4 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 1874596 38 GPUToolsCore 0x00000001037655f8 -[DYDisplayLinkInterposer forwardDisplayLinkCallback:] + 168 39 石英核心 0x00000001c52b988c 84C3CD6E-F832-3F6F-BE62-5A4348853273 + 71820 40 IOKit 0x00000001bf8d5934 IODispatchCalloutFromCFMessage + 488 41 核心基础 0x00000001be8e18ac 1B9B1E61-8CB4-3903-9870-402C3DE959BB + 526508 42 核心基础 0x00000001be90b07c 1B9B1E61-8CB4-3903-9870-402C3DE959BB + 696444 43 核心基础 0x00000001be90a7a8 1B9B1E61-8CB4-3903-9870-402C3DE959BB + 694184 44 核心基础 0x00000001be90567c 1B9B1E61-8CB4-3903-9870-402C3DE959BB + 673404 45 核心基础 0x00000001be904adc CFRunLoopRunSpecific + 464 46 基础 0x00000001bec447f4 503900AF-2ECD-329F-B742-C07C3E672BEB + 30708 47 场景套件 0x00000001d29958d0 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 805072 48 场景套件 0x00000001d2995b18 5BEC4C23-5650-30CD-96CC-314CDAF2E954 + 805656 49 libsystem_pthread.dylib 0x00000001be6a7d8c _pthread_start + 156 50 libsystem_pthread.dylib 0x00000001be6ab76c thread_start + 8 ) 这是重现问题的项目:

只需在设备中运行它。 https://drive.google.com/file/d/1FKHPO6SkdOEZ-w_GFnrU5CeeeMQrNT-h/view?usp=sharing

您只需在设备中运行此项目并扫描恐龙.png 图像(添加 ion xcode),您将在其上播放 gif。一旦你回到firstVC,所有的应用程序都被冻结了,你不能点击First VC中的任何按钮,你也不能再次启动AR场景。 我无法弄清楚为什么在播放 GIF 后会发生这个问题,你能检查一下并告诉我。

如果有什么需要请告诉我。提前谢谢。

【问题讨论】:

您是否遵循GIFU 网站上的指南?您的代码似乎不匹配;为什么这个 DispatchQueue.main.async() 在调用 animate 之前它已经在使用 DispatchQueue? 【参考方案1】:

问题已解决。

我们必须将 imageView 层添加到 SCNMaterial()

imgMaterial.diffuse.contents = self.imageView.layer

感谢您的回复。

【讨论】:

以上是关于在 SceneKit 中使用 GIFU 库播放 GIF 会导致应用程序 UI 冻结任何解决方案? UIView Animated 从后台线程调用的主要内容,如果未能解决你的问题,请参考以下文章

在 SceneKit 中播放视频的最佳方式是啥?

从 Collada (.dae) 文件(在 Maya 中创建)导入的 SceneKit 键控混合形状动画未播放

在 SceneKit 中播放 GIF 后,iOS 应用程序 UI 冻结

无法在我的应用程序中使用 Gifu Pod “GIF 不出现”

如何防止 SceneKit 动画在加载时立即播放?

Xcode 中的 SceneKit