Android: проблемы с загрузкой изображений

#android #performance #bitmap #drawable

#Android #Производительность #растровое изображение #можно рисовать

Вопрос:

У меня большие проблемы с кодом decodeSampleBitmap и конечным размером моих изображений. У меня есть чертежи в папке nodpi drawables, чтобы не умножать один и тот же чертеж в разных папках с разными размерами, и я изменяю размер после aply моего decodeSampleBitmap.

У меня есть этот код для загрузки растрового изображения:

 public static int calculateInSampleSize(
        BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) >= reqHeight amp;amp; (halfWidth / inSampleSize) >= reqWidth) {
            inSampleSize *= 2;
        }
    }
    return inSampleSize;
}

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res, resId, options);
}
  

Код, который я могу получить в документации. Хорошо, я думаю, что это для более эффективной загрузки изображений, но у меня проблемы с памятью. Я пытаюсь объяснить эту проблему.

1-Я хочу загрузить png, 2037×1440 пикселей, 12,6 КБ.

2-Я использую свой код и загружаю png с разрешением 2037×1440 пикселей и 11,73 МБ. Я не понимаю, что я делаю неправильно. Почему Android умножает на 1000 размер моих чертежей?

 10-12 12:06:07.842 12405-12822/com.viridesoft.kiseichuu V/control4: width=2037 height=1440 size=11733120
  

Редактировать: если я загружу чертеж с помощью BitmapFactory.decodeResource, размер будет таким же, 11733120.

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

Я загружаю много изображений для создания динамического фона и заряжаю всех персонажей (моего игрока и зомби), в общей сложности до 111 растровых изображений размером 25% пикселей x 10% пикселей от размера экрана и до 30 растровых изображений размером 100% экрана. Я загружаю все эти растровые изображения в действие загрузчика и сохраняю для последующего использования в игре. У меня хорошее качество изображений и папка drawable-nodpi с большим количеством изображений для лучшего разрешения Android, которое я вижу. Моя игра работает плавно на некоторых устройствах (bq aquaris, nexus 5 и т. Д.), Но Постоянно очищает память и работает медленно на других (некоторые планшеты, некоторые устройства среднего класса и т. Д.)

Новый вопрос: как я могу эффективно загружать много изображений для плавного игрового процесса?

Комментарии:

1. Что именно составляет 11,73 МБ? И где именно вы определили окончательное разрешение? Для какого значения вы рассчитываете inSampleSize ?

2. reqWidth, reqHeight Какие значения вы запрашиваете?

3. я передаю эти значения для образца 1280×720, но вы можете видеть ширину и высоту растрового изображения, чем возвращаемый мой код, с 11733120 байтами, я запрашиваю ширину и высоту экрана

4. Для начала вы должны указать точные цифры. Сообщите все значения, которые я просил. И ответьте на все мои вопросы! Я до сих пор не знаю, откуда берутся эти 11,73 МБ.

5. if i load the drawable with BitmapFactory.decodeResource the size is the same ??? ну, вы используете BitmapFactory.decodeResource(). Больше ничего. Итак, что вы имеете в виду?