缓存溢出的图像处理

时间:2018-08-02 05:15:45

标签: swift xcode image-processing uigraphicscontext

已解决

我必须处理100张2400x2000像素的图像。我在后台线程中循环执行。但是在第60-70幅图像上,渲染的结果是黑白图像...并记录以下消息:

“ Application(2227,0x16c0db000)malloc:无法分配区域 *** mach_vm_map(size = 15777792)失败(错误代码= 3)“

Example of bad image generation after overflow?

这是我周期性地做的事情

        UIGraphicsBeginImageContextWithOptions(PageSize.PX.size, true, 1)

        let context = UIGraphicsGetCurrentContext()

        UIColor.white.setFill()

        context?.fill(CGRect(x: 0, y: 0, width: PageSize.PX.size.width, height: PageSize.PX.size.height))

        image?.draw(in: newImageRect)

        let newImage = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()

同时处理50张图像-一切正常。 同样,每个循环都添加到自动释放池中。

我已经尝试过UIGraphicsImageRenderer。它的运行速度比通过图片上下文慢,并且在第50-60张图片之后,它们的大小为0x0 px。...

我该如何解决?我可以以某种方式清理图像缓存吗?或者,也许我可以增加图像处理缓存?或者.... ???

1 个答案:

答案 0 :(得分:0)

花费5天,每次2-3小时进行调试。如果遇到此类问题,希望这篇文章对您有所帮助。

这是一种非常奇怪的情况,并且此错误仅在beta iOS 12中出现。在iOS 11中,一切正常。

是什么情况?在我的应用程序中,我需要从图库中重绘100张图像,并且当我与UIGraphicsBeginImageContextWithOptions一起调用UIImageJPEGRepresentation时,我认为某些图像处理器缓存溢出(在第50至第60张图像上-结果为0x0大小或黑色图像。这取决于我使用的技术) 。还请注意,我在每个循环中都添加了autorelesePool {},并且在处理图像时我的内存消耗不大于200 Mb。此外,我尝试使用仪器进行调试,但未发现任何泄漏等。

我通过运行每个图像操作链以0.1秒的延迟来实现了。我认为这不是一个好方法,但是在处理100张图像时,处理时间从25秒增加到35秒。效果很好。

我希望在稳定的iOS 12中不会发生这种情况。

快乐的编码专家。