Apple Watch App 上的“由于执行过程中出现错误,命令缓冲区的执行被中止”?
Posted
技术标签:
【中文标题】Apple Watch App 上的“由于执行过程中出现错误,命令缓冲区的执行被中止”?【英文标题】:"Execution of the command buffer was aborted due to an error during execution" on Apple Watch App? 【发布时间】:2020-01-18 23:06:44 【问题描述】:2020-01-18 18:03:02.316685-0500 Watch Extension[529:813076] Execution of the command buffer was aborted due to an error during execution. Insufficient Permission (to submit GPU work from background) (IOAF code 6)
在测试 3 个 HealthKit 应用程序时,我开始反复打印此控制台消息,但我无法弄清楚它与什么相关,并且之前的 SO 问题仅与 iPhone 有关。具体来说,当我模拟锻炼动作(即慢跑)时,我似乎可以触发它。知道什么可能导致手表上出现此消息吗?
编辑:我相信问题出在SKScene
,我用它在手表应用上显示动画。当我注释掉以下内容时,我不再看到控制台警告:
@IBOutlet var spriteKitScene1: WKInterfaceSKScene!
@IBOutlet var spriteKitScene2: WKInterfaceSKScene!
【问题讨论】:
你的应用使用 Metal 吗? @JeshuaLacock 没有。只是一个在 HealthKit 中运行锻炼的手表应用 【参考方案1】:HealthKit 必须使用 Metal,或者您的应用中的某些东西。 Metal 不允许后台处理。
要消除警告,您需要暂停或暂停任何使用 Metal 的进程。
在您的 AppDelegate.swift 文件中,您可以实现这两种方法:
func applicationWillResignActive(_ application: UIApplication)
//Pause or suspend any operations using Metal
func applicationDidBecomeActive(_ application: UIApplication)
//Resume or start operations using Metal
进入后台/前台时启动/停止操作的另一种方法是使用通知。如果您更喜欢这种模式,我会发布示例。
请注意,您看到的是一条警告,表明金属加工不会在后台进行。如果您的应用按预期运行,您可以忽略该警告。
【讨论】:
我正在使用 Swift。奇怪的是,这些应用程序已经投入生产并且已经存在多年了,然后我突然在 Xcode 11.3 中看到了这些控制台消息。具体来说,它发生在委托中,当用户处于锻炼过程中时,我真的可以暂停或暂停任何 HealthKit 操作。当我模拟锻炼活动时,它似乎会被触发,即移动我的手臂。它也发生在 HealthKit 的不同 API 中(即旧的 HKWorkoutSession API 和查询样本以及新的 WorkoutBuilder API)。 如果它不会对应用程序操作产生不利影响,您可以忽略该消息,这只是意味着在应用程序后台运行时正在暂停使用 Metal 的任何内容。除了 HealthKit 之外,您是否使用过任何可能使用 Metal 的东西? 不,我没有注意到应用程序的任何性能变化,只是在控制台中它实际上每秒打印一次,所以有点令人担忧。不仅使用 WatchKit 和 HealthKit。 由于我在手表应用程序中使用 SpriteKitScene 制作动画,因此我能够实现一个协议,当应用程序处于非活动状态或活动状态时通知我的 InterfaceController,并使用 SpriteKitScene 上的 .`isPaused" 属性暂停一下。? @GarySabo 谢谢,您的评论为我节省了很多时间!以上是关于Apple Watch App 上的“由于执行过程中出现错误,命令缓冲区的执行被中止”?的主要内容,如果未能解决你的问题,请参考以下文章
如何将用户从 Apple Watch 通知转移到 Apple Watch App?