Самый быстрый способ загрузить и отобразить JPEG в SurfaceView? - PullRequest
3 голосов
/ 29 июня 2011

Это продолжение моего последнего вопроса: Холст рисует слишком медленно

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

В приложении, над которым я работаю, пользователь может последовательно воспроизводить видеокадры (jpegs), как будто он просматривает видео в реальном времени.Я использовал BitmapFactory.decodeFile() для загрузки каждого JPEG в растровое изображение.Я не могу загрузить все изображения одновременно, так как их около 240, и это заняло бы все мое пространство кучи.То, что я делал, это предварительная загрузка до 6 за один раз в массив с помощью отдельного потока, чтобы сократить время, необходимое для отображения каждого изображения.

К сожалению, это занимает где-то между50 и 90 мс, чтобы загрузить изображение, и мне нужно показывать изображение каждые 42 мс.Есть ли более быстрый способ загрузки изображений?

Для пояснения, эти изображения находятся в папке на SD-карте, и все они имеют размер 720x480 jpegs.Я выбираю их вдвое меньше, чтобы сократить использование памяти.

Ответы [ 2 ]

1 голос
/ 11 октября 2011

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

  1. Все изображения хранятся на SD-карте и записываются в один файл (каждое изображение занимает X байтов в файле)
  2. Используйте собственный код для чтения и записи в файл изображения
  3. При запросе изображения я передаю индекс изображения в списке и объект растрового изображения (RGB_565) собственному коду, используя оболочку JNI
  4. Собственный код блокирует поверхность растрового изображения, записывает данные пикселей (как uint8_t **) непосредственно в растровое изображение, а затем разблокирует его
  5. Изображение выводится на экран

Сделав это таким образом, мне нужно было хранить только одно изображение в памяти за раз, и я смог обойти сборку мусора (поскольку растровое изображение было создано только один раз, а затем заново заполнено изначально). Я надеюсь, что кто-то еще может найти эту стратегию полезной.

0 голосов
/ 30 июня 2011

Полагаю, вы уже опробовали все методы в этом уроке http://www.higherpass.com/Android/Tutorials/Working-With-Images-In-Android/2/ и выбрали самый быстрый.Возможно, изменение размера может уменьшить время загрузки.

Лучше всего было бы, конечно, если бы вам не нужно было изменять размеры изображений вообще.Если у вас есть полный контроль над изображениями, возможно, вы можете попытаться упаковать их в виде спрайтов, см. Статью http://www.droidnova.com/2d-sprite-animation-in-android,471.html

...