У меня есть растровое изображение, я загружаю в SurfaceView, что составляет около 75KB (давать или принимать)Большой растровый для фона дает Oom ошибку
Код, я использую для вызова его или декодировать это
bmLargeImage = BitmapFactory.decodeResource(getResources(),R.drawable.campplan);
ничего необычного на самом деле. Размер изображения составляет 1000х500 пикселей. Какая загрузка прекрасна, когда я захочу. Проблема в том, что я хочу, чтобы она была размером 2000x1000, что вдвое больше.
Я попытался изменить размер с этим кодом
bmLargeImage = Bitmap.createScaledBitmap(bmLargeImage, 2000, 1000, true);
, но он дает мне ошибку ООЙ. Я попытался сохранить файл png как изображение размером 2000x1000 пикселей, и снова он дает исключение OOM. Это пока тестируется в эмуляторе. Но я думаю, что размер должен быть достаточным для загрузки, чего мне не хватает?
Примечание: Я хочу, чтобы это была большая причина, это фон для игры (думаю, что это фермерский или деревенский игровой фон farmrile), поэтому он должен быть большим и прокручиваемым, но я только управляю размером 1000x500.
Каков размер кучи эмулятора? минимальный для телефонов - 16 Мб, но у большинства устройств больше. Изображение размером 2000x1000 может легко занять 8Mb ОЗУ. Это связано с тем, что изображение загружается в формат 'RGBA_8888' по умолчанию, который хранит для каждого пикселя 4 байта. Вкл. Для каждого из красного, зеленого, синего и альфа-каналов. Если в изображении нет альфа-изображения, 'createScaledBitmap' вернет изображение в формате RGB_565, которое будет стоить всего 2 байта на пиксель. Я считаю, что при создании масштабированного растрового изображения вы также будете временно иметь две копии в памяти, что еще больше увеличивает использование памяти. – Wozza
Размер изображения (75kb) не имеет значения. Могу добавить. К сожалению, проблемы с памятью при работе с большими растровыми изображениями отсутствуют. Вы должны быть очень осторожны с использованием вашей памяти. Полагаю, вы могли бы подумать о том, как вы накладываете фоновое изображение и загружаете фрагменты по мере необходимости и вызывая 'recycle()' на растровых изображениях, которые вы закончили. EDIT - я хотел сказать «временно иметь« обе копии в памяти »в моем последнем комментарии – Wozza
true Я думаю. Надеюсь найти решение – Hok