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

时间:2017-10-15 18:50:12

标签: ios metal metalkit

Metal Best Practices Guide中,它声明为了获得最佳性能,应该“实现三重缓冲模型来更新动态缓冲区数据”,并且“动态缓冲区数据是指存储在缓冲区中的频繁更新的数据。” / p>

如果需要每帧更新,MTLTexture是否有资格作为“存储在缓冲区中的频繁更新的数据”?上述指南中的所有示例都集中在MTLBuffer s。

我注意到Apple在MetalKit中的实现有一个nextDrawable的概念,所以也许这就是这里发生的事情?

1 个答案:

答案 0 :(得分:4)

如果命令可以在飞行中并且它可以访问(读取/采样/写入)纹理,同时您在CPU上修改相同的纹理(例如,使用-replaceRegion:...方法之一或通过写一个支持IOSurface),然后你需要一个多缓冲技术,是的。

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

是的,nextDrawable提供了一种多缓冲形式。在这种情况下,它不是由于CPU访问。您将要渲染到一个纹理,而之前渲染的纹理可能仍在前往屏幕。你不想为两者使用相同的纹理,因为新的渲染可能会在它被放到屏幕上之前重新绘制纹理,从而显示出腐败的结果。

相关问题