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?
解除textureRef
后texture
还有效吗?如果没有,我能否以某种方式将所有权从 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;
}
我发现我没有release
了texturePtr
,但还是会出现no memory leak
。更重要的是,texturePtr
在某个时候是 valid
,在我们用新变量替换它之前。
所以我认为这可能与您的问题有关。
我的回复更像是一个争论而不是一个答案。
这是一个很好的问题,因为这种方法打破了 Create Rule,但似乎这种方法确实保留了底层对象。我想这条规则不适用于 Core Foundation -> ARC 方法...
您可以在 this Apple Demo 中看到他们确实在将 ref 转换为 id<MTLTexture>
后释放了 ref。他们在更隐含的 Swifty 版本中这样做,所以很容易错过。
我想弄清楚所有权如何与函数一起使用 CVMetalTextureGetTexture
:
CVMetalTextureRef textureRef;
// ... textureRef is created
id<MTLTexture> texture = CVMetalTextureGetTexture(_textureRef);
CVBufferRelease(textureRef); // Releasing the existing texture
// Is texture still valid here?
解除textureRef
后texture
还有效吗?如果没有,我能否以某种方式将所有权从 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;
}
我发现我没有release
了texturePtr
,但还是会出现no memory leak
。更重要的是,texturePtr
在某个时候是 valid
,在我们用新变量替换它之前。
所以我认为这可能与您的问题有关。
我的回复更像是一个争论而不是一个答案。
这是一个很好的问题,因为这种方法打破了 Create Rule,但似乎这种方法确实保留了底层对象。我想这条规则不适用于 Core Foundation -> ARC 方法...
您可以在 this Apple Demo 中看到他们确实在将 ref 转换为 id<MTLTexture>
后释放了 ref。他们在更隐含的 Swifty 版本中这样做,所以很容易错过。