在用于macOS的Metal应用程序中,我总是只想经常显示渲染结果。我想在每一帧完成渲染过程,并将可绘制纹理图像保存到文件中,但是我只想在每十六帧左右显示一次渲染。当我不想显示时,我尝试仅跳过commandBuffer.present(drawable),但它不起作用。一旦这样做,它就会停止显示新帧。跳过对commandBuffer.present()的一次调用后,它仅不显示任何新帧。但是,它确实可以继续运行。
为什么会这样?提交命令缓冲区后,是否需要显示它?
如果无法使它正常工作,那么我将尝试渲染到这些不需要显示的帧的屏幕外缓冲区中。但这将是额外的工作,并且需要更多的屏幕外渲染缓冲区内存,因此,我宁愿能够使用常规的屏幕上渲染缓冲区。
谢谢!
答案 0 :(得分:0)
不需要命令缓冲区提供可绘制对象。我认为问题在于,一旦获得了可绘制对象,它就不会返回到提供它的CAMetalLayer
(或间接地,MTKView
)所维护的池中,直到呈现为止。>
如果您不打算呈现,请不要渲染可绘制的纹理。渲染到屏幕外的纹理是正确的方法。实际上,如果始终先渲染为屏幕外的纹理,然后仅将要显示的帧复制到可绘制对象的纹理,则可以保留{{1}的framebufferOnly
属性}及其默认的true值。在这种情况下,您很有可能不会增加所需的内存(因为drawable的纹理实际上只是屏幕后备存储的一部分)。