使用CIImage
时,在创建CIIMage
时,我的内存大幅跳跃50MB-60MB,然后当我尝试创建UIImage
结果时,我的程序崩溃。
CIImage *image = [CIImage imageWithData:data]; // +50MB memory increase (data is jpeg data)
它不会一直发生,但对于较大的图像(3264x2448)以及应用程序处于后台模式时会更频繁地发生。
导致频繁崩溃。有什么想法吗?
答案 0 :(得分:1)
Core Image对图像尺寸有严格的限制。 iOS 8在很大程度上提升了这些限制;如果您使用的是较早的系统,请不要这样做(即将自己局限于较小的图像)。在iOS 7及更早版本中,GPU仅适用于尺寸小于4K的图像,实际上非常小。
此外,在后台使用核心图像受到严重限制,因为,毕竟,你的应用程序如何敢于尝试从后台进入GPU(一个小而忙碌的地方),当一些前景应用可能是使用它?您被迫使用CPU(尽管在某种程度上,这种限制在iOS 8中被取消)。
因此,很可能你的问题部分与内存有关(你试图将核心图像用于太大的图像)和部分线程相关(如果你使用的是CPU,你需要确保你'在后台线程上,因为这将需要一个LOOOOONG时间,如果你挂断主线程,看门狗会杀死你。)
要考虑的另一件事是你自己如何管理记忆。您没有显示任何相关代码,因此很难说,但可能是您依赖于您不需要的数据。您应该显示您的代码,理想情况下,您应该使用Instruments分析您的应用程序,以便准确了解问题所在。
例如,您引用的唯一代码行是
CIImage *image = [CIImage imageWithData:data]
这表明您将数据保存在内存中。这完全没必要。如果你正确地玩你的牌,你可以直接从磁盘上的图像文件获得CIImage并直接创建输出到磁盘而不占用任何额外的内存。如果你只是因为你形成了一个CIImage来生成大内存,那么你可能做错了(CIImage只是一个指针,而不是一个位图);需要任何内存的唯一时刻是最终渲染,其中形成了位图,您可以使用ImageIO将其输出到磁盘而不将其保留在内存中。