Как нарисовать и изменить фон, не используя слишком много памяти? - PullRequest
0 голосов
/ 21 октября 2010

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

Я хочу изменить фон, он устанавливается на BLACK .Я хотел бы использовать изображение, которое у меня есть.

 public void onDraw(Canvas canvas) {
       canvas.drawColor(Color.BLACK);
...
}

Цвет фона установлен на onDraw.Если я попытаюсь нарисовать растровое изображение, игра в конечном итоге вылетит из-за проблем с памятью.(не хватает памяти).Я считаю, что это потому, что изображение рисуется каждый раз, когда вызывается onDraw.

Я пытался разместить его в разных местах, но, возможно, я что-то упустил.Любая помощь будет отличной.Ниже приведен код, который я использую для создания фона.Моя идеальная цель - создать фон только один раз в начале.И быть в состоянии обновить его при необходимости.

 Bitmap Background = BitmapFactory.decodeResource(getResources(),R.drawable.background);
 DisplayMetrics dm = new DisplayMetrics();
 getWindowManager().getDefaultDisplay().getMetrics(dm);
 int height = dm.heightPixels;
 int width = dm.widthPixels;
 Rect rec = new Rect(0, 0, width, height);
 canvas.drawBitmap(Background, null, rec, null);

Ответы [ 2 ]

1 голос
/ 21 октября 2010

Каждый раз, когда вы вызываете BitmapFactory.decodeResource (), я полагаю, вы получаете новый объект Bitmap.Так что это означает новый байт [].Каждый раз, когда ваша ничья вызывается, выделяется другой байтовый массив.После завершения работы с ним важно вызвать recycle (), чтобы сообщить, что этот байт [] может быть освобожден.Так что в вашей текущей реализации после отрисовки просто вызовите Background.recycle ();

Это не немедленное освобождение, поэтому вы можете столкнуться с некоторыми проблемами с производительностью.Таким образом, вы также можете сохранить массив байтов в памяти.Без более подробной информации о том, где в приложении это происходит, сложно дать совет, как это сделать.Однако, если этот код находится в методе draw () для определенного компонента, просто создайте растровое изображение в конструкторе компонента и используйте его в методе draw ().Затем, прежде чем забыть о компоненте, обязательно вызовите recycle для экземпляра растрового изображения.

0 голосов
/ 22 октября 2010

В дополнение к тому, что опубликовал Грег, следует учитывать и способ, которым Android обрабатывает изменения ориентации. Каждый раз, когда меняется ориентация экрана, ваша деятельность будет уничтожена, а затем воссоздана. Если соответствующие меры предосторожности не будут приняты, это также может привести к утечке памяти.

Взгляните на: http://android -developers.blogspot.co.uk / 2009/01 / избегая-памяти leaks.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...