2011-08-18 101 views
3

我有一个非常简单的游戏,现在在市场上。这是一个简单的基于文本的游戏,不涉及2D或3D图形。它使用适当大小的PNG作为背景。除此之外,它纯粹是基于文本的。减少Android应用程序中的内存使用量

关于游戏没有任何cpu或图形密集,但它平均约25mb的内存使用量。相比之下,大多数CPU密度更高的应用程序平均约为18MB。

在移动应用程序中,每兆字节计数,所以我该如何正确减少我的应用程序中的内存使用量?我知道这可能是一个模糊的问题,但我会很乐意详细说明,如果有需要的话。

谢谢

+0

可能需要查看一些代码。 –

+0

游戏的基础是你按下按钮,屏幕上出现新的文字。该按钮调用一个从文本文件中抓取文本并显示它的方法。没有多少内容,这就是为什么25mb内存的使用让我感到困惑。 –

回答

1

你应该做的第一件事就是在内存使用率很高的时候从应用程序中获取内存转储,并使用Eclipse Memory Analyzer来计算实际使用内存的情况。

编辑: 这些链接可能会有所帮助:

Android ==> Memory Analysing ==> Eclipse memory analyzer?

http://www.vogella.de/articles/EclipseMemoryAnalyser/article.html

+0

我会试试这个。我从来没有使用过这个,更不用说在Android环境中。 –

+0

所以我得到了堆转储。我只是不确定什么被认为是“正常的”可疑的内存泄漏。我第一个怀疑的人说:“”加载的2,367个“java.lang.Class”实例占用890,944(35.89%)个字节。 第二个说“由”<系统类加载器>“加载的”java.lang.String“的7,774个实例占用488,864(19.69%)个字节。” –

0

为了减少内存,您可以从应用程序服务器下载一些图形。也许一些文本文件,或者你正在使用的PNG文件。实际上,你可以有多数安装在您的资源的应用程序从应用服务器,比如安装后Amazon s3

编辑:

如果使用字符串缓冲区,认为这可能是与StringBuffer的的性能优化做toString()方法。

太阳的javadoc说以下内容:

这种方法可以被编码,从而不分配新的内存来保存字符序列的拷贝来创建一个新的String对象。相反,该字符串可以共享字符串缓冲区使用的内存。任何后来改变字符串缓冲区内容或容量的操作都必须在此时创建内部缓冲区的副本。当使用字符串缓冲区实现字符串连接操作时,此策略对于减少分配的内存量非常有效。

因为您可能会重新使用带有setLength(0)的StringBuffer,它可能会保留对使用toString()创建的所有字符串的引用。

替换:

.setLength(0);

与:

“Your String buffer”= new StringBuffer();

看看是否能解决它。因为在这两种情况下,您都需要创建一个新的char []数组,因为在第一种情况下,该数组正由使用toString()创建的字符串使用。

另外,您应该考虑使用StringBuilder,因为它们比StringBuffer更受欢迎。

Check here

+0

因此,从网站下载后台文件实际上会比使用.apk打包内存时使用更少的内存?它实际上仅使用约3个不同的背景图像,每个背景图像从180KB到350KB不等。这是为了HDPI屏幕。 –

+0

嗯....你使用任何缓存的应​​用程序,或任何类型的临时或长期存储?比如SQLite? – yoshi24

+0

看看我的编辑 – yoshi24

0

如果你的图片内容包括任何重复的部分,您可以在几个图像分割并使用它们如瓷砖。

Nine patches可以用来做到这一点很容易,假设您的图片坚持九个补丁格式。

+0

有关,我曾经想过把我的背景变成9patch格式,但是我现在的布局和设计很不幸很不重复。 –

9

在同一进程和线程在同一应用程序运行的所有组件。服务的内存使用量可能与整个应用程序的使用量一样大。

尝试在单独的进程中运行服务将解决此问题。

添加android:process=":yourname"到AndroidManifest.xml中象下面这样:

<service android:name=".MyService" android:process=":yourname"> </service>

在我的情况,从12MB到3MB一个简单的服务改变了内存使用情况。

+0

加入'''android:process'''可以使它从〜9MB减少到〜3MB。谢谢 – Muatik

+0

你知道这个解释为什么这个工程?谢谢! – vida

相关问题