Как обрабатывать множество рисунков

Я разрабатываю игру, в которой использую много рисунков. Каталог "drawable" содержит более 10 МБ памяти (около 900 drawables). В начале каждого игрового уровня я загружаю в массив рисунков только необходимые чертежи, поэтому, когда я их рисую, я обращаюсь только к определенным чертежам. Это уменьшает количество моих рисунков примерно до 300, но в некоторых случаях может использоваться даже 900 рисунков. Несмотря на то, что когда я читал чертежи, они использовали более 40–50 МБ памяти. Я пытался загрузить их во время игры, но это было бесполезно, потому что игра невероятно тормозит.

Ok. Я забыл добавить код :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.

Мой вопрос, как правильно обрабатывать множество рисунков? Моя проблема не в моем коде, я скорее хотел бы найти лучший способ обработки большого количества рисунков.


person netgaf    schedule 07.12.2011    source источник
comment
Итак, для уточнения. В начале каждого уровня вы создаете и сохраняете в массиве до 900 объектов, которые можно рисовать. Затем у вас есть какая-то логика, которая определяет, какие объекты для рисования в этом массиве нужно рисовать, а затем рисовать их на экране? Используете ли вы цикл, который перерисовывает экран каждые несколько миллисекунд? Он перерисовывается только при выполнении какого-либо действия? Can you provide code snippets?   -  person Grambot    schedule 08.12.2011


Ответы (1)


Используете ли вы фабрику растровых изображений для загрузки этих растровых изображений в любом месте?

If so,

Убедитесь, что вы принимаете во внимание BitMap.recycle();

Кроме того, убедитесь, что у каждого телефона достаточно бюджета виртуальной машины для выделения памяти для этих образов.

Если вы не используете bitmapfactory, то это kk.

person user1025013    schedule 09.12.2011