【发布时间】: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