iPad1内存神秘与我的纹理密集型游戏应用程序

时间:2011-08-22 01:41:31

标签: ipad memory crash ipod-touch

对于模糊的标题感到抱歉,但不太确定如何总结这个标题。

事实是:

  • 我的游戏已被Apple批准并且在App Store上。
  • 这是一款通用应用。它在小屏幕上使用为320x480设计的纹​​理,并在视网膜和iPad屏幕上使用更大的纹理(大约四倍)。
  • 在开发它时,我有时会在控制台日志中看到低内存警告,但在阅读完这些后,似乎它们通常有点虚假/不重要,无论如何我没有崩溃,我的测试人员在各种设备(iPod Touch第二代,iPod Touch第四代,iPhone3,iPhone4,iPad1,iPad2)都没有看到崩溃。
  • 当我开始通过TestFlightApp将应用程序分发给更广泛的beta测试人员时,我得到了一些人在应用程序加载时看到崩溃的报告,或者在用户从主菜单和应用程序中选择了一个级别后很早的报告正在加载关卡纹理。我们发现如果这些用户刚刚重新启动他们的设备,他们就不再有问题了。由于这是我们第一次看到这样的问题,我们把它归结为TestFlightApp正在做的事情,一些有趣的状态是它在安装后离开了设备(我们和TestFlightApp讨论了这个问题,他们从来没有听说过这样的事情)。
  • 如上所述,Apple批准了该应用程序,它在App Store上。在它上线后不久,我们收到一些iPad1用户的报告,说它在应用程序加载时崩溃,或者很快就会出现与我们在某些TestFlightApp用户看到的相同的事情。再次类似于TestFlightApp用户,这些客户报告说重新启动通常会解决问题。但它并不那么好,因为问题往往会再次出现。其中一个用户向我发送了几个LowMemory ...日志文件,这些文件是在她同步iPad后从她的电脑上下来的。大约有10个这样的文件,其中 none 在进程列表中列出了我的程序。相反,它显示标记为(活动)或(放弃)的其他程序,“最大进程”可以是从MobileSafari到Kobo的任何内容,但我的应用程序从未被列出。所以,我不明白,但最重要的是,至少对于这个用户来说,有些东西正在推动内存超过某些限制,我的应用程序无法正常运行。
  • 我已经回去和一位TestFlightApp beta测试人员交谈,结果发现他确实有时会再次崩溃,所以这不仅仅是TestFlightApp的一些残留。然而,对他而言,崩溃的频率远低于此客户。
  • 该游戏的其他iPad1测试人员从未遇到任何麻烦。他们报告称,他们每天都会玩游戏几个小​​时,将iPad与其他几个应用程序一起使用,很少将其关闭。同样地,我的iPod Touch第4代从未出现过崩溃,它类似于iPad1,它有一个高分辨率屏幕,但只有256k RAM。

所以,对于我来说这些特定用户的iPad可能会有什么不同,这是非常神秘的。重启设备后游戏仍然有效,但是一些应用程序运行后游戏(有时)加载有问题。我的理解是,如果我的游戏需要内存,操作系统将根据需要自动关闭正在运行的任何其他应用程序,以有效地将内存量恢复到新重启设备上可用的数量。我唯一的结论是,在运行一些应用程序后,设备处于可用内存较少的状态,因为操作系统无法回收某些内存块或关闭某些应用程序。

不幸的是,我没有开发这些“行为不端”的设备之一。我所能想到的就是尝试将我的应用程序的内存需求减少一定量,然后将其发送给遇到问题的其中一个用户,看看它是否修复了问题。然而,这似乎是一种潜在的低效率方法。

有人有更好的主意吗?

1 个答案:

答案 0 :(得分:2)

听起来像纹理加载期间的内存峰值是导致应用程序在某些设备上终止的原因。在加载所有内容之后,它可能会使用比在初始加载结束时更少的内存。这可以通过推送到虚拟内存的东西来解释,而直接纹理加载可能会以过多的分配轰炸RAM。我的建议是:

  • 在加载过程中更加积极地销毁临时数据结构(release一个临时结构,其所有有用的值都被其他东西读取/提取出来)
  • 对于autorelease d个对象,请始终保持NSAutoreleasePool左右;如果使用极为多的drain d个对象,您甚至可能希望在一个方法的过程中多次alloc并重新autorelease一个池。
  • 这可能听起来很愚蠢......故意减慢你的装载过程。如果你摆脱并行加载(一次加载多个对象)或者可能在加载线程/方法中插入手动时间延迟,这可能会让操作系统有更多的时间将内容推送到虚拟内存,因此Watchdog不会将应用程序检测为是一头RAM猪。

编辑:实现较慢加载的一种可能策略:如果/当您收到低内存警告,暂停或缓慢加载几秒钟以给其他应用程序时间来降低内存使用量,然后继续以正常速度加载。

即使我错了(如果LowMemory...log文件显示虚拟+物理使用情况,因此您的应用甚至没有那么多),我建议然后整合错误报告,例如QuincyKit所以当你在野外遇到这个bug时,你会通过电子邮件收到回溯和崩溃说明。