【发布时间】:2020-03-23 12:16:43
【问题描述】:
我们是否需要为每次绘制创建一个新的RenderPassDescriptor,或者我们可以缓存它并重复使用它?
如果不是,那么多重采样纹理和深度模板纹理呢?我是否还需要在每次通过时重新创建它们?
【问题讨论】:
标签: ios objective-c metal metalkit
我们是否需要为每次绘制创建一个新的RenderPassDescriptor,或者我们可以缓存它并重复使用它?
如果不是,那么多重采样纹理和深度模板纹理呢?我是否还需要在每次通过时重新创建它们?
【问题讨论】:
标签: ios objective-c metal metalkit
Metal 中的一些对象被设计为瞬态且极其轻量级,而其他对象则更昂贵并且可以持续很长时间,甚至可能在应用程序的整个生命周期内都存在。 MTLRenderPassDescriptor 是瞬态对象。通常,您创建一次 MTLRenderPassDescriptor 对象,并在您的应用每次呈现帧时重用它。
多重采样纹理和深度模板纹理呢?难道我 还需要在每次通过时重新创建它们吗?
MTLTexture 类型的对象不是瞬态的,在性能敏感的代码中重用这些对象,避免重复创建。
【讨论】:
CAMetalLayer 结合使用? CAMetalLayer 用 nextDrawable 吐出一个新的 Drawable,这使得 MTLRenderPassDescriptor 无法重用
MTLRenderPassDescriptor。如果您在每一帧上创建它或创建一次并重复使用它,就性能而言并不重要。
MTLRenderPassDescriptor 通常是轻量级的,因此创建它们并不是什么大问题。 但是 Metal 中的 MTLRenderEncoders 是最昂贵的操作。但根据我的经验,我注意到的是,如果您使用一些默认属性缓存 MTLRenderPassDescriptor,并且只更新您需要修改的属性,那么我们可以在创建编码器时节省很多性能。
【讨论】: