Возможно ли рисование полноэкранной однокадровой анимации с использованием OpenGL на Android? - PullRequest
3 голосов
/ 08 февраля 2011

В настоящее время я отображаю однокадровую анимацию в полноэкранном режиме на SurfaceView с использованием таймера и Canvas.onDraw() / canvas.drawBitmap. Каждый кадр имеет разрешение 480х320 пикселей и будет растягиваться во время рисования до разрешения экрана. Это работает хорошо на более быстрых устройствах, достигая частоты кадров до 15 кадров в секунду. Проблема заключается в том, что мне нужно загрузить каждый кадр (анимация состоит из 30 отдельных кадров, которые зацикливаются) перед началом анимации, поскольку анимация будет отображаться с высокой частотой кадров. Учитывая малое пространство кучи для процессов Android, обычно 16 МБ, большинство моих тестирующих устройств не способны предварительно загружать все 30 кадров в память, поэтому я думаю вместо этого использовать OpenGL. Поскольку я читаю OpenGL, память не будет рассматриваться в пределах пространства кучи процесса 16 МБ, альтернативой может быть использование OpenGL.

Теперь мой вопрос: будет ли OpenGL достаточно быстрым, чтобы изменять и отображать текстуры (мои отдельные кадры) достаточно быстро, чтобы достичь высокой частоты кадров 15 кадров в секунду? Я прочитал статью о том, что слишком частая замена текстур значительно замедлит OpenGL. Ребята, у вас есть опыт? Я не хочу тратить время на запуск OpenGL, если вы уже можете сказать, что замена полноэкранных текстур с 15fps невозможна.

Edit:

Я сейчас использую технику, которая использует Android NDK по умолчанию без использования OpenGL. Смотрите мой ответ здесь .

Ответы [ 2 ]

2 голосов
/ 08 февраля 2011

Производительность OpenGL также зависит от устройств, которые вы будете использовать. Но отображение только 30 текстур при 15 кадрах в секунду не будет проблемой на большинстве устройств.

Взгляните на эту статью , чтобы начать с OpenGL на Android. Достаточно просто добиться зацикливания анимации.

Удачи!

0 голосов
/ 10 февраля 2011

Больше нет необходимости использовать OpenGL для моего случая, поскольку 30 кадров могут быть загружены без превышения доступного пространства. Как я выяснил, запуск garbage collector освобождает некоторую память, которая была занята во время загрузки моих 30 кадров. Это был не я, кто создал эти объекты, которые могут быть освобождены, так как мой код выглядит так:

for (int i=0; i < 30; i++) {
  Bitmap b = "load480x320BitmapFromResources(i)";
  frames.add(b);
}

Этот предыдущий код будет превышать пространство кучи. Но добавив строку

System.gc();

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

См. Также более подробное описание этого решения

...