iOS - Apple App 沙盒不适用?

标签 ios cocos2d-iphone

在做一些测试时,我注意到我的 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. 还有不同“级别”的内存警告,但我不确定您是否可以访问它(也许它在 userInfoUIApplicationDidReceiveMemoryWarningNotification 字典中)。在这种情况下,这无关紧要 - 如果下一秒再次使用内存,释放内存只会适得其反。

关于iOS - Apple App 沙盒不适用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15260749/

相关文章:

ios - Objective-C:以编程方式查看进度

iOS - 调整 UIImage 的色调

ios - Cocos 2d画线不起作用

iphone - 如何知道xcode中方法的返回类型? - iPhone开发

c++ - Cocos2d - 找不到 cassert 文件

ios - 将 UITableViewCell 中的 UISwitch 定位到右侧

ios - 区分两个 JSON 响应

ios - 按 ID 对数组进行排序,并在数组中分隔相同的 ID

xcode - 如何将我的 .m 文件更改为 .mm 文件?

iphone - 在 iPhone/iOS 上绘制网格网格并与之交互