2013-07-27 51 views
0

我正在爲Android移動平臺開發一款遊戲,而且一切都很順利。但是,我想談談我在發展過程中注意到的一些問題,並且直到現在都忽視了這些問題。如何在使用LRUCache時防止內存分配?

我正在使用LRUCache存儲Android Bitmap對象與Integer鍵。問題是,當我嘗試在原始類型爲int的密鑰中將Bitmap存儲在LRUCache中時,Integer對象將分配內存與Integer.valueOf(int)以將原始整數轉換爲Integer對象等效項。

這是一切都很好,但它會在我的遊戲主循環的圖形渲染部分導致併發垃圾收集,從而導致幀速下降,在發生此垃圾收集時每隔一段時間都會產生明顯的延遲。下面是我的日誌的一部分,它測量了圖形渲染髮生的時間。我的渲染方法在很大程度上依賴於使用裝載從LRUCache Bitmap對象,所以這是可以理解爲什麼它會導致像下面,當分配很可能是相當頻繁發生的延遲:

07-27 17:55:41.418: W/Render(13937): Time: 28ms 
07-27 17:55:41.438: W/Render(13937): Time: 28ms 
07-27 17:55:41.468: W/Render(13937): Time: 29ms 
07-27 17:55:41.498: W/Render(13937): Time: 29ms 
07-27 17:55:41.528: D/dalvikvm(13937): GC_CONCURRENT freed 384K, 13% free 17265K/19756K, paused 3ms+1ms, total 17ms 
07-27 17:55:41.548: W/Render(13937): Time: 44ms 
07-27 17:55:41.578: W/Render(13937): Time: 27ms 
07-27 17:55:41.608: W/Render(13937): Time: 28ms 
07-27 17:55:41.628: W/Render(13937): Time: 28ms 
07-27 17:55:41.658: W/Render(13937): Time: 29ms 

有沒有什麼辦法解決Integer.valueOf(int)分配內存在我的應用程序?或者是否有一種替代接受基本類型的LRUCache,如int

回答

0

我不知道使用原始int鍵一個Java緩存,但它不應該太難以修改的開源緩存(如番石榴):刪除「工具Map」語句,以取代所有K小號int s,並用Object s代替所有V s(我沒有在我面前的源代碼,但我見過的每個Java緩存僅僅是一個Map<K, V>加上一些驅逐的邏輯)。您還需要用內聯散列函數替換對key.hashCode()的呼叫(只需在Google上搜索適當的代碼即可,您可以通過abs(key * prime_number) modulo size_of_backing_array獲得價格便宜的代碼)。

0

我創建了一個名爲Banana的新開源原始集合庫,您可以使用它。 那裏有一個LRU class那裏有原始的長鍵。 支持的數據是一個int,一個long或一個Java對象 - 這就是你所需要的。 請注意,香蕉通常不是線程安全的,因此請務必進行適當的同步。

PS:該項目還處於初期階段,我沒有正式發佈。 API可能在未來發生變化。

順便說一句,查看其他類像BlockAllocator和原始鏈表和地圖,我認爲它們對於Java遊戲編寫者特別有用。

相關問題