2011-12-07 10 views
4

私は多くのドロウアブルを使用するゲームを開発しています。 「ドロウアブル」カタログは、10MB以上のメモリ(約900個のドロアブル)を保持します。各ゲームレベルの開始時に、ドロアブルの配列を必要なドロウアブルだけにロードしています。そのため、私はドローイング時に、特定のドロウアブルを参照するだけです。これは、私のドロウアブルの量を約300に減らしますが、使用される900個のドロアブルでさえある場合もあります。私がドロアブルを読んだとしても、40〜50MB以上のメモリを使います。私はゲーム中にそれらをロードしようとしていたが、これは役に立たなかった。なぜなら、ゲームは信じられないほど遅くなるからだ。多くのドロウアブルを扱う方法

私はいくつかのコードを追加するのを忘れていました: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配列に今ある積載ドローアブルに私を防ぎます。

私の質問では、多くのドロアブルを扱う正しい方法は何ですか?私の問題は私のコードの問題ではなく、むしろ多くのドロウアブルを扱うより良い方法を探したいと思っています。

+4

したがって、説明のために。各レベルの開始時に、900個の描画可能オブジェクトを生成して配列に格納します。次に、配列内のドロアブルオブジェクトを描画する必要があるかどうかを判断し、それを画面に描画する何らかのロジックがありますか?数ミリ秒ごとに画面を再描画するループを使用していますか?何らかのアクションが実行されたときだけ再描画されますか? 'あなたはコードスニペットを提供できますか? ' – Grambot

答えて

0

ビットマップファクトリを使用して、これらのビットマップをどこにでもロードしていますか?

そうであれば、

あなたは(アカウントBitMap.recycleに入れていることを確認してください)。

また、すべての電話機に、これらのイメージ用にメモリを割り当てるのに十分なVM予算があることを確認してください。

bitmapfactoryを使用していない場合はkkです。

関連する問題