MTKView清晰显示

Dee*_*rma 0 ios opengl-es-2.0 metal metalkit mtkview

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

war*_*enm 7

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

仅仅聆听是不够的UIApplication.didEnterBackgroundNotification;在通知观察者收到状态更改通知之前捕获快照。

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

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()
}
Run Code Online (Sandbox Code Playgroud)

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