【问题标题】:Image processing with overflowing cache缓存溢出的图像处理
【发布时间】:2018-08-02 05:15:45
【问题描述】:

已解决

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

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

这是我在循环中所做的事情

        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 像素......

我该如何解决这个问题?我可以以某种方式清理图像缓存吗?或者也许我可以增加图像处理缓存?还是……???

【问题讨论】:

  • 您应该将您的解决方案作为答案发布,而不是更新您的问题。在这里回答你自己的问题是完全可以接受的,人们可以投票给你积分!

标签: swift xcode image-processing uigraphicscontext


【解决方案1】:

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

这是很奇怪的情况,而且这个bug只出现在beta iOS 12中。在iOS 11中一切正常。

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

我通过以 0.1 秒的延迟异步运行每个图像操作链来解决这个问题。我认为这不是一个好方法,但在 100 张图像上,它的处理时间从 25 秒增加到 35 秒。而且效果很好。

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

编码愉快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多