2012-01-26 24 views
1

我正在開發Android遊戲(2D平臺遊戲),並且遇到內存不足問題。我盡我所能減少了在給定時間內存儲在內存中的位圖數量,但我仍然遇到問題。幾個簡單的問題。重複使用Android中的位圖

1)下面的代碼是否正確地爲敵人的每個實例使用一個位圖?

Bitmap pusher2 = BitmapFactory.decodeResource(res, R.drawable.pusher_white); 
Bitmap stinger2 = BitmapFactory.decodeResource(res,R.drawable.stinger_glow_v2_135x135) 
Bitmap lightTrap2 = BitmapFactory.decodeResource(res, R.drawable.light_trap_v3_64x33); 

Enemy e21 = new Enemy(assets, pusher2, Enemy.SLIME, 32, 42, 12, 12, 17*32, 61*32-32, -50, 0); 
Enemy e22 = new Enemy(assets, pusher2, Enemy.SLIME, 32, 42, 12, 12, 27*32, 57*32-32, -50, 0); 
Enemy e23 = new Enemy(assets, pusher2, Enemy.SLIME, 32, 42, 12, 12, 47*32, 34*32-32, -50, 0); 
Enemy e24 = new Enemy(assets, pusher2, Enemy.SLIME, 32, 42, 12, 12, 10*32, 29*32-32, -50, 0); 
Enemy e25 = new Enemy(assets, pusher2, Enemy.SLIME, 32, 42, 12, 12, 19*32, 29*32-32, 50, 0); 
Enemy e26 = new Enemy(assets, pusher2, Enemy.SLIME, 32, 42, 12, 12, 35*32, 20*32-32, -50, 0); 
Enemy e27 = new Enemy(assets, stinger2, Enemy.STINGER, 135, 135, 22, 22, 32*32, 57*32-135, 144, 0, 23*32, 42*32); 
Enemy e28 = new Enemy(assets, stinger2, Enemy.STINGER, 135, 135, 22, 22, 30*32, 40*32-135, 144, 0, 26*32, 41*32); 
Enemy e29 = new Enemy(assets, stinger2, Enemy.STINGER, 135, 135, 22, 22, 35*32, 6*32-135, 144, 0); 
Enemy e2a = new Enemy(assets, lightTrap2, Enemy.LIGHT_TRAP, 33, 64, 5, 24, 30*32, 21*32-33, 0, 0); 
Enemy e2b = new Enemy(assets, lightTrap2, Enemy.LIGHT_TRAP, 33, 64, 5, 24, 40*32, 21*32-33, 0, 0); 
Enemy e2c = new Enemy(assets, lightTrap2, Enemy.LIGHT_TRAP, 33, 64, 5, 24, 34*32, 13*32-33, 0, 0); 

2)我常用的改變方向的方法是用鏡像副本替換精靈表。這種方法對於玩家來說很好,但如果他們都指向同一張表,那麼對於敵人來說似乎不可能。我是否需要在存儲器中存儲每個敵方精靈表的鏡像副本和未鏡像副本,還是有更好的方法?

3)除了位圖以外,我的應用程序是否存儲在本機堆上?有什麼方法可以查看它並查看內容?這是在我回收所有的位圖後,大約6K加載一個新的水平,我覺得這有點高..

在此先感謝!

回答

1

首先,想問你一個問題:OutOfMemory何時發生?在加載位圖時,還是在遊戲中間?

下面是現在,我使用了很長一段時間的做法,似乎是最方便的對我說:

  1. 創建一個類,將加載和卸載應用程序中的所有Bitmaps
  2. BitmapManager(讓我們這樣稱呼)的對象的參考Bitmap類公開。
  3. 不要在類中持有對Bitmap對象的引用,只需在對象的onDraw方法內使用對BitmapManager對象的引用即可。

當創建鏡像Bitmaps時,一定不要在運行時創建它們。加載位圖時全部鏡像它們,否則它們會殺死您的應用程序。希望這可以幫助。

+0

當我在一個關卡的開始位置加載位圖時發生。我必須加載一個背景,一個畫面大小的位圖來繪製關卡,並且爲玩家和敵人提供spritesheets。順便說一句,將所有玩家精靈存儲在一張紙上而不是每張動畫的獨立紙張上有什麼好處? –

+0

@CodyAlbert,從未在原生Android遊戲開發中使用過spritesheets,所以不能回答你的問題。 – Egor

+0

假設一個人回收了一個位圖'bm.recycle()',試圖重新加載相同的位圖失敗,出現'IllegalStateException '。有關如何重新加載位圖後回收的任何想法? –