金属最佳实践:三重缓冲 - 纹理呢?

问题描述:

Metal Best Practices Guide,它指出,为了获得最佳性能应该“实现三重缓冲模型更新动态缓冲区的数据,”和“动态缓冲区中的数据是指经常更新存储在缓冲区中的数据。”金属最佳实践:三重缓冲 - 纹理呢?

是否一个MTLTexture符合“存储在缓冲区频繁更新的数据”,如果它需要每一帧进行更新?以上指南中的所有示例都集中在MTLBuffer s。

我注意到苹果在MetalKit实现有一个nextDrawable的概念,所以也许这就是这里发生了什么?

如果某个命令可能正在运行,并且可以在修改CPU上的同一纹理时访问(读取/采样/写入)纹理(例如,使用-replaceRegion:...方法之一或通过写入背景IOSurface ),那么你需要一个多缓冲技术,是的。

如果您只修改GPU上的纹理(通过渲染,从着色器函数写入或使用blit命令编码器方法复制到它),则不需要多重缓冲。您可能需要在着色器功能中使用纹理栅栏,或者您可能需要在绘制调用之间的渲染命令编码器上调用-textureBarrier,具体取决于您正在执行的操作。

是,nextDrawable提供多缓冲的形式。但在这种情况下,这不是由于CPU访问所致。您将渲染到一个纹理,而之前渲染的纹理可能仍然在屏幕上。您不希望为两者使用相同的纹理,因为新渲染可能会在将纹理放入屏幕之前重新绘制纹理,从而显示损坏的结果。

+0

有趣的,谢谢。因此,在一个多通道的情况下渲染 - 即一个通过渲染背景到纹理,未来呈现叠加成另一种质感,而前两个纹理复合在一起的最后一传,是否会受到同样的风险的腐败没有多缓冲前两次通过的目标纹理,另外最后的传球? – Tricky

+1

如果我理解你描述的场景,那么,不,不需要多缓冲。对于一帧的两个纹理的合成将在它们被下一帧覆盖之前完成(除非*你*以错误的顺序排列命令)。 –