Улучшена частота кадров при рисовании растровых изображений на холсте (часть 2)?

#android #animation #opengl-es #bitmap #live-wallpaper

#Android #Анимация #opengl-es #растровое изображение #живые обои

Вопрос:

Вот что я пытаюсь сделать: я пытаюсь загрузить последовательность растровых изображений для отображения анимации. Это означает, что мне нужно снизить частоту кадров в секунду (24 кадра в секунду). Мне нужно загрузить не более 10 секунд анимации или около 300 растровых изображений. И поскольку это живые обои, я ограничен рисованием каждого кадра вручную.

Вот что я пробовал до сих пор:

  1. Очевидная стратегия: загружайте каждое растровое изображение в каждый кадр и рисуйте его. Это медленно.
  2. Используйте кэширование. Я поместил загрузку растровых изображений в отдельный поток. Кэш из примерно 20 растровых изображений непрерывно загружается в фоновом режиме. Тем не менее, я по-прежнему получаю низкую производительность (около 10 кадров в секунду). Причиной является медленная загрузка растровых изображений.
  3. Я собирался попробовать использовать OpenGL, но потом понял, что даже с OpenGL медленная загрузка растровых изображений все равно будет проблемой. Верно? (Или я ошибаюсь?)

Итак, какие еще стратегии я могу использовать?

Вот что я имел в виду: если я использую OpenGL, я могу использовать растровые изображения меньшего размера (потому что это обеспечивает лучшее масштабирование). Возможно, тогда у меня будет больший кэш — скажем, возможно, 3 секунды. При большем кеше медленная загрузка растровых изображений не будет проблемой, верно?

Есть другие стратегии?


О, и это моя текущая функция загрузки растровых изображений:

 void loadNthBitmap(int i, int n) {
    try {
    buf = new 
        BufferedInputStream(assets.
                open(folder "/"
                      imageList[n])
                );
    tmpBitmap = BitmapFactory.
        decodeStream(buf);
    rbitmap[i] = Bitmap.createBitmap
        (tmpBitmap,
         0,0,imageWidth,imageHeight,
         transMatrix,false);
    }
    catch(IOException e) {}
}
  

где imageList — заранее определенный список ресурсов, а transMatrix — матрица поворота и масштабирования.

Ответ №1:

То, что вы пытаетесь сделать (т. Е. полнокадровую анимацию), непросто. Почти вся анимация Android (от примера Lunar Lander в SDK до Angry Birds) состоит из движущихся маленьких спрайтов на относительно статичном фоне.

«Очевидным» решением вашей проблемы было бы преобразовать вашу анимацию в формат mpeg, а затем декодировать ее как видео живые обои, копируя подход, который этот парень использовал здесь: http://forum.xda-developers.com/showthread.php?t=804720 (альтернативная ссылка http://android.ccpcreations.com/vlw /)

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

1. Это начало. Следуя подходу RockPlayer, я получаю около 10 кадров в секунду для моего тестового видео. Этот подход использует текстуры FFmpeg, NDK и OpenGL. Вероятно, мне следует использовать буферы кадров.

2. @u-avalos Спасибо за принятие / повышение. Очевидно, что вы очень серьезный программист. Удачи с вашим проектом. 🙂

3. @u-avalos В FAQ здесь android.ccpcreations.com/vlw/vlw-faq , специалист по VLW утверждает, что ~ 24 кадра в секунду при 480×854, и имеет несколько рекомендаций по кодеку.