2010-02-18 2 views
1

Я создал приложение, которое отображает около 250 изображений в ImageView. Изображения загружаются один за другим, 15-30 изображений в секунду. В принципе, все это создает иллюзию вращающегося 3D-объекта, по крайней мере, он должен. Проблема следующая: приложение зависает при загрузке определенных изображений (т. Е. Я вижу несколько секунд анимации жидкости, а затем зависает анимация, прыгаю 10-15 кадров (изображений) вперед и продолжается. Это всегда происходит в тех же местах цикла анимации. Я, хотя у этого Android, возможно, не хватает ресурсов для обработки чего-то подобного, поэтому я изменил размер изображений до половины их размера, но он не помог. Я пробовал буферизацию изображений, но это не помогло (на самом деле, возможно, немного, я думаю, что анимация выглядит немного более гладкой). И теперь самое странное. Я использую сенсорный экран, чтобы пользователи могли «вращать» 3D-объект на этих изображениях, а при повороте я снова испытываю эти зависания точно так же, как и с анимацией.Загрузка Android и отображение большого количества изображений в ImageView (покадровая анимация) зависает в определенные моменты

Все изображения в формате .png и их размер варьируется от 15kB до 40 КБ.

Я использую следующий код для анимации:

new Thread(new Runnable() { 

    @Override 
    public void run() { 
    while (!stopStartupAnimation && li < images_360.length) { 
    final int fli = li; 
    handler.post(new Runnable() { 

     @Override 
     public void run() { 
     //Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.icon); 
     //imageCanvas.setImageResource(images_360[fli]); 
     imageCanvas.setImageBitmap(imageStackNext.pop()); 
     System.out.println("rawX = " + fli); 
     } 
    }); 
    int ti = fli +25; 
    if(ti > images_360.length-1){ 
     ti = ti - images_360.length; 
    } 
    imageStackNext.push(BitmapFactory.decodeResource(getResources(), images_360[ti])); 
    synchronized (this) { 
     try { 
     wait(1000/25); 
     } catch (InterruptedException e) { 
     e.printStackTrace(); 
     } 
    } 
    li++; 
    li++; 
    if (li >= images_360.length) { 
     li = 0; 
    } 
    } 
    } 
    }).start(); 

ответ

1

Во-первых, 15-40KB их сжатом виде. Несжатые, как Bitmaps, они, вероятно, значительно больше. 250 из них могут использовать много MB ОЗУ, что не очень хорошо.

Во-вторых, учитывая выбор между использованием OpenGL для 3D (что является его целью) или примитивами 2D-чертежа на Canvas или с использованием ImageView, вы выбрали наихудший вариант.

В-третьих, postRunnable() не вступает в силу немедленно, а скорее помещает вещи в очередь сообщений для обработки основного потока приложений, когда он получает шанс. Если он привязан - скажем, при обработке событий касания - он может пропустить некоторые, казалось бы, избыточные перерисовывающие, или заставить их идти так быстро, что они, похоже, не произойдут. Все ваши 40 мс wait() делает, что вы только поднимаете события каждые 40 мс, а не то, что они будут краска каждые 40 мс. Кроме того, вы могли бы более легко использовать postDelayed() для вашего времени в 40 мс.

+0

Изображения не загружаются сразу, но один за другим. Вы правы в OpenGL, но использование этого для этого приложения было бы излишним, поскольку объект, который я анимирую, не является кубом или чем-то простым, плюс есть нечто большее, чем просто этот объект. Я знаю, что postRunnable() не вступает в силу немедленно, и я попытался использовать postDelayed(), но он производит тот же эффект. – Milan

+0

Кроме того, я уже писал, что я попытался изменить размер изображений на половину их размера и что он не помог. То, что я не смог сказать, заключается в том, что, когда я использую сенсорный экран для поворота 3D-объекта (путем прокрутки сенсорного экрана), не имеет значения, поверну его на 360 ° или на 10 ', зависания все еще присутствуют точно в том же месте, где они произошли в анимации. – Milan

+0

«Вы правы в OpenGL, но использовать его для этого приложения было бы излишним, поскольку объект, который я анимация, не является кубом или чем-то простым». Итак, вы думаете, что способ эффективного внедрения не простой 3D-анимации - это избежать технологии аппаратного ускорения 3D и использовать более эффективную альтернативу? «Я знаю, что postRunnable() не вступает в силу немедленно, и я попытался использовать postDelayed(), но он дает тот же эффект». Конечно, это будет - оба они помещают события в очередь основного потока. Это неизбежно при использовании виджетов, поэтому 3D-анимация не должна использовать виджеты. – CommonsWare

Смежные вопросы