在Metal Best Practices Guide中,它指出为了获得最佳性能,应该“实现三重缓冲模型来更新动态缓冲区数据”,并且“动态缓冲区数据是指存储在缓冲区中的频繁更新的数据”。
MTLTexture
如果每帧都需要更新,是否符合“存储在缓冲区中的频繁更新数据”的条件?上面指南中的所有示例都集中在MTLBuffer
s 上。
我注意到 Apple 在 MetalKit 中的实现有一个 a 的概念nextDrawable
,所以也许这就是这里发生的事情?
在Metal Best Practices Guide中,它指出为了获得最佳性能,应该“实现三重缓冲模型来更新动态缓冲区数据”,并且“动态缓冲区数据是指存储在缓冲区中的频繁更新的数据”。
MTLTexture
如果每帧都需要更新,是否符合“存储在缓冲区中的频繁更新数据”的条件?上面指南中的所有示例都集中在MTLBuffer
s 上。
我注意到 Apple 在 MetalKit 中的实现有一个 a 的概念nextDrawable
,所以也许这就是这里发生的事情?
如果一个命令可能正在运行并且它可以访问(读取/采样/写入)纹理,而您正在修改 CPU 上的相同纹理(例如,使用其中一种-replaceRegion:...
方法或通过写入支持 IOSurface),那么您将需要多缓冲技术,是的。
如果您只是在 GPU 上修改纹理(通过渲染到它,从着色器函数写入它,或者使用 blit 命令编码器方法复制到它),那么您不需要多缓冲。您可能需要在着色器函数中使用纹理围栏,或者您可能需要-textureBarrier
在绘制调用之间调用渲染命令编码器,具体取决于您正在做什么。
是的,nextDrawable
提供了一种多缓冲形式。但是,在这种情况下,这不是由于 CPU 访问。您将渲染到一个纹理,而之前渲染的纹理可能仍在前往屏幕的途中。您不想对两者使用相同的纹理,因为新的渲染可能会在纹理刚刚出现在屏幕上之前过度绘制纹理,从而显示损坏的结果。