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 ответ:
вот почему это делает изображение таким большим?
Ну, то, что происходит, это
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()
непосредственно себя, но я не могу этого исключить.