Использование памяти фонового изображения Android
Проект, над которым я работаю, использует несколько «высоких разрешений» (обратите внимание на цитаты). Чтобы попасть в ситуацию, один из них представляет собой PNG-файл размером 640×935 1.19M. Насколько я знаю, даже если Android распаковывает изображения в память в качестве исходных данных, это должно быть:
640 x 935 x 4bytes = 2,39M
У меня проблемы с памятью в моем проекте, который я не могу понять, и надеюсь, что кто-то может пролить свет на этот вопрос. Я назову два устройства, которые я разрабатываю, и некоторые из результатов.
- Добавление изображения в Jbutton с ярлыком переднего плана
- Может ли приложение phonegap работать в фоновом режиме?
- java swing background image
- Ввод фона на iOS4 для воспроизведения аудио
- Android: сохранить сервис, когда приложение убито
Чтобы убедиться, что это не второстепенная проблема, я сделал операцию, не загружая фон при первом создании, а затем, когда пользователь нажимает кнопку, все, что она делает, это:
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, но это создает некоторые проблемы с диапазоном, которые я не могу принять).
Я бы тоже согласился, если ничего не может быть сделано, объяснение того, почему это происходит. Заранее спасибо.
- Как определить, когда приложение Android переходит на задний план и возвращается на передний план
- Исправлено фокусное изображение привязки / исчезновение в хроме при сочетании с преобразованием css
- Android OpenGL ES Прозрачный фон
- Как установить фоновый backgroundRadius для NSString на iOS7
- Как программировать круглые углы и задавать произвольные фоновые цвета
- Как заполнить фоновое изображение UIView
Вот почему он делает изображение таким большим?
Ну, что происходит, так это то, что 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()
, но я не могу это исключить.