我在现有的照片编辑应用程序中添加了新的 iOS 8 照片扩展。我的应用程序有一个相当复杂的过滤器管道,需要一次在内存中保存多个纹理。但是,在具有 1 GB RAM 的设备上,我可以轻松处理 8 MP 图像。
然而,在扩展中,内存限制要高得多。我必须将图像缩小到 2 MP 以下,才能在不导致扩展崩溃的情况下对其进行处理。我还认为内存问题仅在没有将调试器附加到扩展时发生。有了它,一切都运转良好。
我做了一些实验。我修改了一个memory budget test app在扩展中工作并得出以下结果(显示在崩溃之前可以分配的 RAM 量(以 MB 为单位)):
╔═══════════════════════╦═════╦═══════════╦══════════════════╗
║ 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 ║
╚═══════════════════════╩═════╩═══════════╩══════════════════╝
一些观察:
- 附加调试器后,扩展程序的行为就像“正常”应用程序
- 尽管 4s 的内存总量只有其他设备的一半 (512 MB),但它从系统中获得了约 100 MB 的内存用于扩展。
现在我的问题是:我应该如何在照片编辑扩展中使用这么少量的内存?包含 8 MP(相机分辨率)RGBA 图像的一个纹理单独占用约 31 MB。如果我必须告诉用户只有在使用主应用程序时才可以进行全尺寸编辑,那么这个扩展机制有什么意义?
你们中有人也达到了这一障碍吗?您是否找到了规避此限制的解决方案?
最佳答案
我正在为我的公司开发照片编辑扩展,我们面临着同样的问题。我们的内部图像处理引擎需要超过 150mb 才能对图像应用某些效果。这还不包括全景图像,每个副本大约需要 100mb 的内存。
我们只找到了两种解决方法,但没有找到实际的解决方案。
- 缩小图像并应用滤镜。这将需要更少的内存,但图像结果很糟糕。至少扩展程序不会崩溃。
或
- 使用 CoreImage 或 Metal 进行图像处理。正如我们分析的Sample Photo Editing Extension苹果公司的产品使用 CoreImage,可以处理非常大的图像甚至全景图,而不会造成质量或分辨率损失。实际上,我们无法通过加载非常大的图像来使扩展程序崩溃。示例代码可以处理内存为 40mb 的全景图,这令人印象深刻。
根据Apple的App Extension Programming Guide ,第 55 页,“处理内存限制”一章,扩展中内存压力的解决方案是检查图像处理代码。到目前为止,我们正在将我们的图像处理引擎移植到CoreImage,结果远远好于我们之前的引擎。
希望能帮上一点忙。 马可·派瓦
关于memory - 如何处理 iOS 8 Photo Extensions 中的内存限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41577160/