0

在进行一些测试时,我注意到我的Cocos2D应用程序非常糟糕。这很奇怪,因为应用程序本身并没有进行密集计算,每次更新都没有安排项目,而且通常很简单。

除了我没有使用TexturePacker等优化图像这一事实之外,我想不出任何可能发生这种情况的原因。

在使用内存分析器进行进一步测试后Instruments,我发现无论设备当前处于什么状态(运行应用程序、坐在主屏幕等),地图都使用了 20-30MB 的设备内存。App Store 和 Springboard 的使用量也相同。我明白为什么 Springboard 需要在内存中保持运行,但究竟为什么 Maps 和 App Store 在我的应用程序的沙箱中运行?

我认为一旦退出应用程序,它就不再位于主内存中。一直以来,我一直相信任何应用程序都可以在其沙箱中运行,仅此而已 - 并且您不需要双击主屏幕并从快速菜单中“强制退出”应用程序。但是,强制退出地图和 App Store 是释放必要内存的唯一方法。我的假设一直都是错误的吗?这只是Apple的东西,我被迫为内存密集型应用程序工作吗?

4

1 回答 1

4

应用程序未在“您的沙盒中”运行;它们要么在自己的沙盒中运行,要么是没有沙盒的幸运 Apple 应用程序(我怀疑内置的应用程序是沙盒的,而 App Store 安装的则不是)。

iOS“沙盒”的目的是防止应用程序访问它们不应该访问的数据(读取和覆盖),而不是防止“退出”的应用程序使用 RAM。自 iOS 4(在 3GS+ 上)以来,“退出”的应用程序默认保持在后台加载,另外,Apple 至少从 iOS 3 开始就允许 Safari 在后台保持加载(我怀疑从 iOS 1 开始——每次都重新加载页面你切换到浏览器非常糟糕)。

非关键后台应用程序也无法阻止您的应用程序使用“必要内存”——操作系统将在必要时终止后台应用程序以释放内存。与典型的桌面不同,iOS 不使用交换——后台应用程序“正在使用”的内存不应该固有地减慢你的应用程序的速度。

我能想到几件事:

  • 后台应用程序仍然可以使用 CPU(仪器会告诉您它们是否可用)。这真的不应该是一个问题。我相信它们运行的​​优先级低于前台应用程序。
  • 新地图使用 OpenGL。如果 iOS 没有有效地处理后台 GL 上下文,它可能会导致问题。这将是一个非常严重的错误。
  • 您的应用程序加载的纹理刚好足以触发内存警告,并通过丢弃所有纹理来处理内存警告(添加NSLog()to-applicationDidReceiveMemoryWarning:以找出答案)。如果您的应用程序位于前台,请不要丢弃下一帧所需的纹理。这可能是一个 Cocos2D 错误。

如果不是内存警告,我会尝试分析应用程序以确定哪些位很慢。

ps内存警告也有不同的“级别”,但我不确定你是否可以访问它(也许它在 dict 的userInfodict 中UIApplicationDidReceiveMemoryWarningNotification)。在这种情况下,这无关紧要——如果你在下一秒再次使用它,它只会适得其反。

于 2013-03-07T02:03:49.443 回答