2012-06-15 17 views
9

Tengo UIScrollView y el número de objetos (composiciones de UIView) con UIImageViews dentro de ellos. Algunos de UIImageViews tienen borde redondo (uso myImageView.layer.masksToBounds = YES; para esto). Otros tienen bordes rectangulares y parte de la imagen en ellos (uso la propiedad Clip subviews en Interface Builder para esto).clipToBounds and masksToBounds problema de rendimiento

La cuestión es que me encontré con que las propiedades del clip afectan en gran medida el rendimiento mientras se desplaza:

Para obtener resultados de perfiles iPod touch (cuarta generación):

  • con las propiedades del clip habilitados (ambos o uno de a) tengo alrededor de 30 fps mientras se desplaza
  • con las propiedades del clip con discapacidad que tengo los 60 fps mientras se desplaza

realmente es necesario recortar algunas imágenes para redondear los límites y otras para delimitar el rectángulo (para mostrar parte de la imagen). Entonces, aquí está mi pregunta: ¿De qué maneras hay para mejorar el rendimiento? Puede haber formas de bajo nivel para hacerlo (drawRect: o algo así), o puede ser que sea útil para jugar con el enmascaramiento alfa o simplemente hago algo mal?

Respuesta

30

Cuando se tiene máscaras y cosas gráficamente intensivos, de una manera simple y fácil para mejorar el rendimiento (a menudo de manera espectacular) es establecer shouldRasterize a YES en la capa de ese elemento:

#import <QuartzCore/QuartzCore.h> 

// ... 

view.layer.shouldRasterize = YES; 

Esto le rastersize la ver en un búfer, por lo que no se vuelve a generar constantemente. Esto ocupará una memoria adicional para cada vista, por lo que debería intentar y reciclar/reutilizar las vistas a medida que se desplaza, de forma similar a como lo hace una vista de tabla.

Para el comportamiento correcto en pantalla de la retina también es necesario establecer un valor apropiado para rasterizationScale:

view.layer.rasterizationScale = view.window.screen.scale; // or [UIScreen mainScreen] 

He tenido un gran éxito con este movimiento en sentido vertical para cosas como galerías de fotos, donde cada elemento había esquinas redondeadas, sombras, etc.

+0

buenos consejos! pero ahora realmente ayuda cuando aplico esta propiedad a la vista completa (con vista de imagen redondeada y etiqueta de texto dentro). En este caso, el texto se vuelve tan feo ... Si lo aplico solo en la vista de imagen redondeada, casi no tiene efecto. – Lloyd18

+1

Ah, lo siento. Para soporte de retina, configure 'view.layer.rasterizationScale = [[UIScreen mainScreen] scale]'. Eso debería hacer que todo sea nítido. He actualizado mi respuesta. –

+0

Y recuerde verificar el uso de su memoria. Utilice el instrumento "Monitor de actividad" para ver la diferencia de uso de la memoria cuando utiliza rasterización. La memoria de video extra probablemente no aparecerá en las asignaciones. Si el aumento es demasiado grande, debería probar y reciclar las vistas como dije, para que no haya demasiadas instancias en un momento dado. –

Cuestiones relacionadas