当内存超过 40MB 时,基于 Unity 的应用程序在 iPad 1 上崩溃

Posted

技术标签:

【中文标题】当内存超过 40MB 时,基于 Unity 的应用程序在 iPad 1 上崩溃【英文标题】:Unity-based application crashes on iPad 1 when memory exceeds 40MB 【发布时间】:2012-05-08 03:38:47 【问题描述】:

我知道这可能是 Unity 特有的,但我在这里问它的原因是因为这是一个关于 iPad 和内存使用的一般性问题......

我们有一个 Unity3D 游戏项目(不是我创建的,但我正试图帮助找出它崩溃的原因)。它包含任何一次加载的大约 8 个纹理,大小均为 512x512。游戏中屏幕上的多边形可能不超过 10,000 个。

当我们在 iPad 2 上通过 Instruments 运行它时,它的峰值约为 60 MB,这似乎完全在该机器的内存容量范围内。然而,当我们尝试在 iPad 1 上运行它时,即使在重新启动以清除内存后,Instruments 显示它在崩溃之前也有大约 40 MB 的加载量。

iPad 1 不能处理超过 40 MB 有什么原因吗?我知道 iPad 1 只有 256 MB 与 iPad 2 的 512 MB 相比,但这肯定在设备的能力范围内吗?

编辑:iPad 1 运行 ios 4.2.1,iPad 2 运行 iOS 5.1。

【问题讨论】:

【参考方案1】:

我们不知道 iPad 1 上安装的 iOS 版本,它可以改变操作系统使用的基本内存。

根据我的经验,在调用内存警告之前,40MB 的限制与我过去在只有 256MB RAM 的 Apple 设备上看到的 30-50MB 范围一致。

【讨论】:

知道这一点很有用,谢谢。 iPad 1 运行 iOS 4.2.1。令我惊讶的是,与许多完整的 iOS 游戏相比,我们在我们的游戏中做得并不多。我们已经考虑过使用纹理图集,但这将是很多工作。你觉得值得一试吗? 对于我来说你可以考虑不支持iPad 1:与iPad 2和新iPad相比,它的CPU/GPU非常糟糕! 但你不能那样做,对吗?我听说除非您检查特定硬件,否则无法进行限制,例如前置摄像头......然后Apple可能不会允许,除非我们实际使用前置摄像头。 您可以添加所需的限制并使用不同的硬件要求来排除特定设备。您不需要实际使用相机来要求它。 那真的可以只使用 UIRequiredDeviceCapabilities 吗?我在这里的其他地方读到,将它用于您不使用的硬件会导致您的应用程序被拒绝(现在找不到链接)。这不是真的吗?【参考方案2】:

您无需放弃对 iPad1 的支持即可让您的应用正常运行。避免此问题的方法是解压缩纹理,然后将每个纹理写入文件。然后,内存映射每个文件并使用内存映射地址而不是正常的内存地址。 iOS设备可以通过这种方式从一个文件中映射大约700兆的数据,你可以通过普通的opengl方式将内存发送到显卡。

【讨论】:

以上是关于当内存超过 40MB 时,基于 Unity 的应用程序在 iPad 1 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

ios运行时内存限制

使用少量内存时 ipad 应用程序内存警告

Spring Boot 嵌入式 tomcat 服务器占用 800 MB 内存?

应用级缓存

如何永久增加java堆内存?

在 32 位 .NET 进程中分配超过 1,000 MB 的内存