如何创建一个由CVPixelBuffer支持的MTLTexture

10

如何正确生成由CVPixelBuffer支持的MTLTexture?

我有以下代码,但似乎会导致内存泄漏:

func PixelBufferToMTLTexture(pixelBuffer:CVPixelBuffer) -> MTLTexture
{
    var texture:MTLTexture!

    let width = CVPixelBufferGetWidth(pixelBuffer)
    let height = CVPixelBufferGetHeight(pixelBuffer)

    let format:MTLPixelFormat = .BGRA8Unorm


    var textureRef : Unmanaged<CVMetalTextureRef>?

    let status = CVMetalTextureCacheCreateTextureFromImage(nil,
                                                           videoTextureCache!.takeUnretainedValue(),
                                                           pixelBuffer,
                                                           nil,
                                                           format,
                                                           width,
                                                           height,
                                                           0,
                                                           &textureRef)

    if(status == kCVReturnSuccess)
    {
        texture = CVMetalTextureGetTexture(textureRef!.takeUnretainedValue())
    }

    return texture
}

你是如何确定存在内存泄漏的?哪些对象正在泄漏? - warrenm
您是使用此工具来渲染带有某种滤镜的实时摄像头视频吗?请查看我的问题:https://stackoverflow.com/questions/53898780/how-to-apply-a-vignette-cifilter-to-a-live-camera-feed-in-ios - nr5
2
什么是videoTextureCache? - Roi Mulia
@RoiMulia 你可以使用 https://developer.apple.com/documentation/metal/mixing_metal_and_opengl_rendering_in_a_view :它展示了如何使用CVMetalTextureCacheCreate创建纹理缓存。 - Pavan K
1个回答

7
啊,我忘记了:textureRef?.release()

对于那些遇到相同问题的Objective-C开发者:在调用CVMetalTextureGetTexture()之后,记得加上CFRelease(textureRef) - Shuai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接