Nano Hash - криптовалюты, майнинг, программирование

Android: размер растрового изображения превышает бюджет виртуальной машины (кадр за кадром)

Я получаю эту ошибку все время. И как я вижу, на stackoverflow.com уже много вопросов, но, к сожалению, я не нахожу подходящих мне ответов.

У меня есть 60 изображений PNG (всего 2,5 МБ), которые я хотел бы поместить в анимацию.

Пробовал тремя разными способами.

1

mAnimation = new AnimationDrawable();
mAnimation.addFrame((BitmapDrawable)getResources().getDrawable(R.drawable.yawning_00001), FPS_12);  
...
mAnimation.addFrame((BitmapDrawable)getResources().getDrawable(R.drawable.yawning_00063), FPS_12);
mAnimation.start();

2

XML

<animation-list android:oneshot="true">
    <item android:drawable="@drawable/yawning_00001" android:duration="83" />
    ...
    <item android:drawable="@drawable/yawning_00063" android:duration="83" />
 </animation-list>

Джава

ImageView img = (ImageView)findViewById(R.id.animation);
img.setBackgroundResource(R.drawable.yawning);
AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground();
frameAnimation.start();

3

С классом, расширяющим ImageView (здесь я просто покажу важные вещи)

public void loadAnimation(String prefix, int nframes) {
    mBitmapList.clear();
    for (int x = 0; x < nframes; x++) {
        String zeros = "000";
        if (x < 10) {
            zeros += "0";
        }
        String name = prefix + "_" + zeros + x;
        Log.d(TAG, "loading animation frame: " + name);
        int res_id = mContext.getResources().getIdentifier(name, "drawable", mContext.getPackageName());
        d = (BitmapDrawable) mContext.getResources().getDrawable(res_id);
        mBitmapList.add(d.getBitmap());
    }
}

Во всех случаях я получаю одну и ту же ошибку... Все примерно после 15 загрузки изображения.

E/AndroidRuntime(1591): java.lang.OutOfMemoryError: bitmap size exceeds VM budget

Я прошу задаться вопросом, возможна ли вообще такая кадровая анимация в Android.

Может быть у кого-нибудь есть альтернатива покадровой анимации? Если да, дайте ссылку на любую витрину.


  • 60 png это не 2,5 Мб в памяти... ширина*высота*3(или даже 4) для файла png... 05.04.2012

Ответы:


1

Вам нужно будет каким-то образом переработать ваши изображения, потому что у вас никогда не будет достаточно памяти для 60 изображений.

Вы думаете, что все ваши изображения весят 2,5 мегабайта, но это сжатая png-версия ваших файлов.

Если вы хотите знать, сколько памяти вы используете с вашими файлами, когда они не сжаты в растровом формате в памяти, просто выполните: ширина * высота * количество изображений * байт на пиксель .... Тогда вы узнаете, почему происходит сбой: D

AnimationDrawable не предназначены для такого интенсивного использования. Вы должны начать смотреть на SurfaceViews, и тогда вы сможете реализовать любой метод управления памятью, который вы хотите использовать для отображения анимации.

http://developer.android.com/reference/android/view/SurfaceView.html

Удачи.

05.04.2012
  • Добавлена ​​часть байтов на пиксель :) 05.04.2012
  • Не знал о размере PNG... Попробую с SurfaceView, спасибо. 05.04.2012
  • @Trick: это не только png, но и любой графический файл, используемый в Android, перед использованием они не сжимаются в памяти. 05.04.2012

  • 2

    Иногда утечка памяти происходит откуда-то, а не из строки кода, отображаемой в трассировке стека. Я думаю, вам следует внимательно прочитать статью ниже, а затем проверить свой собственный код, чтобы исключить некоторые специальные проблемы, такие как:

    • Не храните долгоживущие ссылки на контекстную активность (ссылка на активность должна иметь тот же жизненный цикл, что и сама активность)
    • Попробуйте использовать контекстное приложение вместо контекстной активности
    • Избегайте нестатических внутренних классов в активности, если вы не контролируете их жизненный цикл, используйте статический внутренний класс и сделайте слабую ссылку на активность внутри. Решение этой проблемы заключается в использовании статического внутреннего класса с WeakReference для внешнего класса, как это делается, например, в ViewRoot и его внутреннем классе W**.

    Статья

    РЕДАКТИРОВАТЬ: Вы также должны проверить это:

    • Вызовите recycle() для удаления неиспользуемого растрового изображения.

    • используйте sampleSize > 1, чтобы уменьшить размер растрового изображения.

    Bitmap.createBitmap(ширина, высота, новый BitmapFactory.Options().inSampleSize=4)

    05.04.2012
    Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

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