Почему все мои растровые изображения увеличены на 200%? - PullRequest
6 голосов
/ 09 марта 2012

У меня серьезные проблемы с памятью в приложении [1]. Чтобы исследовать это, я взял кучу приложений в разных штатах. Я видел, что некоторые растровые изображения занимают огромное количество памяти. Я написал небольшой инструмент [2], который декодирует байтовые массивы в файлы растровых изображений Windows (.bmp), чтобы я мог увидеть растровые изображения и сравнить их с файлами, которые есть в моей папке res/drawable.

Что я обнаружил, так это то, что все мои файлы были подвергнуты двойной выборке.
Сначала я проверил самый большой из них: буфер байтового массива размером более 9 МБ в куче, который был декодирован для получения изображения 1920x1280, в то время как исходный файл был размером 960x640 png.
Я попробовал второй по величине, более 3 МБ, который после декодирования показал хорошую картинку 754x1200, оригинальный размер был ... угадайте что? Прекрасный 377x600 jpg файл.

Что дает?

Я включил ускорение HW в своем файле манифеста Android (хотя я не уверен, что он мне действительно нужен, я просто использую некоторые базовые представления и действия).
Я работаю со стандартной Android 4.0.2 на GSM Galaxy Nexus (якью). Я получаю отзывы от моих тестеров, что проблема присутствует на их 4.0.3 Nexus S, хотя я еще не мог проверить их дампы кучи.

Я пытаюсь сэкономить здесь память, если Android удваивает все, неудивительно, что приложение быстро падает, потому что использование кучи становится слишком высоким (в моем случае около 64 МБ). Я надеюсь, что есть причина и способ обойти это.

Ссылки:

  1. OutOfMemoryError при загрузке действий
  2. Как на самом деле увидеть растровое изображение, полученное из дампа кучи Android

1 Ответ

8 голосов
/ 09 марта 2012

Когда вы помещаете изображения в res/drawable, Android будет предполагать, что они имеют dpi 160, т. Е. Это то же самое, что помещать их в res/drawable-mdpi. Galaxy Nexus - это устройство xhdpi, т. Е. Его (обобщенное) dpi составляет 320. Чтобы компенсировать дисплей с высоким разрешением, Android увеличит частоту дискретизации изображений на 200%.

Решение простое, просто поместите изображения в res/drawable-xhdpi. Тогда заявленные dpi изображений будут соответствовать отображению, на котором вы работаете, и Android не будет выполнять масштабирование изображений.

Пожалуйста, обратитесь к http://developer.android.com/guide/practices/screens_support.html для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...