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

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

640 x 935 x 4bytes = 2,39M

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

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

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

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

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

Galaxy Nexus: переход от 28M к 39M (разница 11M)

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

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

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

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

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

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

Можно ли каким-либо образом сохранить исходный размер изображения?

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

Interesting Posts

Можем ли мы подключить удаленную базу данных MySQL на Android с помощью JDBC?

Что, * конкретно * удаляет и сохраняет Windows 8 «Обновить ваш компьютер»?

Настройка яркости дисплея ноутбука не работает в Linux Mint 14

Какова минимальная настройка, требуемая для развертывания приложения .NET с клиентом Oracle 11?

Как я могу заставить desktop.ini работать в сетевых локациях?

Почему мой компьютер загружается медленным при подключении USB-накопителя?

Как я могу избежать включения файлов реализации classа?

Пользовательские шрифты в Android

Linq to Entities соединяются с groupjoin

Получение телефонного кода в США с помощью Android

Где я могу найти стандартные документы C ++ 11?

Существуют ли какие-либо различия между окончательными и проектными спецификациями 802.11n?

Что такое разработка, основанная на компонентах?

Ошибка установки рабочей станции VMWare: MSI '' не удалось

ListView setOnItemClickListener не работает, добавив кнопку

Давайте будем гением компьютера.