如何加载包含数百个 UIImage 实例的数组而不会因为内存激增而导致应用程序崩溃?

Posted

技术标签:

【中文标题】如何加载包含数百个 UIImage 实例的数组而不会因为内存激增而导致应用程序崩溃?【英文标题】:How to load an array with hundreds of UIImage instances without crashing the app because of the memory surge? 【发布时间】:2018-10-20 15:50:24 【问题描述】:

我有一个包含 250 帧的动画。每帧都是 1080x1920 分辨率和 PNG 格式。我需要拍摄所有这些帧,使用CAKeyframeAnimation 对其进行动画处理,然后使用AVFoundation 工具将它们渲染到视频中。

当我尝试为CAKeyframeAnimation 创建一个values 数组时,问题就出现了。初始化 250 张全高清图像会导致相当大的内存峰值,系统会检测到并决定终止应用程序。 我尝试过使用autoreleasepool,但它似乎根本没有帮助(难怪,因为CAKeyframeAnimation 需要保留这些图像)。

问题更进一步:我实际上有 10 个这样的动画!而且我需要在它们之间快速切换,因为该应用允许在导出视频文件中的所有内容之前动态预览这些动画(通过AVSynchronizedLayer 完成)。

所以我的问题是:如何加载大量 UIImage 实例,而不会因为内存激增而导致系统终止应用程序?是否有异步加载方式?

【问题讨论】:

【参考方案1】:

如何加载大量 UIImage 实例,而不会因为内存激增而导致系统终止应用?

你不能。你试图做的事情从一开始就是错误的。

如果目标是通过使用关键帧动画定期更改图层的内容来制作“精灵动画”,则动画应包含 smallsmall 个em> 图片。

如果目标是基于一系列图像制作视频,那么关键帧动画首先不是如何做到的。

【讨论】:

例如,请参阅***.com/questions/3741323/…。但是不要按照它的建议来形成[UIImage]!形成一个图像 names 数组,并根据需要一次仅加载 一个 图像,注意不要在加载图像时缓存图像。 ImageIO 框架为您提供了执行此操作的工具。 目标是通过使用关键帧动画制作“精灵动画”,并在全高清视频上实时渲染该动画(然后可以选择导出该视频)。通过减少帧数或降低图像质量来牺牲动画持续时间不是一种选择,所以我想我必须深入研究其他一些选择。无论如何,谢谢你的帮助!

以上是关于如何加载包含数百个 UIImage 实例的数组而不会因为内存激增而导致应用程序崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

具有数百个输入的巨大 React 状态数组,状态变化缓慢 onChange

使用 AFNetworking 同时处理数百个请求

具有数百个全屏图像的 UIImageView

如何从子目录加载张量流中的数据

包含 SwiftyJSON 时返回数百个错误

超简便!不停机搞定数百个Zookeeper实例到K8S的迁移