IOS操作完成后如何释放vImage缓冲区

Posted

技术标签:

【中文标题】IOS操作完成后如何释放vImage缓冲区【英文标题】:how to free vImage buffers after operation completed in IOS 【发布时间】:2020-07-13 14:27:37 【问题描述】:

我尝试在 Accelerate 框架中使用 vImage 缓冲区进行一些直方图计算,并将相机图像作为从 CVpixelbuffer 转换而来的 UIimage 提供。算法正常工作,但屏幕上处理的相机图像数据非常慢。我在 Apple 文档中阅读了一些关于在任务完成时释放缓冲区的信息。抓取缓冲区数据后,我写了两行代码。然而什么都没有改变。请参阅缓冲区数据释放后的附加屏幕截图。SourceBuffer 和 histogramSourceBuffer 似乎未释放。我不知道如何在调试器中看到空闲缓冲区,但我的缓冲区显示有高度、宽度和数据信息。任何建议如何释放缓冲区以及如何确保它被释放。真的非常感谢

  if let finalImage =  try? sourceBuffer.createCGImage(format: format) 
            sourceBuffer.free()
            histogramSourceBuffer.free()
            return UIImage(cgImage: finalImage)

【问题讨论】:

【参考方案1】:

您需要在 vImage_Buffer.data 指针上调用 free() 以释放内存。结构本身是不同的分配。

直方图本身是一个指向 vImagePixelCounts 数组的指针数组。这应该根据您分配 vImagePixelCounts 数组的方式释放。 vImage 不参与那部分,所以它在你和你之间。

【讨论】:

以上是关于IOS操作完成后如何释放vImage缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

是啥阻止了我的 ByteBuffer 释放?

对于IOS,如何使用vImage将ARGB图像转换为灰度图像

清除/释放 OpenGL ES 缓冲区

iOS 离屏渲染

iOS 离屏渲染的研究

在重叠模式下使用 WSASend 时,我应该何时释放缓冲区?