【问题标题】:Do we need to create a new RenderPassDescriptor for each draw, or we can cache it and reuse it?我们是否需要为每次绘制创建一个新的 RenderPassDescriptor,或者我们可以缓存它并重用它?
【发布时间】:2020-03-23 12:16:43
【问题描述】:

我们是否需要为每次绘制创建一个新的RenderPassDescriptor,或者我们可以缓存它并重复使用它?

如果不是,那么多重采样纹理和深度模板纹理呢?我是否还需要在每次通过时重新创建它们?

【问题讨论】:

    标签: ios objective-c metal metalkit


    【解决方案1】:

    Metal 中的一些对象被设计为瞬态且极其轻量级,而其他对象则更昂贵并且可以持续很长时间,甚至可能在应用程序的整个生命周期内都存在。 MTLRenderPassDescriptor 是瞬态对象。通常,您创建一次 MTLRenderPassDescriptor 对象,并在您的应用每次呈现帧时重用它。

    多重采样纹理和深度模板纹理呢?难道我 还需要在每次通过时重新创建它们吗?

    MTLTexture 类型的对象不是瞬态的,在性能敏感的代码中重用这些对象,避免重复创建。

    【讨论】:

    • 如何将 MTLRenderPassDescriptor 与 CAMetalLayer 结合使用? CAMetalLayernextDrawable 吐出一个新的 Drawable,这使得 MTLRenderPassDescriptor 无法重用
    • 究竟是什么让你认为这是不可能的?
    • @0xBFE1A8 我不明白,如果 MTLRenderPassDescriptor 是瞬态的,那么我需要在每次通过时重新创建一个新的吗?
    • @lok​​i 你可以随时创建一个新的MTLRenderPassDescriptor。如果您在每一帧上创建它或创建一次并重复使用它,就性能而言并不重要。
    【解决方案2】:

    MTLRenderPassDescriptor 通常是轻量级的,因此创建它们并不是什么大问题。 但是 Metal 中的 MTLRenderEncoders 是最昂贵的操作。但根据我的经验,我注意到的是,如果您使用一些默认属性缓存 MTLRenderPassDescriptor,并且只更新您需要修改的属性,那么我们可以在创建编码器时节省很多性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      相关资源
      最近更新 更多