2016-02-08 4 views
0

Я решил исследовать использование памяти своего приложения, и я посмотрел на монитор памяти Android Studio, а использование моей памяти составило около 68 МБ. Это выглядит слишком высоко для меня.Почему мой фоновый фолд приложения составляет 160 МБ во время выполнения?

enter image description here

Я открыл распределитель памяти и начал отслеживать с начала применения. Я видел, что есть выделение 49 МБ NonMovableArray, которое является Bitmap.

enter image description here

Я отлажена приложение и выяснил, что это был фон, я использовал. Ниже приведены строки из файла PhoneWindow.java, вот где Android назначает фон на экран, который я считаю. Фоновый объект имел размер 49 МБ и разрешение 2625x4669.

У меня нет переопределения в моем приложении, и у меня есть один фон, который применяется ко всей теме.

У меня есть фоновый рисунок в drawable папка в формате JPG с разрешением 750x1,334.

PhoneWindow.java

if (mBackgroundResource != 0) { 
    background = getContext().getDrawable(mBackgroundResource); 
} else { 
    background = mBackgroundDrawable; 
} 

Я проверяю это на 6 устройства Motorola Nexus, который имеет 560 плотности с разрешением 1440 х 2560.

Есть две точки я не Понимаю.

  1. Если устройство имеет разрешение 1440x2560, почему мой фон будет преобразован в 2625x4669?
  2. Даже если это преобразование является лучшим сценарием для приложения, как получилось, что файл 160 КБ окажется 49 МБ?

Если вы, ребята, можете мне это объяснить, это было бы здорово. Благодаря!

ответ

5

Если устройство имеет разрешение 1440x2560, почему мой фон будет преобразован в 2625x4669?

Вы помещаете изображение в res/drawable/. Это не очень хороший выбор, так как это синоним для res/drawable-mdpi/. Следовательно, Android передискретирует ваш образ, думая, что вы нацелились на устройства -mdpi (~ 160 точек на дюйм), поэтому изображение имеет примерно тот же физический размер на Nexus 6 (3,5x плотность).

Действительно ли res/drawable-nodpi/ или res/drawable-anydpi/ - это правильный выбор, это немного зависит от ваших альтернативных версий этого ресурса, хотя either will probably work.

Как получить файл 160 KB в конечном итоге составляет 49 МБ?

Изображение занимает 160KB на диске. Объем памяти - это декодированное изображение. Это будет разрешение изображения (после повторной выборки) раз 4 байта/пиксель для изображений ARGB_8888. 2625x4669x4 ~ = 49 МБ.

+0

Я уже решил эту проблему первый кладя мою вытяжку в «растяжимой-nodpi' папки (после просмотра ответа вам на другой вопрос), а затем создание различных чертежей для разных плотностей экрана. Я просто хотел понять, в чем причина этого, и вы очень хорошо объяснили. Спасибо! –

0

Я не уверен, о различиях разрешения, но разница между используемой памяти и размер файла, так как изображение в формате JPG (как и многие другие форматы) сжимается (см wiki для как). Когда вы загружаете его в память, он больше не сжимается, поскольку он используется для рисования каждого пикселя на экране.

1

Конфигурация по умолчанию и высочайшего качества для Bitmap - ARGB_8888, которая будет использовать 4 байта на пиксель. Так как ваше изображение масштабируются до 2625 * 4669, это:

2625*4669*4 bytes = 49024500 bytes 

http://developer.android.com/reference/android/graphics/Bitmap.Config.html

Смежные вопросы