Android фоновое изображение использование памяти


проект, над которым я работаю, использует несколько фонов с высоким разрешением (обратите внимание на кавычки). Просто чтобы попасть в ситуацию, один из них-файл 640X935 1.19 M PNG. Насколько я знаю, даже если Android распаковывает изображения в память в качестве исходных данных, это должно быть:

640 x 935 x 4bytes = 2.39 M

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

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

findViewById(R.id.completed_block_background).setBackgroundResource(R.drawable.blockbackgroundbottom1);

затем, используя DDMS с "кучей обновлений" в процессе (и сначала заставляя GC убедиться, что это не будет проблемой), я получаю следующие результаты памяти:

Nexus S: переход от 18 м до 26 м (разница 8 м)

Galaxy Nexus: начиная с 28 м до 39М (разница 11М)

Итак, как вы можете видеть, помещая это теоретически 2.39 M несжатое изображение в фоновом режиме на самом деле увеличивает 8M и 11M в использовании памяти. Может кто-нибудь объяснить, почему это и если есть какое-либо решение?

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

Я бы также принял, если нет ничего, что можно сделать, объяснение того, почему это происходит. Спасибо заранее.

1 53

1 ответ:

вот почему это делает изображение таким большим?

Ну, то, что происходит, это setBackgroundResource(R.drawable.blockbackgroundbottom1) собирается заставить Android сначала сделать BitmapFactory.decodeResource() вещь, с которой вы экспериментировали, но затем у вас есть логика рендеринга масштаб изображения, чтобы применить его в качестве фона. Так, например, разница в 3 МБ между Galaxy Nexus и Nexus S, вероятно, отражает разницу в размере в пикселях между представлениями LinearLayout.

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

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

С манжеты, я бы сначала попробовал положить его в res/drawable-nodpi/ (чтобы предотвратить любую автоматическую пересчет на основе плотности), затем вручную получить Bitmap по версии BitmapFactory.decodeResource() что берет BitmapFactory.Options, так что вы можете получить его масштабируется, как он читается В. Если что кажется, это не очень помогает, вам может потребоваться переместить PNG из доступных для рисования ресурсов и в необработанный ресурс или активы, так как Android все еще может пытаться удерживать не масштабированную копию изображения. Я не думаю, что это будет если вы используете BitmapFactory.decodeResource() непосредственно себя, но я не могу этого исключить.