2012-07-17 21 views
10

Me gustaría compartir mi experiencia al utilizar el indicador self.layer.shouldRasterize = YES; en UIViews.UIView self.layer.shouldRasterize = YES y problemas de rendimiento

que tienen una jerarquía UIView clase que tiene self.layer.shouldRasterize convertido EN con el fin de mejorar el rendimiento de desplazamiento (todos ellos tienen subvistas estáticas que son más grandes que la pantalla del dispositivo).

Hoy en una de las subclases que usé CAEmitterLayer para producir bonitos efectos de partículas.

El rendimiento es muy pobre aunque el número de partículas era realmente bajas (50 partículas).

¿Cuál es la causa de este problema?

Respuesta

10

Desactivando self.layer.shouldRasterize aumenta el rendimiento a niveles normales.

¿Por qué es eso?

De acuerdo con un video en el sitio de desarrolladores de apple (no recuerdo el video, ayuda por favor?) La regla para self.layer.shouldRasterize es así de simple: si todas sus subvistas son estáticas (su posición, contenido, etc. sin cambiar ni animar), entonces es un beneficiario activar self.layer.shouldRasterize ON. Por otro lado, si alguna de las subvistas está cambiando, entonces el marco necesita volver a almacenar en caché la jerarquía de vistas y esto es un gran cuello de botella. Debajo del capó, el cuello de botella es la copia de memoria entre la CPU y la GPU.

31

Voy a citar de Apple Doc y explico:

@property BOOL shouldRasterize 

Cuando el valor de esta propiedad es SÍ, la capa es representa como un mapa de bits en su espacio de coordenadas local y luego a un material compuesto el destino con cualquier otro contenido. Los efectos de sombra y cualquier filtro en la propiedad de filtros están rasterizados e incluidos en el mapa de bits . Sin embargo, la opacidad actual de la capa no está rasterizada. Si el mapa de bits rasterizado requiere escala durante la composición, los filtros en las propiedades minificationFilter y magnificationFilter se aplican según sea necesario.

Básicamente, cuando shouldRasterize se establece en SÍ, se calcula cada píxel que formará la capa y toda la capa se almacena en caché como un mapa de bits.

  • ¿Cuándo se beneficiará de ello?

Cuando solo tiene que dibujarlo una vez. Eso significa que necesitas solo una animación "simple" pura (por ejemplo, mover, transformar, escalar ...) porque CoreAnimation realmente usará esa capa sin volver a dibujarla en cada fotograma. Es una característica muy poderosa para almacenar en caché capas complejas (con sombras y radio de esquina) combinadas con CoreAnimation.

  • ¿Cuándo te matará la velocidad de fotogramas?

Cuando su capa es reimpresa muchas veces, porque en la parte superior del dibujo que ya está haciendo efecto, la shouldRasterize procesará todos los píxeles para almacenar en caché los datos de mapa de bits.

Así que la verdadera pregunta que debe hacerse es la siguiente: "¿En qué capa estoy aplicando el shouldRasterize a SÍ? ¿Y con qué frecuencia se vuelve a dibujar esta capa?"

Espero que esto haya sido lo suficientemente claro.

+1

Soy nuevo en iOS. Entonces, ¿shouldRasterize = YES es bueno si lo uso para UITableViewCells personalizadas? Gracias por esta gran respuesta por cierto. :) @apouche – GangstaGraham

+2

diría que no, no es una buena idea rasterizar una UITableViewCell por dos razones: 1. Si usa un identificador de reutilización, la celda de la vista de tabla se volverá a dibujar muchas veces durante el desplazamiento (y, por lo tanto, el shouldRasterize penalizarlo aún más). 2: no se beneficiará de ello, ya que es muy raro animar una UITableViewCell. – apouche

+0

@apouche espera, ¿estás diciendo que uses shouldRasterize si escalas? ¿Eso no solo escalará el caché del mapa de bits y luego dará como resultado una imagen fea? (¿escalando, por ejemplo?) –

Cuestiones relacionadas