如何在iOS 8 Photo Extensions中处理内存限制?

Fra*_*gel 7 memory ios8 ios8-extension

我在我现有的照片编辑应用程序中添加了一个新的iOS 8 Photo Extension.我的应用程序有一个非常复杂的过滤器管道,需要一次在内存中保留多个纹理.但是,在具有1 GB RAM的设备上,我可以轻松处理8 MP图像.

但是,在扩展中,存在更高的内存限制.我不得不将图像缩小到2 MP以下,以便在不破坏扩展名的情况下对其进行处理.我还认为只有在没有连接到扩展的调试器时才会出现内存问题.有了它,一切正常.

我做了一些实验.我修改了内存预算测试应用程序以在扩展中工作,并得出以下结果(显示崩溃前可以分配的MB的RAM数量):

??????????????????????????????????????????????????????????????
?        Device         ? App ? Extension ? Ext. (+Debugger) ?
??????????????????????????????????????????????????????????????
? iPhone 6 Plus (8.0.2) ? 646 ?       115 ?              645 ?
? iPhone 5 (8.1 beta 2) ? 647 ?        97 ?              646 ?
? iPhone 4s (8.0.2)     ? 305 ?        97 ?              246 ?
??????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

一些观察:

  • 附加调试器后,扩展程序就像"普通"应用程序一样
  • 即使4s只有一半的内存总量(512 MB)与其他设备相比,它从扩展系统获得相同的~100 MB.

现在我的问题是:我应该如何在照片编辑扩展中使用这么少的内存?一个包含8 MP(相机分辨率)RGBA图像的纹理单独吃~31 MB.如果我必须告诉用户只有在使用主应用程序时才能进行全尺寸编辑,这个扩展机制有什么意义呢?

你们其中一个人也达到了这个障碍吗?您是否找到了解决此约束的解决方案?

小智 3

我正在为我的公司开发照片编辑扩展,我们面临着同样的问题。我们的内部图像处理引擎需要超过 150mb 才能对图像应用某些效果。这还不包括全景图像,每个副本大约需要 100MB 的内存。

我们只找到了两种解决方法,但没有找到实际的解决方案。

  1. 缩小图像并应用滤镜。这将需要更少的内存,但图像结果很糟糕。至少扩展不会崩溃。

或者

  1. 使用 CoreImage 或 Metal 进行图像处理。正如我们分析的那样,Apple 的示例照片编辑扩展使用 CoreImage,可以处理非常大的图像甚至全景图,而不会造成质量或分辨率损失。实际上,我们无法通过加载非常大的图像来使扩展程序崩溃。示例代码可以处理内存为 40mb 的全景图,这令人印象深刻。

根据 Apple 的应用程序扩展编程指南,第 55 页,“处理内存限制”一章,扩展中内存压力的解决方案是检查您的图像处理代码。到目前为止,我们正在将我们的图像处理引擎移植到CoreImage,结果远远好于我们之前的引擎。

我希望我能帮上一点忙。马可·派瓦

  • 谢谢,马可。我猜想 CoreImage 会在底层进行平铺。我将尝试使用 Instruments 来弄清楚它到底在做什么。我的问题是我需要支持存储有符号值的纹理,据我所知,我现在无法使用 CoreImage 做到这一点。另一点是,自定义 CoreImage 滤镜仅在 iOS 8 中受支持,我仍然希望在我的主应用程序中支持 iOS 7。我想我最终会自己实现一个平铺机制。但很高兴知道 CoreImage 可以处理大图像。再次感谢。 (2认同)