2017-02-17 35 views
1

Я использую кнопку с PNG фона для функции CopyToClipboard в моем приложении (используются около 6-7 раз в различном фрагменте). Поскольку изображения должно быть небольшим для моей цели, я увеличил площадь моего образа, поставив в дополнительной прозрачной области вокруг изображения так, чтобы я мог увеличить размер кнопки для интерактивной области но сохранить изображения small (Я знаю, что он неэффективен, и с тех пор я разработал лучший способ добиться этого).Огромного скачок в потреблении памяти при использовании с большим детские прозрачной области

Я заметил огромные шипы позже после загрузки некоторых других изображений (большие изображения размером около 150kb), и после много отладки (и я имею в виду много!), Я обнаружил, что проблема была не из-за большие изображения, но из-за изображения CopyToClipboard, имеющего размер всего 8 КБ !!! Переход на прежнее изображение CopyToClipboard (с меньшей прозрачной областью) привел к тому, что потребление памяти возобновилось.

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

Изображение, показанное ниже: Белая область - это прозрачная область. Размер моей кнопки: 15dp x 15dp.

enter image description here

Повторяю, Мой вопроспочему это произошло? Не решение для него, так как я уже решил проблему.

ответ

1

На самом деле не имеет значения, что ваше изображение составляет всего 7-8 КБ на диске, потому что оно будет занимать гораздо больше памяти при его декодировании.

По-видимому, большая прозрачная область может быть эффективно закодирована в PNG-файле, поэтому изображение имеет этот небольшой размер. Но на самом деле это размер (600 x 745), поэтому в памяти потребуется примерно (600 * 745 * 4) байт, а также некоторая метаинформация, поэтому почти 2 мегабайта. 4 означает количество байтов, необходимых для кодирования цвета с альфа-каналом. Растровые изображения Android представлены внутри линейного одномерного массива целых чисел, поэтому вы можете представить себе, что системе необходимо выделить массив размером 600 * 745 = 447000 для создания вашего растрового изображения.

Именно поэтому потребление памяти настолько велико для такого простого изображения.

+0

У меня была догадка, что это может быть связано с разрешением. В основном вы говорите мне, что этот всплеск произошел, потому что разрешение изображения было настолько высоким, и внутреннее его хранение в Bitmap показало эффект этого ** правильно? –

+0

@KaushikNP, в основном, да. Но это не похоже на ошибку Android или Bitmap, это просто то, как битмапы представлены в памяти - как необработанный массив пикселей. На диске они представлены как эффективно закодированные структуры, поэтому они занимают гораздо меньше места. – Dimezis

+0

Спасибо, Димезис. На самом деле существует большая разница в разрешении для обоих изображений, поэтому это кажется наиболее вероятным. Ошибка, которую я сделал, не учитывала разрешение для битмапов, а просто проверяла размер. –