Metal 最佳实践:三重缓冲——还有纹理?
Metal Best Practice: Triple-buffering – Textures too?
在 Metal Best Practices Guide 中指出,为了获得最佳性能,应该 "implement a triple buffering model to update dynamic buffer data," 并且 "dynamic buffer data refers to frequently updated data stored in a buffer."
如果需要每帧更新,MTLTexture
是否符合 "frequently updated data stored in a buffer" 的条件?上面指南中的所有示例都集中在 MTLBuffer
s.
我注意到 Apple 在 MetalKit 中的实现有一个 nextDrawable
的概念,所以也许这就是这里发生的事情?
如果一个命令可能正在运行并且它可以访问 (read/sample/write) 纹理,而您正在 CPU 上修改相同的纹理(例如使用 -replaceRegion:...
方法或写入支持 IOSurface),那么您将需要一种多缓冲技术,是的。
如果您只是在 GPU 上修改纹理(通过渲染,从着色器函数写入,或使用 blit 命令编码器方法复制到它),那么您不需要 multi-缓冲。您可能需要在着色器函数中使用纹理栅栏,或者您可能需要在绘制调用之间的渲染命令编码器上调用 -textureBarrier
,具体取决于您在做什么。
是的,nextDrawable
提供了一种多缓冲形式。不过,在这种情况下,这不是由于 CPU 访问。您将渲染到一个纹理,而先前渲染的纹理可能仍在前往屏幕的途中。您不想对两者使用相同的纹理,因为新渲染可能会在将纹理放在屏幕上之前透支纹理,从而显示损坏的结果。
在 Metal Best Practices Guide 中指出,为了获得最佳性能,应该 "implement a triple buffering model to update dynamic buffer data," 并且 "dynamic buffer data refers to frequently updated data stored in a buffer."
如果需要每帧更新,MTLTexture
是否符合 "frequently updated data stored in a buffer" 的条件?上面指南中的所有示例都集中在 MTLBuffer
s.
我注意到 Apple 在 MetalKit 中的实现有一个 nextDrawable
的概念,所以也许这就是这里发生的事情?
如果一个命令可能正在运行并且它可以访问 (read/sample/write) 纹理,而您正在 CPU 上修改相同的纹理(例如使用 -replaceRegion:...
方法或写入支持 IOSurface),那么您将需要一种多缓冲技术,是的。
如果您只是在 GPU 上修改纹理(通过渲染,从着色器函数写入,或使用 blit 命令编码器方法复制到它),那么您不需要 multi-缓冲。您可能需要在着色器函数中使用纹理栅栏,或者您可能需要在绘制调用之间的渲染命令编码器上调用 -textureBarrier
,具体取决于您在做什么。
是的,nextDrawable
提供了一种多缓冲形式。不过,在这种情况下,这不是由于 CPU 访问。您将渲染到一个纹理,而先前渲染的纹理可能仍在前往屏幕的途中。您不想对两者使用相同的纹理,因为新渲染可能会在将纹理放在屏幕上之前透支纹理,从而显示损坏的结果。