Android LiveWallpaper: эффективная загрузка и рисование различных растровых изображений (пример: видео)

Я разрабатываю живые обои, которые воспроизводят анимацию (например, короткое видео) на заднем плане.

Кто-нибудь знает, как эффективно загружать различные полноэкранные растровые изображения и рисовать их на холсте? Я пробовал 2 подхода, и оба не очень хороши.


Подход № 1: загружать все растровые изображения при запуске обоев.

Проблема: Избыток памяти (около 35 МБ) не позволяет загрузить более 10 растровых изображений. Поэтому анимации не хватает разных изображений.


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

Проблема: Потребляет много системы (не памяти, а замедляет ОС в целом), однако работает, потому что не превышает лимита памяти. Но все равно тормозит всю систему.

пример:

  Drawer.drawAll(res,c,p);
  res.removeOldBitmaps();
  res.loadNewBitmaps(wpservice,display);

Другой подход, о котором я думал, - это загрузка ресурса в отдельный поток, что вы, ребята, думаете об этом? у вас есть другие решения?

Ваше здоровье!


person chelo_c    schedule 10.01.2013    source источник
comment
Вы могли бы сделать только с одним растровым изображением тоже. Это может быть достигнуто, если вы предварительно загружаете изображения в память в виде байтовых массивов (например, сжатых png) и декодируете только по одному за раз. Должно ли это хотя бы немного ускорить процесс декодирования по сравнению с загрузкой из ресурсов. Но если вы хотите, чтобы результат был похож на видео, почему бы не сделать видео и не использовать MediaPlayer?   -  person harism    schedule 10.01.2013
comment
Эй, это хорошая идея, я попробую и посмотрю, есть ли улучшения. Нет, я не могу использовать медиаплеер на живых обоях, я не знаю, возможно ли это, и даже если это возможно, я планирую сделать некоторые анимации. Спасибо за ответ.   -  person chelo_c    schedule 10.01.2013
comment
Здесь я нашел аналогичный пост с интересным вопросом, однако я еще не пробовал: ">stackoverflow.com/questions/10133306/ ссылка   -  person chelo_c    schedule 10.01.2013
comment
На всякий случай, если вам интересно попробовать подход MediaPlayer, это возможно, по крайней мере, с OpenGL ES 2.0 и SurfaceTexture (хотя только API 11+). Без OpenGL я понятия не имею, возможно ли, чтобы MediaPlayer отображал свое содержимое на поверхности обоев.   -  person harism    schedule 10.01.2013
comment
Ох спасибо, посмотрю. Однако я хотел, чтобы обои работали с API 9.   -  person chelo_c    schedule 10.01.2013


Ответы (1)


Решено, решение, которое я нашел, было следующим:

Загружайте изображения во время выполнения, 1 на 1.

И используйте эти параметры:

/**Effective image decoder by chelin**/
public static Bitmap decodeResource(WallpaperService wpservice,int id){

    int scale=1;
    Resources res = wpservice.getResources();
    BitmapFactory.Options o2 = new BitmapFactory.Options();
    o2.inPreferredConfig = Bitmap.Config.ARGB_8888;
    o2.inSampleSize=scale;
    o2.inPurgeable = true;
    o2.inInputShareable = true;
    return BitmapFactory.decodeResource(res, id, o2);
}

Надеюсь, это сработает, как это сработало для меня. Ваше здоровье!

person chelo_c    schedule 19.01.2013
comment
Если вас не волнует прозрачность, вы можете сэкономить память, используя Bitmap.Config.RGB_565. - person James; 18.09.2014