在做一些测试时,我注意到我的 Cocos2D
应用程序运行得很糟糕。这很奇怪,因为该应用程序本身并没有进行大量计算,没有为每次更新安排项目,而且通常很简单。
除了我没有使用 TexturePacker
或类似工具优化图像之外,我想不出任何可能发生这种情况的原因。
在 Instruments
中使用内存分析器进行进一步测试后,我发现无论设备当前处于什么状态(运行应用程序、坐在主屏幕上等), map 都在使用20-30MB 的设备内存。 App Store 和 Springboard 同样使用相同的数量。我理解为什么 Springboard 需要在内存中保持运行,但到底为什么 map 和 App Store 在我的应用程序的沙箱中运行?
我认为一旦应用程序退出,它就不再在主内存中。我一直坚信任何应用程序都可以在其沙箱中运行,仅此而已 - 而且您不需要双击主屏幕并从快捷菜单中“强制退出”该应用程序。但是,强制退出 map 和 App Store 是释放必要内存的唯一方法。一直以来我的假设都是错误的吗?这只是我被迫为内存密集型应用程序解决的 Apple 问题吗?
最佳答案
应用程序并未“在您的沙箱中”运行;它们要么在自己的沙盒中运行,要么是没有沙盒的幸运 Apple 应用程序(我怀疑内置的是,而 App Store 安装的不是)。
iOS“沙盒”的目的是防止应用程序访问它们不应该访问的数据(读取和覆盖),而不是防止“退出”的应用程序使用 RAM。从 iOS 4(在 3GS+ 上)开始,“退出”的应用程序默认在后台加载,另外 Apple 允许 Safari 在后台保持加载,至少从 iOS 3 开始(我怀疑是从 iOS 1 开始——每次都重新加载页面)你切换到浏览器是非常糟糕的)。
非关键后台应用程序也无法阻止您的应用程序使用“必要内存”——操作系统会在必要时终止后台应用程序以释放内存。与典型的桌面不同,iOS 不使用交换 — 后台应用程序“正在使用”的内存本身不应减慢您的应用程序。
有几点我能想到:
- 后台应用程序仍然可以使用 CPU(如果是,仪器会告诉您)。这真的应该不是问题;我相信它们的运行优先级低于前台应用。
- 新 map 使用 OpenGL。如果 iOS 没有有效地处理后台 GL 上下文,它可能会导致问题。这将是一个非常严重的错误。
- 您的应用加载恰好纹理以触发内存警告,并通过丢弃所有纹理来处理内存警告(将
NSLog()
添加到-applicationDidReceiveMemoryWarning:
以找出答案)。如果您的应用程序在前台,请不要丢弃下一帧将需要的纹理。这可能是 Cocos2D 的一个错误。
如果不是内存警告,我会尝试分析应用程序以确定哪些位速度慢。
p.s. 还有不同“级别”的内存警告,但我不确定您是否可以访问它(也许它在 userInfo
的 UIApplicationDidReceiveMemoryWarningNotification
字典中)。在这种情况下,这无关紧要 - 如果下一秒再次使用内存,释放内存只会适得其反。
关于iOS - Apple App 沙盒不适用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15260749/