0

我想在应用程序退出活动时立即将 MTKView(或 GLKView/CAEAGLLayer)的内容设置为黑色。将其设置为清晰的颜色(例如黑色)并显示它的最快和最可靠的方法是什么?

4

1 回答 1

5

为了MTKView在进入后台时使 a 空白,您必须在从委托回调返回到对象applicationDidEnterBackground(_:)上的方法之前渲染一个空白帧UIApplicationDelegate

只听UIApplication.didEnterBackgroundNotification; 在通知观察者收到状态更改通知之前捕获快照。

这意味着您应该将应用程序已进入后台的消息从您的应用程序委托传递给相关的视图控制器,并强制它们在从委托方法返回之前立即呈现一个空白帧(意味着没有发布通知,并且没有将异步调度到不同的线程)。这是一个将 a 清除MTKView为黑色并在返回之前等待绘图和演示安排好的方法:

func drawBlankAndWait(_ mtkView: MTKView) {
    mtkView.clearColor = MTLClearColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0)
    let commandBuffer = commandQueue.makeCommandBuffer()!
    guard let renderPassDescriptor = mtkView.currentRenderPassDescriptor else { return }
    let renderEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: renderPassDescriptor)!
    renderEncoder.endEncoding()
    let drawable = mtkView.currentDrawable!
    commandBuffer.present(drawable)
    commandBuffer.commit()
    commandBuffer.waitUntilScheduled()
}

接到applicationWillEnterForeground(_:)电话后,您可以恢复进入后台时可能设置的任何状态,包括视图的暂停状态。

于 2019-08-19T21:30:14.907 回答