¿Por qué setColor es tan lento en Android?

Estoy comparando algunos de nuestros códigos en un dispositivo OPO que normalmente es bastante rápido y estoy viendo un montón de rarezas de rendimiento "extrañas". Antes de profundizar en el código nativo de Android, pensé en preguntar aquí.

Lo que estoy viendo es que una llamada para paint.setColor(argbInt) toma aproximadamente 5 veces más de ejecución que las llamadas siguientes:

 paint.setStyle(Paint.Style.FILL); paint.setAntiAlias(false); canvas.drawRect(x, y, x + w, y + h, paint); paint.setAntiAlias(antialias); 

Ahora dibujo rect pasa en la GPU así que estoy adivinando que no veo ninguna sobrecarga para eso. Pero, ¿por qué debo recoger el color de la pintura?

Y como un seguimiento natural, ¿cómo puedo reducir dicha sobrecarga?

También estoy viendo un poco de sobrecarga para canvas.restore() (aproximadamente 4 veces más lento que el código anterior), pero supongo que tendría sentido ya que podría ser una operación compleja. Simplemente no veo por qué setColor sería lento?

Para el registro probé el funcionamiento en un OPO con System.nanoTime () y su bastante consistente en términos del funcionamiento (no una casualidad repentina del GC o algo).

No pude encontrar ninguna respuesta real para "por qué" esto está sucediendo incluso después de excavar a través del código. Mi solución fue almacenar en caché los objetos Paint para cada estilo en nuestro tema, de modo que volver a pintar el componente con ajustes similares puede volver a usar un valor previamente establecido. Esto parecía tener un impacto positivo en el rendimiento.

  • Cómo convertir mi proyecto de Android en un proyecto de maven
  • La respuesta de Json es un android muy lento
  • Obtén velocidad de un evento onTouch ACTION_MOVE en Android
  • Impacto de 'instanceof' en el código Java de Android
  • Timertask o manejador
  • El proveedor de contactos de Android sólo obtiene contactos telefónicos con todos los correos electrónicos
  • ¿Cómo mterp (Dalvik VM) organiza su bucle de interpretación de bytes?
  • Java - ¿Tendrá beneficios el código inlining?
  • Android, programación orientada a objetos vs diseñar para el funcionamiento
  • El desplazamiento de grandes listas de adaptadores basados ​​en Cursor es más rápido que las listas mucho más pequeñas de adaptadores en memoria
  • Múltiples montajes en un cuerpo o múltiples cuerpos?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.