MTKView更新帧缓冲区而不清除以前的内容
MTKView updating frame buffer without clearing previous contents
我正在开发一个绘画程序,我通过 MTKView 绘制交互式笔画。如果我将 renderPassDescriptor loadAction 设置为 'clear':
renderPassDescriptor?.colorAttachments[0].loadAction = .clear
帧缓冲区,不出所料,显示了renderCommandEncoder?.drawPrimitives
的最新内容,本例是笔触的前沿
如果我将 loadAction 设置为 'load':
renderPassDescriptor?.colorAttachments[0].loadAction = .load
帧缓冲区像疯了似的闪烁并显示了我刚刚绘制的斑驳痕迹。我现在明白闪烁可能是由 MTKView 的默认三重缓冲引起的。因此,每次我写入 currentDrawable 时,我都可能写入 3 个循环缓冲区之一。如有不妥请指正
我的问题是,我需要怎么做才能画出干净的笔触,而不会像现在这样帧缓冲区闪烁?换句话说,有没有办法让主缓冲区更新为 commandEncoder 的最新内容?
您可以使用自己的纹理作为渲染通道的颜色附件。您不必使用可绘制对象的纹理。这样,您就可以使用 .load
操作而不会出现垃圾或奇怪的闪烁或其他任何情况。您将完全控制要渲染的纹理及其内容。
在为渲染通道渲染到该纹理后,您需要将其 blit 到可绘制对象的纹理以进行显示。
这里的主要问题是您无法享受双缓冲或三缓冲的好处。您将损失一定程度的性能,因为所有内容都必须同步到该纹理的状态。不过,我怀疑您不需要那么多性能,因为这是交互式的,只需要跟上人类的速度即可。
我正在开发一个绘画程序,我通过 MTKView 绘制交互式笔画。如果我将 renderPassDescriptor loadAction 设置为 'clear':
renderPassDescriptor?.colorAttachments[0].loadAction = .clear
帧缓冲区,不出所料,显示了renderCommandEncoder?.drawPrimitives
的最新内容,本例是笔触的前沿
如果我将 loadAction 设置为 'load':
renderPassDescriptor?.colorAttachments[0].loadAction = .load
帧缓冲区像疯了似的闪烁并显示了我刚刚绘制的斑驳痕迹。我现在明白闪烁可能是由 MTKView 的默认三重缓冲引起的。因此,每次我写入 currentDrawable 时,我都可能写入 3 个循环缓冲区之一。如有不妥请指正
我的问题是,我需要怎么做才能画出干净的笔触,而不会像现在这样帧缓冲区闪烁?换句话说,有没有办法让主缓冲区更新为 commandEncoder 的最新内容?
您可以使用自己的纹理作为渲染通道的颜色附件。您不必使用可绘制对象的纹理。这样,您就可以使用 .load
操作而不会出现垃圾或奇怪的闪烁或其他任何情况。您将完全控制要渲染的纹理及其内容。
在为渲染通道渲染到该纹理后,您需要将其 blit 到可绘制对象的纹理以进行显示。
这里的主要问题是您无法享受双缓冲或三缓冲的好处。您将损失一定程度的性能,因为所有内容都必须同步到该纹理的状态。不过,我怀疑您不需要那么多性能,因为这是交互式的,只需要跟上人类的速度即可。