Еще одна ошибка OutOfMemoryError: размер растрового изображения превышает бюджет виртуальной машины (из-за прозрачности) - Android - PullRequest
2 голосов
/ 16 декабря 2011

Я тщательно обыскивал это в течение нескольких дней и почти ничего не придумал. Каждый другой прочитанный мной случай связан со сборкой мусора.

Я загружаю PNG-изображение размером 4 КБ, которое в основном полностью прозрачное с небольшими белыми "звездочками". Это 1000x750. Просто загрузка этого одного изображения при запуске программы выдает ошибку OutOfMemoryError: размер растрового изображения превышает бюджет виртуальной машины и E / dalvikvm-heap (3941): внешнее выделение 27000000 байт слишком велико для этого процесса.

С точно таким же кодом у меня нет проблем с загрузкой фонового изображения PNG размером 176 КБ без прозрачности. Это просто "stars1 = BitmapFactory.decodeResource (getResources (), R.drawable.back3c);"

Так есть ли какая-то корреляция, когда декодирование прозрачного PNG занимает безумное количество памяти? И есть ли способ исправить это, кроме использования меньшего изображения?

Если я уменьшу изображение до 500x375, оно загрузится нормально. Я думаю, мне просто интересно, есть ли лучший способ справиться с прозрачным изображением, если это проблема.

Код является почти прямым примером LunarLander. Код, фактически декодирующий растровое изображение:

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inTempStorage = new byte[16*1024];
        options.inSampleSize = 12;

        stars1 = BitmapFactory.decodeResource(getResources(), R.drawable.back4e);

        //stars1 = context.getResources().getDrawable(R.drawable.back3c);
        //stars2 = context.getResources().getDrawable(R.drawable.back4b);
        BackgroundImage = context.getResources().getDrawable(R.drawable.back2);
...