2016-08-24 3 views
0

Я разработала Android игры, используя затмение, у меня есть много ресурсов и изображений в ней, используя устройство SDP размера для определения размера изображений и выглядеть хорошо во всех устройствах:андроид - Размер кучи ошибки

https://github.com/intuit/sdp

Также Библиотека Picasso для загрузки изображений в изображениях,

Основная проблема заключается в том, что на некоторых устройствах я получаю ошибку «Из памяти размера кучи».

вопрос в том, что я должен объявлять разные изображения с разными размерами в подпапках для ldpi, mdpi и так ... даже если я использую Sdp и Picasso?

ответ

0

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

Вариант один, обращая внимание на метод считывания изображения, соответствующее сжатие Старайтесь не использовать или setImageResource setImageBitmap BitmapFactory.decodeResource или установить большое изображение, потому что эти функции после завершения декодирования, в конечном счете, путем создания java-слоя createBitmap, должны потреблять больше памяти. Вместо этого используйте первый метод BitmapFactory.decodeStream, создайте растровое изображение, а затем установите его ImageView источник, decodeStream самый большой секрет заключается в его прямом вызове JNI >> nativeDecodeAsset() для завершения декодирования, больше не нужно использовать java-слой createBitmap, таким образом экономя пространство java-слоя.

InputStream is = this.getResources() openRawResource (R.drawable.pic1).; 

    BitmapFactory.Options options = new BitmapFactory.Options(); 

    options.inJustDecodeBounds = false; 

    options.inSampleSize = 10; // width, hight to a tenth of the original 

    Bitmap btp = BitmapFactory.decodeStream (is, null, options); 

Если мы добавим параметр Config изображения при чтении, он может эффективно уменьшить нагрузку с памятью, таким образом, эффективно предотвращая с выбрасывая исключения памяти.

/**

* In most provinces memory reads local resources image 

* @param Context 

* @param ResId 

* @return 

*/

public static Bitmap readBitMap (Context context, int resId) { 

    BitmapFactory.Options opt = new BitmapFactory.Options(); 

    opt.inPreferredConfig = Bitmap.Config.RGB_565; 

    opt.inPurgeable = true; 

    opt.inInputShareable = true; 

    // Get the resource image 

    . InputStream is = context.getResources() openRawResource (resId); 

    return BitmapFactory.decodeStream (is, null, opt); 

    } 

Кроме того, decodeStream снимки непосредственно читать байткод, а не автоматически адаптироваться в соответствии с различными разрешениями машины, а затем использовать decodeStream, нужно ИПЧР и MDPI, ldpi настроен соответствующий ресурсов изображения или в разных разрешениях машины имеют одинаковый размер (количество пикселей), отображаемый размер неправильный.

Вариант II, при необходимости и своевременное восстановление образа памяти Обычно активность или фрагмент в/OnDestroy фотографий, когда вы можете освободить ресурсы OnStop:

если (ImageView = нуль & & imageView.getDrawable (!) = NULL) {

Bitmap oldBitmap = ((BitmapDrawable) imageView.getDrawable()) getBitmap().; 

    imageView.setImageDrawable (null); 

    if (oldBitmap! = null) { 

     oldBitmap.recycle(); 

     oldBitmap = null; 

    } 

}

// Другой код.

System.gc();

После освобождения ресурсов необходимо обратить внимание на выпуск связанного Drawable Bitmap или ссылку на другие классы. Если обычный вызов, вы можете растровое изображение.isRecycled(), чтобы определить, есть ли отмеченное восстановление; и если он используется кодом интерфейса, связанным с интерфейсом пользовательского интерфейса, вам нужно быть осторожным, чтобы избежать возможной утилизации ресурсов, которые будут использоваться, или вы можете сбросить системные аномалии: E/AndroidRuntime: java.lang.IllegalArgumentException: Can not нарисовать переработанные растровые изображения И исключение не может быть эффективно захвачено и обработано.

Вариант 3, избегайте ненужного при загрузке полного изображения. Только нужно знать размер изображения в ситуации, вы не можете загрузить изображение в память целыми. Сжатие изображения с использованием BitmapFactory time, BitmapFactory.Options inJustDecodeBounds после установки в true, затем используйте decodeFile() и другие методы, можно рассчитать размер изображения в состоянии, не выделяя пространство. Пример:

BitmapFactory.Options opts = new BitmapFactory.Options();

// Задает истинный inJustDecodeBounds

opts.inJustDecodeBounds = истина;

// Использование decodeFile получена ширина и высота изображения

BitmapFactory.decodeFile (путь, выбирает);

// Печать ширины изображения и высоты

Log.d ("пример", opts.outWidth + "" + opts.outHeight); (Ps: на самом деле, принцип информации заголовка прочитана изображением базовой информации об изображении)

Вариант IV, распределение оптимизировано динамической памяти Dalvik VM Heap (КУЧА) является память VM по большей части, как правило, динамически распределяется. Размер кучи не является статическим, обычно существует механизм распределения для контроля его размера. Например, начальный HEAP имеет размер 4M, когда 4M-пространство занято более чем в 75% случаев, для перераспределения кучи 8M большое; когда 8M занято более чем на 75%, выделенная куча имеет размер 16M. Сверху вниз, когда куча 16M использует менее 30%, уменьшите размер 8M. Сбросьте размер кучи, особенно при сжатии, обычно связанный с копией памяти, поэтому изменение размера кучи отрицательно сказывается на эффективности. Использование кучи утилизации кучи. Когда фактическое процентное отклонение использования с этого времени, размер кучи виртуальной памяти, чтобы отрегулировать время в GC, так что фактическая доля заполняемости в процентах ближе. Метод setTargetHeapUtilization dalvik.system.VMRuntime класс может обеспечить расширенную память кучи памяти эффективности обработки.

закрытый конечный статический поплавок TARGET_HEAP_UTILIZATION = 0.75f;

// Когда программа может вызывать OnCreate

VMRuntime.getRuntime() setTargetHeapUtilization (TARGET_HEAP_UTILIZATION) .;

Программа V, размер памяти кучи (кучи) Для некоторых проектов Android, влияющих на узкие места в производительности, в основном, проблемы с управлением памятью в ОС Android, нынешние производители мобильных телефонов более скудны ОЗУ для свободного программного обеспечения очень чувствительны к воздействию на производительность оперативной памяти, в дополнение к оптимизированному зарубежному назначению памяти кучи памяти Dalvik VM, мы также можем определить ваше собственное программное обеспечение, чтобы заставить размер памяти, мы используем dalvik.system.Класс VMRuntime Dalvik для установки минимальной памяти кучи, например:

закрытый конечный статический int CWJ_HEAP_SIZE = 6 * 1024 * 1024;

VMRuntime.getRuntime() setMinimumHeapSize (CWJ_HEAP_SIZE) ;. // Устанавливаем минимальную память кучи размером 6 МБ.

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

Наконец, расскажите нам, что изображение занимает процесс алгоритма памяти. android в обработке изображений базового класса - Bitmap, по определению, является растровым изображением. Алгоритмы с интенсивной памятью, такие как: ширина изображения * высота * Config. Если для параметра «Конфигурация» установлено значение ARGB_8888, то приведенная выше конфигурация равна 4. Использование памяти изображений 480 * 320 составляет 480 * 320 * 4 байта. По умолчанию размер памяти для Android в формате 16M, как и битмап, который он провел в дополнение к данным Java, в базовой графической библиотеке C++ будут храниться объекты skia SKBitmap, обычно рекомендуется, чтобы размер памяти не превышал 8M. Это можно настроить, вы можете установить параметры при компиляции исходного кода.

Смежные вопросы