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

斯威夫特的相同问题:

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

这是一个很好的问题,因为这种方式会破坏创建规则,但似乎此方法确实保留了基础对象。我想这条规则不适用于核心基础 -> ARC 方法......

您可以在此Apple演示中看到,他们在将其转换为id<MTLTexture>后确实发布了引用。他们在更隐含的 Swifty 版本中这样做,所以很容易错过。

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

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;
}

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

相关内容

  • 没有找到相关文章

最新更新