Как справиться с множеством выдвижных предметов - PullRequest
4 голосов
/ 08 декабря 2011

Я занимаюсь разработкой игры, в которой я использую множество рисованных объектов. Каталог "Drawable" вмещает более 10 МБ памяти (около 900 объектов Drawable). В начале каждого игрового уровня я загружаю массив доступных только для рисования, поэтому, когда я рисую их, я ссылаюсь только на некоторые доступные для рисования. Это уменьшает количество моих предметов для рисования примерно до 300, но в некоторых случаях может быть использовано даже 900 предметов для рисования. Несмотря на то, что когда я перечитывал drawables, они используют более 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.

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

1 Ответ

0 голосов
/ 09 декабря 2011

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

Если это так,

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

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

Если вы не используете растровое изображение, тогда это kk.

...