2011-12-07 74 views
4

我正在開發一個遊戲,在那裏我使用了大量的drawables。 「可繪製」目錄擁有超過10MB的內存(約900個可繪製內存)。在每個遊戲級別的開始階段,我只能加載可繪製的數組,所以當我繪製它們時,我只能引用特定的可繪製對象。這將我的drawables數量減少到300個左右,但是有些情況下甚至可以使用900個drawables。儘管當我使用drawable時,他們使用了超過40 - 50MB的內存。我試圖在遊戲中加載它們,但這沒用,因爲遊戲速度慢得令人難以置信。如何處理大量的drawables

好的。我忘了添加一些代碼:P我的遊戲基於LunarLancher,因此代碼對您來說並不新鮮。

class GraphicView extends SurfaceView implements SurfaceHolder.Callback 
{ 
    class GraphicThread extends Thread 
    { 
    public GraphicThread(SurfaceHolder surfaceHolder, Context context, Handlerhandler) 
    { 
     ... 
     LoadPixmap(context); 
     ... 
    } 

    private void doDraw(Canvas canvas) 
    { 
     m_Pixmap[iIndex].setBounds(m_iX, m_iY, m_iX + WIDTH_I, m_iY + HEIGHT_I); 
     m_Pixmap[iIndex].draw(canvas); 
    } 
    } 

    private void LoadPixmap( Context context ) 
    { 
    int iID = 0; 
    Resources res = context.getResources(); 

    for(int iIndex=0; iIndex< m_Objects.size(); ++iIndex) 
    { 
     if (IsPixmapNeeded(m_Objects[iIndex])) 
     { 
     continue; 
     } 

     iID = res.getIdentifier("pixmap"+i, "drawable", "com.my.package"); 
     if (iID != 0) 
     { 
     m_Pixmap[iIndex] = context.getResources().getDrawable(iID); 
     m_Pixmap[iIndex] = new ScaleDrawable(m_Pixmap[iIndex], 0, WIDTH_I, HEIGHT_I).getDrawable(); 
     } 
    } 
    res = null; 
    context = null; 
    } 

    m_Pixmap[] = new Drawable[ FRAMES ]; 
} 

此代碼只是我現在寫的一個樣本,但我的想法是一樣的。

LoadPixmap(context); 

方法也被稱爲當我更新的所有變量,所以我有機會添加/刪除一些繪製,我將需要使用。

和代碼

if (IsPixmapNeeded(m_Objects[iIndex])) 

這部分阻止我裝繪項目,自己目前在m_Pixmap陣列。

我的問題是,處理大量drawables的正確方法是什麼?我的問題不是我的代碼問題,我寧願找到一些更好的方法來處理大量的drawable。

+4

因此,澄清。在每個級別開始時,您生成並存儲數組中的900個可繪製對象。然後你有一些邏輯確定該數組中需要繪製的可繪製對象,然後將它們繪製到屏幕上?您是否正在使用每幾毫秒重新繪製屏幕的循環?它是否只在執行某個動作時重新繪製? '你能提供代碼片段嗎? – Grambot

回答

0

您是否使用位圖工廠在任何位置加載這些位圖?

如果是這樣,

確保你考慮BitMap.recycle();

此外,請確保每部手機都有足夠的虛擬機預算來爲這些圖像分配內存。

如果您不使用bitmapfactory,那麼它是kk。