【问题标题】:MTKView clear displayMTKView 清晰显示
【发布时间】:2019-12-24 17:53:54
【问题描述】:

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

【问题讨论】:

  • 您可以采用与任何需要在任务切换器中隐藏敏感信息的应用相同的通用方法:监听applicationDidEnterBackground(_:)applicationWillEnterForeground(_:)。在从 did-enter-background 调用返回时,系统将捕获 UI 的外观,因为它是配置的。在您的情况下,您可能需要确保清除的内容由您的渲染器呈现到屏幕上,但您也可以关注this approach 以便宜地完成它。
  • 哦不,我只是想拉黑MTKView,而不是按钮等其他子视图。有没有办法强制清除 MTKView?
  • MTKView 上配置的透明颜色被简单地设置为它提供的渲染通道描述符的第一个颜色附件的透明颜色。所以“消隐”它只包括设置清晰的颜色(如有必要)并使用虚拟渲染命令编码器渲染到其当前的可绘制对象,然后呈现该可绘制对象,确保该呈现发生在应用程序切换器屏幕抓取的关键时刻之前发生。最后一部分可能会或可能不会很棘手,这就是我在第一条评论中对冲的原因。
  • 请注意,您可能还需要提前暂停 MTKView 以防止它尝试按照通常的显示链接节奏绘制,然后在您再次进入前台时取消暂停。

标签: ios opengl-es-2.0 metal metalkit mtkview


【解决方案1】:

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

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

这意味着您应该将您的应用程序已进入后台的消息从您的应用程序委托传递给相关的视图控制器,并强制它们立即渲染一个空白帧,之前从委托方法返回(意味着没有发布通知,也没有将异步调度到不同的线程)。这是一个将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(_:) 调用后,您可以恢复进入后台时可能设置的任何状态,包括视图的暂停状态。

【讨论】:

  • 当我这样做时,我遇到了崩溃并且这个错误 - “由于执行过程中的错误,命令缓冲区的执行被中止。丢弃(GPU 错误/恢复的受害者)(IOAF 代码 5) "
  • 我不关心快照,我的视频预览会话有时会断开连接,并且过时的视频帧在屏幕上可见。我只想显示一个空白屏幕,以防用户退出应用程序并重新进入,或者会话因任何原因断开连接。
  • IOAF 错误 5 几乎从来都不是打印到控制台的第一个错误;日志中还有其他错误吗?我在 iOS 12.4 和 iPadOS 13.0 beta 6 上对此进行了测试,它似乎可以工作。
  • 你好@warrenm,很抱歉回复晚了,这是我在 IOAF 错误之前得到的 - “[CAMetalLayerDrawable 纹理] 在已经呈现此可绘制对象后不应被调用。改为获取 nextDrawable。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2021-11-25
  • 2016-08-26
  • 2022-01-17
  • 2018-01-20
  • 2016-08-07
  • 1970-01-01
相关资源
最近更新 更多