CVMetalTextureGetTexture 所有权?

CVMetalTextureGetTexture ownerhsip?

我想弄清楚所有权如何与函数一起使用 CVMetalTextureGetTexture:

CVMetalTextureRef textureRef;
// ... textureRef is created
id<MTLTexture> texture = CVMetalTextureGetTexture(_textureRef);
CVBufferRelease(textureRef); // Releasing the existing texture
// Is texture still valid here?

解除textureReftexture还有效吗?如果没有,我能否以某种方式将所有权从 textureRef 转移到 texture (ARC),这样我就不必在 texture 发布后调用 CVBufferRelease

swift同样的问题:

var texture: MTLTexture
do {
  var textureRef: CVMetalTexture
  // ... textureRef is created
  texture = CVMetalTextureGetTexture(textureRef)!
  // end of scope, textureRef is released
}
// Is texture still valid here?

在看到你的问题之前,我们还做了另一个实验:

in a loop, CVMetalTextureRef created from CVPixelBuffer comes from Camera.

static void *texturePtr;  

/** AVCaptureVideoDataOutputSampleBufferDelegate, as a loop */
{
CVMetalTextureRef textureRef;
// ... textureRef is created
id<MTLTexture> texture = CVMetalTextureGetTexture(_textureRef);
CVBufferRelease(textureRef); // Releasing the existing texture

texturePtr= (__bridge_retained void*)texture;

// no releasing the texturePtr
// (__bridge_transfer id<MTLTexture>)texturePtr;
}

我发现我没有releasetexturePtr,但还是会出现no memory leak。更重要的是,texturePtr 在某个时候是 valid,在我们用新变量替换它之前。
所以我认为这可能与您的问题有关。
我的回复更像是一个争论而不是一个答案。

这是一个很好的问题,因为这种方法打破了 Create Rule,但似乎这种方法确实保留了底层对象。我想这条规则不适用于 Core Foundation -> ARC 方法...

您可以在 this Apple Demo 中看到他们确实在将 ref 转换为 id<MTLTexture> 后释放了 ref。他们在更隐含的 Swifty 版本中这样做,所以很容易错过。