MTKView更新帧缓冲区而不清除以前的内容

Plu*_*man 5 buffer render-to-texture swift metal metalkit

我正在开发一个绘画程序,通过 MTKView 绘制交互式笔画。如果我将 renderPassDescriptor loadAction 设置为“clear”:

renderPassDescriptor?.colorAttachments[0].loadAction = .clear
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,帧缓冲区显示 的最新内容renderCommandEncoder?.drawPrimitives,在本例中是笔触的前缘。

如果我将 loadAction 设置为“加载”:

renderPassDescriptor?.colorAttachments[0].loadAction = .load 
Run Code Online (Sandbox Code Playgroud)

帧缓冲区疯狂地闪烁,并显示出我刚刚绘制的斑驳痕迹。我现在明白闪烁可能是由 MTKView 的默认三重缓冲造成的。因此,每次写入 currentDrawable 时,我可能会写入 3 个循环缓冲区之一。如果我错了,请纠正我。

我的问题是,我需要做什么才能绘制干净的笔触而不像现在那样帧缓冲区闪烁?换句话说,有没有办法让主缓冲区使用 commandEncoder 的最新内容进行更新?

Ken*_*ses 4

您可以使用自己的纹理作为渲染通道的颜色附件。您不必使用可绘制的纹理。这样,您就可以使用该.load操作而不会出现垃圾或奇怪的闪烁或其他任何情况。您将完全控制要渲染的纹理及其内容。

在渲染通道渲染到该纹理后,您需要将其传输到可绘制的纹理以进行显示。

这里的主要并发症是您将无法享受双缓冲或三缓冲的好处。您将损失一定的性能,因为所有内容都必须同步到该纹理的状态。不过,我怀疑您不需要那么高的性能,因为这是交互式的,只需跟上人类的速度即可。