Уменьшается ли размер файлов .png, что-то влияет на результат растрового изображения в памяти - PullRequest
4 голосов
/ 08 апреля 2010

Я пишу игру с большим количеством изображений PNG.Все работало нормально.Затем я добавил новое действие с WebView и получил недостаток памяти.После этого я провел некоторый эксперимент - заменил игровые PNG-изображения на те, которые только что полностью залили цветом.В результате нехватка памяти ушла.

Но я полагаю, что Bitmap внутренне удерживает каждый пиксель отдельно, поэтому такие изменения не должны иметь никакого эффекта.Может быть, это из-за того, что у исходных изображений есть альфа-канал, а у моих тестовых изображений его нет?

Но на самом деле вопрос в том, окажет ли уменьшение размеров файлов изображений PNG какое-то влияние на уменьшение использования кучи приложений виртуальной машины или нет?

Ответы [ 3 ]

4 голосов
/ 09 апреля 2010

Вам следует изучить конфигурацию растрового изображения, в которую вы декодируете свои изображения. Я не знаю точно, что означают файлы конфигурации, но, например, вы можете декодировать в ARGB_8888 или просто RGB_565. RGB_565 использует меньше памяти, предположительно потому, что не имеет альфа-канала (прозрачности) и использует меньше битов для каждого цвета. В вашем случае, вероятно, происходит то, что простые изображения декодируются в RGB_565, а более сложные - ARGB_8888.

Способ изменить используемую конфигурацию можно при декодировании файлов изображений следующим образом:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon, options);

Поэкспериментируйте с этим и посмотрите, поможет ли это. Это, безусловно, помогло мне с моей игрой.

3 голосов
/ 08 апреля 2010

Android или нет, растровые изображения в памяти не сжимаются, поэтому они будут принимать (бит на пиксель) * ширину * высоту, с небольшим разбросом в зависимости от формата пикселя.

Я не знаю деталей прорисовки PNG, но, вероятно, происходит то, что более простые PNG требуют меньше памяти для декодирования.

1 голос
/ 08 апреля 2010

Использование памяти растровым объектом в Android связано с разрешением изображения, а не с исходным форматом (jpg, png и т. Д.) Или размером файла. Требуется около 3 байтов pr пикселя (1 байт pr цветной канал).

В любом случае, если вы используете BitmapFactory для декодирования изображения, меньший исходный файл требует меньше памяти при декодировании входного потока.

Вы можете проверить это самостоятельно, используя отладчик Dalvik (ddms). Перейдите на вкладку Sysinfo и выберите Использование памяти из выпадающего списка. Вы увидите, сколько памяти использует ваше приложение.

...