【问题标题】:iOS, iPhone, iPad: is slow loading a good strategy to avoid memory crashes?iOS、iPhone、iPad:缓慢加载是避免内存崩溃的好策略吗?
【发布时间】:2011-08-23 07:26:52
【问题描述】:

这个问题是this other question的后续问题。

我在 App Store 上有一款游戏,在 iPad1 上加载时很少会崩溃。该游戏是资源密集型的,并且确实在启动时加载了几个大型纹理。重新启动设备会使问题消失。我无法在自己的设备上重现这一点,所以我只有少数客户的报告/数据。

(为了这个问题,我们假设(a)我的应用确实需要加载它加载的所有纹理,并且(b)我没有做任何愚蠢的事情,比如泄漏某些东西或不处理某些东西尽可能早。)

问题是:尝试更慢地加载纹理是否有意义?

我的想法是,当我的应用程序在启动时加载纹理时,它会很快耗尽内存。如果有其他常驻应用程序正在用完我需要的内存,操作系统将开始向这些应用程序发送通知,告知它们应该释放内存。但我的理解是,它让这些应用程序有几秒钟的时间来释放内存和/或退出,在这几秒钟内,我的应用程序继续积极加载纹理。所以想法是操作系统恐慌,需要立即杀死某些东西,并杀死我的应用程序。但也许如果我加载速度较慢,其他应用程序将有时间响应内存警告并释放内容,一切都会顺利进行。

这种思路有意义吗?您有使用这种方法避免崩溃的经验吗?

【问题讨论】:

  • 您是否尝试过使用仪器来跟踪您的内存使用情况?如果您的内存使用量在负载时急剧增加,那么这可能就是导致崩溃的原因。我在一个应用程序中遇到了类似的问题,它只在运行 iOS 3.2(没有虚拟内存!)的 iPad 1 上出现,并且随着时间的推移错开负载似乎确实有帮助。
  • 谢谢。你能说出你是如何错开负载的吗?比如,你每秒加载多少(或任何时间单位),你减慢了多少让它表现得更好?
  • 我的方法并没有那么复杂——我只是将我在 viewDidLoad 方法中调用的内容剥离到我需要让用户开始使用的绝对最低限度,然后调用我需要的其余部分稍微延迟后的另一种方法。即 [self performSelector:@selector(yourDelayedLoadMethod) withObject:nil afterDelay:.2]; 或 viewDidLoad 方法末尾的类似内容。我的延迟很短暂,但在某些设备上似乎确实有帮助。

标签: ios ipad memory crash timing


【解决方案1】:

一开始就加载所有内容的一个问题:根据您何时加载,您可能需要很长时间才能启动,并且看门狗计时器会因为您的应用程序无响应而终止。 (听起来这不是发生在您身上的事情,但这是理论上的可能性。很容易在崩溃日志中发现 0x8badf00d。)

【讨论】:

  • 这很好。你知道在它决定你没有响应之前你需要多长时间开始处理事件?它是否因操作系统或设备类型而异?实际上,这里似乎可以与内存管理器进行交互:我加载了一些资源,它向我(和其他正在运行的应用程序)发送内存警告,但我正忙于加载更多资源来响应它们。
  • 我相信它没有明确记录,因此可以根据需要进行调整。今年 WWDC 上的“iOS Performance and Power Optimization with Instruments”演讲确实给出了一些数字,这取决于系统在做什么(Launch 与 Resume 不同,所以如果你在进入后台时清空缓存然后重新加载,你可能会被烫伤)。启动计时器很容易避免 - 在您启动之前不要加载。
猜你喜欢
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 2011-10-10
  • 1970-01-01
相关资源
最近更新 更多