OutOfMemoryException: растровое изображение превышает бюджет виртуальной машины - PullRequest
0 голосов
/ 20 июля 2011

Я загрузил приложение (Hungry Birds) на рынок, и друг скачал его для своего Xperia x10. Он изменил растровое изображение со стандартной неанимированной версии на анимированную, и в этот момент игра рухнула. Я интенсивно тестировал его на Nexus 1, HTC Magic, HTC Desire и эмуляторе, и они отлично работают везде. Почему Xperia делает это? И есть ли способ увеличить бюджет виртуальной машины на определенных устройствах в коде?

EDIT: Исключение выдается, когда создается ресурс (png), размер которого составляет 200 КБ, хотя я в основном использую только его небольшую вырезанную часть (он большой для поддержки планшетов).

EDIT2: Как ни странно, код работал на моем телефоне разработчика (HTC Magic с 2.2 CyanogenMod), когда я уменьшил размер кучи до 12 МБ. Насколько я знаю, минимум 16мб. Есть идеи, почему это сработало?

Кстати: после того, как я применил обходной путь, он неожиданно начал работать на X10, не знаю почему. Андроид странный ..

Ответы [ 2 ]

0 голосов
/ 20 июля 2011

У меня была эта проблема несколько раз.Единственный способ решить эту проблему - измерить объем памяти, оставшийся на устройстве, чтобы уменьшить его (не всегда возможно) или использовать другие виды ухудшенных режимов.

Сначала я получаю количестводоступная память:

final Runtime rt = Runtime.getRuntime();
final long freeMem = rt.freeMemory() + (rt.maxMemory() - rt.totalMemory());

И затем я сравниваю это с размером моего ресурса (может быть изображение, звук, что-нибудь еще ...).Я обычно применяю соотношение (от 0,50 до 0,80, но это вопрос стратегии), чтобы избежать использования всей доступной памяти.

if (myResourceSize < (freeMem * ratio)) { 
    // use it as it is
}
else {
    // use (or create if possible) something smaller
}
0 голосов
/ 20 июля 2011
is there a way to increase the VM budget on specific devices in the code?

- это невозможно.

Единственным решением является обработка outOfMemoryException в вашем коде.

Чтобы избежать этого outOfMemoryException , вы можете следовать этим двум простым вещам.Сделайте ваше растровое изображение равным нулю в каждом циклеИ вы можете перерабатывать свое растровое изображение следующим образом, bitmap.recycle();, как только вы закончили использовать свое растровое изображение.Это удалит память, занятую растровым изображением.

...