金属屏幕撕裂和相机捕获

为了避免同时从gpu和cpu写入一个常量缓冲区,Applebuild议在信号量的帮助下使用一个三重缓冲系统,以防止cpu在gpu之前过多(这是很好的,并且覆盖在现阶段至less有三个金属video)。

但是,当常量资源是MTLTexture并且AVCaptureVideoDataOutput委托单独运行而不是渲染循环(CADisplaylink)时,类似的三重缓冲系统(如Apple的示例代码MetalVideoCapture中所用的)如何保证同步? 如果使用MetalVideoCapture代码,只需渲染全屏四边形并将预设更改为AVCaptureSessionPresetHigh(在撕裂被旋转四边形和低质量预设遮挡的时刻),则可以观察到撕裂(纹理撕裂)。

我意识到渲染循环和captureOutput委托方法(在这种情况下)都在主线程上,并且信号量(在渲染循环中)保持_constantDataBufferIndex整数被检查(哪些索引进入MTLTexture进行创build和编码),但仍然可以观察到屏幕撕裂,这是令人费解的(如果纹理的GPU写入不是编码后的下一帧,而是2或3帧之后,这是有意义的,但我不认为这是事实)。 此外,只是一个小点:渲染循环和captureOutput不应该有一个缓冲的纹理系统相同的帧率,所以旧的帧不交替与最近的交错。

任何想法或澄清这个问题将不胜感激; McZonk还有另外一个例子,它没有使用三重缓冲系统,但是我也观察到这种方法(但不那么重要)。 显然,如果我使用waitUntilCompleted(相当于Open GL的glfinish),那么就不会有撕裂的痕迹,但是就像在背后系着一只arm来演奏手风琴一样!