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

Do we need to create a new RenderPassDescriptor for each draw, or we can cache it and reuse it?

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

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

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

what about the multisample texture and the depth stencil texture? Do I also need to recreate them on each pass?

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

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