setShadowLayer вызывает медленное время рисования в GridView?

В настоящее время я работаю с GridView, содержащим ImageView, и мне нужны тени за моими изображениями. Потенциально, скажем, 15 изображений видны в сетке в любой момент времени. Исходя из предположения, что я хочу, чтобы мой экран отображался со скоростью 50 кадров в секунду, чтобы он выглядел плавно, моя математика показывает, что я хочу, чтобы общее время прорисовки каждого ImageView было не хуже, чем около 1,3 мс.

Я посмотрел, как Ромен Гай рисовал тени в своем приложении Shelves: http://code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/curiouscreature/android./shelves/util/ImageUtilities.java

Это казалось логичным, поэтому я создал следующий класс:

 public class ShadowImageView extends ImageView {
     private static final int SHADOW_RADIUS = 8;
     private static final int SHADOW_COLOR = 0x99000000;
     private static final Paint SHADOW_PAINT = new Paint();

     static {
         SHADOW_PAINT.setShadowLayer(SHADOW_RADIUS / 2.0f, 0.0f, 
             0.0f, SHADOW_COLOR);
         SHADOW_PAINT.setColor(0xFF000000);
         SHADOW_PAINT.setStyle(Paint.Style.FILL);
     }

     public ShadowImageView(Context context, AttributeSet attrs) {
         super(context, attrs);
     }

     @Override
     public void onDraw(Canvas canvas) {
         final int containerWidth = getMeasuredWidth();
         final int containerHeight = getMeasuredHeight();

         canvas.drawRect(
                 SHADOW_RADIUS / 2.0f,
                 SHADOW_RADIUS / 2.0f,
                 containerWidth - SHADOW_RADIUS / 2.0f,
                 containerHeight - SHADOW_RADIUS / 2.0f,
                 SHADOW_PAINT);
     }
 }

(Очевидно, что это просто дает мне черные прямоугольники с тенями, но этого было достаточно, чтобы получить первоначальное представление о производительности.)

Прокрутка сетки была довольно прерывистой, поэтому я проверил время прорисовки в средстве просмотра иерархии: ~3,5 мс на ImageView. В лучшем случае это около 19 кадров в секунду.

Однако если я удалю оператор setShadowLayer(), средство просмотра иерархии покажет время прорисовки около 0,2 мс на ImageView.

Если я забуду про drawRect() и вместо этого создам девять патчей с теневыми краями, вызвав setBackgroundResource(R.drawable.my_nine_patch) в onDraw(), я увижу, что время отрисовки составляет около 1,5 мс на ImageView.

Известны ли проблемы с производительностью при использовании Paint с теневым слоем? Я делаю что-то глупое в приведенном выше коде?


person jordanti    schedule 23.09.2011    source источник