#android #animation #opengl-es #bitmap #live-wallpaper
#Android #Анимация #opengl-es #растровое изображение #живые обои
Вопрос:
Вот что я пытаюсь сделать: я пытаюсь загрузить последовательность растровых изображений для отображения анимации. Это означает, что мне нужно снизить частоту кадров в секунду (24 кадра в секунду). Мне нужно загрузить не более 10 секунд анимации или около 300 растровых изображений. И поскольку это живые обои, я ограничен рисованием каждого кадра вручную.
Вот что я пробовал до сих пор:
- Очевидная стратегия: загружайте каждое растровое изображение в каждый кадр и рисуйте его. Это медленно.
- Используйте кэширование. Я поместил загрузку растровых изображений в отдельный поток. Кэш из примерно 20 растровых изображений непрерывно загружается в фоновом режиме. Тем не менее, я по-прежнему получаю низкую производительность (около 10 кадров в секунду). Причиной является медленная загрузка растровых изображений.
- Я собирался попробовать использовать 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, и имеет несколько рекомендаций по кодеку.