Лучшая частота кадров при рисовании растровых изображений на холсте (часть 2)? - PullRequest
0 голосов
/ 01 июня 2011

Вот что я пытаюсь сделать: я пытаюсь загрузить последовательность растровых изображений для отображения анимации. Это означает, что мне нужно иметь спуск кадров в секунду (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 Ответ

1 голос
/ 02 июня 2011

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

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

...