通过暂停将来使用GPU并确保计划先前的工作,使您的应用准备好进入后台。
概述
iOS 、 tvOS 限制了后台应用程序对GPU的访问,以确保前台应用程序的性能。如果在应用程序在后台移动后,metal 命令队列尝试调度命令缓冲区,则系统会阻止这些命令执行。当UIKit通知您的应用已被暂停或移入后台时,您的应用必须限制对metal的使用。
有关UIKit 应用程序生命周期的更多信息,请参阅准备UI在后台运行。
禁用提交新命令缓冲区的代码
停用您的应用程序后,停止将工作发送给metal。仅在您的应用程序重新激活后启用该代码。
在系统通知您的应用程序已被停用后,您需要一段时间,系统才能限制您的应用程序使用metal。如果这项工作对于使您的应用程序处于后台状态至关重要,则可以安排其它命令。同样,如果您的应用程序已经在编码命令的中间,则您的应用程序通常可以先完成当前任务,然后再禁用进一步的工作。例如,如果您的应用将动画帧渲染到屏幕上,并且在为新帧编码命令时收到通知,则可以在禁用渲染代码之前完成对该帧的编码。
确保计划所有先前的工作以执行
当UIKit 调用应用程序委托的applicationDidEnterBackground(_:)方法时,请确保metal在您的应用程序将控制权返回给系统之前已调度了所有已经提交的命令缓冲区。在每个命令队列上,如果尚未对最后一个命令缓冲区进行排定或完成,请调用waitUntilScheduled()已强制对其进行排定
如果您正在编码一个新的命令缓冲区,则可以结合使用这些步骤,完成编码命令以渲染框架并提交命令缓冲区,然后调用waitUntilScheduled()
您的应用程序移入后台后,如果metal 从您的应用程序中看到新的命令缓冲区,它将返回错误,而不是安排命令缓冲区,您可以通过添加addCompleteHandler(_:)完成处理程序此错误,在完成处理程序中,检查status和error属性。
网友评论