2011-08-18 69 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