MTKView 更新帧缓冲区而不清除以前的内容
Posted
技术标签:
【中文标题】MTKView 更新帧缓冲区而不清除以前的内容【英文标题】:MTKView updating frame buffer without clearing previous contents 【发布时间】:2019-08-21 10:50:21 【问题描述】:我正在开发一个绘画程序,通过 MTKView 绘制交互式笔触。如果我将 renderPassDescriptor loadAction 设置为“清除”:
renderPassDescriptor?.colorAttachments[0].loadAction = .clear
正如预期的那样,帧缓冲区显示renderCommandEncoder?.drawPrimitives
的最新内容,在这种情况下是笔触的前沿。
如果我将 loadAction 设置为“加载”:
renderPassDescriptor?.colorAttachments[0].loadAction = .load
帧缓冲区疯狂地闪烁,并显示出我刚刚绘制的不完整的轨迹。我现在明白闪烁可能是由 MTKView 默认的三重缓冲引起的。因此,每次我写入 currentDrawable 时,我很可能会写入 3 个循环缓冲区之一。如果我错了,请纠正我。
我的问题是,我需要做什么才能绘制干净的笔触而不像现在这样闪烁帧缓冲区?换句话说,有没有办法让主缓冲区使用 commandEncoder 的最新内容进行更新?
【问题讨论】:
【参考方案1】:您可以使用自己的纹理作为渲染通道的颜色附件。您不必使用可绘制对象的纹理。这样,您可以使用.load
操作而不会出现垃圾或奇怪的闪烁或其他任何情况。您可以完全控制要渲染到的纹理及其内容。
在渲染到该纹理以进行渲染通道后,您需要将其 blit 到可绘制对象的纹理以进行显示。
这里的主要问题是您不会享受双缓冲或三缓冲的好处。您将失去一定的性能,因为所有内容都必须同步到该纹理的状态。不过,我怀疑您不需要那么多性能,因为这是交互式的,只需要跟上人类的速度即可。
【讨论】:
以上是关于MTKView 更新帧缓冲区而不清除以前的内容的主要内容,如果未能解决你的问题,请参考以下文章