2013-01-23 51 views
3

我有一個非常消耗內存的應用程序 - 處理大型位圖。我已經使用衆所周知的技術來處理這些位圖(請在答案中沒有關於教程的鏈接...),以便它運行正常,但沒有任何異常,但僅在運行HC和ICS的設備上,Jelly Bean上的相同應用程序內存消耗高出近80%,導致用戶體驗不佳,該應用程序滯後且速度緩慢。Android Jelly Bean在Nexus 7上的內存消耗非常高

我準備了一個簡單的測試,在Eclipse中使用模板創建了最簡單的Android應用程序;該應用只有一個背景位圖(1280 x 800)的活動。搭載Android 3.1(華碩A500)裝置,它分配:

01-23 12:28:02.402: D/dalvikvm(31706): GC_FOR_ALLOC freed 65K, 4% free 6559K/6787K, paused 17ms 
01-23 12:28:02.402: I/dalvikvm-heap(31706): Grow heap (frag case) to 10.355MB for 4096016-byte allocation 
01-23 12:28:02.432: D/dalvikvm(31706): GC_CONCURRENT freed 1K, 3% free 10558K/10823K, paused 1ms+2ms 

在Nexus 7與豆形軟糖4.2.1它分配:

01-23 12:13:49.740: D/dalvikvm(23815): GC_FOR_ALLOC freed 84K, 4% free 7464K/7700K, paused 18ms, total 18ms 
01-23 12:13:49.750: I/dalvikvm-heap(23815): Grow heap (frag case) to 11.338MB for 4096016-byte allocation 
01-23 12:13:49.770: D/dalvikvm(23815): GC_FOR_ALLOC freed 1K, 3% free 11463K/11704K, paused 23ms, total 23ms 
01-23 12:13:49.800: D/dalvikvm(23815): GC_CONCURRENT freed <1K, 3% free 11463K/11704K, paused 2ms+2ms, total 23ms 
01-23 12:13:49.900: D/dalvikvm(23815): GC_FOR_ALLOC freed <1K, 3% free 11463K/11704K, paused 12ms, total 13ms 
01-23 12:13:49.920: I/dalvikvm-heap(23815): Grow heap (frag case) to 18.259MB for 7259056-byte allocation 
01-23 12:13:49.940: D/dalvikvm(23815): GC_FOR_ALLOC freed 0K, 2% free 18552K/18796K, paused 16ms, total 16ms 
01-23 12:13:49.960: D/dalvikvm(23815): GC_CONCURRENT freed <1K, 2% free 18552K/18796K, paused 3ms+2ms, total 17ms 

所以我有兩個問題:

1 ,爲什麼應用程序在其主要活動的背景上僅使用一個位圖時會消耗太多內存?

2,爲什麼在運行相同的應用程序時,JellyBean的設備的內存消耗幾乎高出80%?

EDIT1:

所有器件都具有相同的屏幕分辨率:1280 x 800像素的

+0

隨着果凍豆的UI的平滑性得到改善。可以通過對特定圖像和/或顯示區域進行雙緩衝來實現這一點? – Robert

+0

查看目標API設置爲15的'Bitmap'文檔,兩組方法變爲淺灰色,可能會影響內存使用:[isPremultiplied()](http://developer.android.com/reference/android/graphics/ Bitmap.html#isPremultiplied())和[hasMipMap()](http://developer.android.com/reference/android/graphics/Bitmap.html#hasMipMap())。也許其中的一個在平臺更新中將其默認值從false切換爲true? – Barend

回答

1

我遇到了同樣的事情 - 不幸的是我懷疑這是由以下事實導致的最新版本android會嘗試儘可能多地使用3D加速器 - 它們會將圖像的副本傳送到3D加速器,然後用於渲染用戶看到的實際像素。這就是爲什麼你看到更高的內存消耗。

至於可以做些什麼 - 不幸的是沒有太多。這種更高的內存使用率導致整體更平滑的用戶界面(這是項目黃油,在Android 4.1中出現)。如果您已經查看了各種教程,例如谷歌搜索結果displaying bitmaps efficiently,那麼我可以建議的是嘗試在清單的應用程序元素中打開largeHeap - 這對我來說很有用。

此外,根據您的應用程序的工作方式,可能會回收位圖。來自google的This DevBytes video解釋瞭如何。