Android应用程序如何使用>=256Mb的RAM?

4
据我所知,每个Android手机都将所有应用的最大内存使用限制在约16、24或32Mb左右。我刚刚看到有人讨论了Dungeon Defenders这个应用程序,它似乎使用了256 Mb的RAM。
应用描述:“最低要求:512 MB RAM(运行时256 MB可用)” http://www.appbrain.com/app/dungeon-defenders%3A-first-wave/com.trendy.ddapp 一份指南,介绍如何在需要自定义ROM才能获得256 MB可用RAM来运行游戏的Droid上运行此游戏: http://www.forums.trendyent.com/showthread.php?447-How-to-play-Dungeon-Defenders-on-your- Motorola-Droid-Milestone-(requires-root)
这是怎么做到的?有人知道这里发生了什么吗?如果可以访问那么多的RAM,对我正在进行的某些项目会更容易编写,因此我非常想知道这个游戏在做什么。
4个回答

1
在德国柏林的droidcon上,我听说你不能增加应用程序在dalvik端可以使用的RAM数量。您可以在本机端使用所有可用内存,因此我猜测该应用程序已经使用NDK在C中实现了重型内存操作。这是我知道的唯一可能的解决方案... 更新:这不是会议,而是我在大学参观Google实验室时与Reto Meier和同事们的交流。

“您可以在本地端使用所有可用的内存”。您确定吗?例如,当您创建位图对象时,Android会跟踪您正在使用多少“本地”内存。如果这是真的,那么我不能通过编写一个NDK函数来分配内存并将其传回Java来滥用它吗?有什么方法可以防止应用程序使用所有可用内存并使系统不稳定? - rbcc
我从未尝试过这个(我不会写C/C++代码:/),所以这只是我听说的。如果我没记错的话,这不是在一个会议上,而是在我的大学里参加了一个Google实验室活动,与Reto Meier和他的三个朋友一起。因此,我认为这个信息应该是可靠的。如果有人能用例子证明这一点,我会非常高兴看到它。 - WarrenFaith
谢谢提供信息。我非常有兴趣看到这方面的代码。例如,目前我在Java中使用了2个大整数数组(用于图像处理效果)。如果我能以某种方式在C中分配它们,我可以严重减少我的应用程序的内存占用。 - rbcc

0

我在我的应用程序中使用NDK。 在我的测试设备(HTC Magic,Android 2.2)中,当我超过16mb的限制时,应用程序会崩溃,并且系统会抛出无效地址访问的异常。

因此,无论是从本地端还是从Java管理端,您都不能使用所有您想要的内存。

我已经阅读过关于在运行应用程序时使用不同的.so库并加载它们的信息,但我不知道它如何工作,或者是否是可行的解决方法。有什么建议吗?


嗯,这很奇怪。HTC Magic 显然有 288Mb 的 RAM。当我使用超过 16Mb 时,配置了较少 RAM 的模拟器并不会崩溃。无效地址异常听起来非常奇怪。我本以为你会得到一个内存不足异常或 malloc 返回 null。 - rbcc

0
据我所知,自2.2版本以来,Android能够使用超过256MB的RAM。
然而,大多数手机显示的RAM容量都比实际少,因为总会有一些RAM被系统保留。

当在运行Android 2.2的HTC Desire上超过24Mb时,我会遇到“java.lang.OutOfMemoryError: bitmap size exceeds VM budget”错误。您是否有任何更多关于您发布内容的信息链接? - rbcc
我的意思是整个系统!我也不知道一个应用程序如何访问这么多的RAM。 - Beasly

-1

如果您不需要实时渲染图像,答案很简单,只需将图像发送到服务器,并使用一些图像处理命令在服务器上进行渲染,然后将其发送回 Android。如果您的应用程序需要>256MB RAM,则会严重限制您的大部分受众,这是不好的。


这个解决方案只有在您能够承担带宽和CPU成本的情况下才有效。顺便说一下,我的应用程序不需要256 MB的RAM,只需要大约30或40 MB(比典型限制高约30%)。我已经进行了一些测试,似乎可以安全地使用此功能而不发生风险性崩溃。 - rbcc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接