【问题标题】:Metal -- skipping commandBuffer.present(drawable) to not display a frame?金属——跳过 commandBuffer.present(drawable) 不显示帧?
【发布时间】:2018-08-18 22:41:25
【问题描述】:

在我的 macOS 金属应用程序中,我有一种情况,我只想每隔一段时间显示一次渲染结果。我想完成每一帧的渲染过程,并将可绘制的纹理图像保存到一个文件中,但我只想每第 16 帧左右显示一次渲染。当我不想显示时,我尝试跳过 commandBuffer.present(drawable),但它不起作用。一旦我这样做,它就会停止显示新帧。跳过一次对 commandBuffer.present() 的调用后,它只是不显示任何新帧。但是,它确实会继续运行。

为什么会这样?一旦我提交了一个命令缓冲区,它是否需要呈现?

如果我不能让它工作,那么我会尝试为这些我不想显示的帧渲染到屏幕外缓冲区。但这将是额外的工作,并且需要更多内存用于屏幕外渲染缓冲区,所以如果可能的话,我宁愿能够使用我的常规屏幕渲染缓冲区。

谢谢!

【问题讨论】:

    标签: rendering metal


    【解决方案1】:

    命令缓冲区不需要呈现可绘制对象。我认为问题在于,一旦您获得了可绘制对象,它就不会返回到由提供它的CAMetalLayer(或间接地,MTKView)维护的池中,直到它呈现为止。

    如果您不打算呈现,请不要渲染到可绘制对象的纹理。渲染到屏幕外纹理是正确的方法。实际上,如果您总是首先渲染到屏幕外纹理,然后仅针对要显示的帧将其复制到可绘制的纹理,那么您可以将 CAMetalLayerframebufferOnly 属性保留为默认值真正的价值。在这种情况下,您很有可能不会增加所需的内存(因为可绘制对象的纹理实际上只是屏幕后备存储的一部分)。

    【讨论】:

      猜你喜欢
      • 2013-09-22
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多