2012-07-11 14 views
6

Estoy tratando de obtener una imagen de una vista donde un usuario puede pintar, o agregar algunas otras vistas. Con el iPad1 & 2, todo funciona bien hasta el momento. Pero en el iPad3 funciona como un perro. Solo estoy usando las capas del método renderInContext.iPad 3 renderInContext lento - Rendimiento de representación erróneo

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) 
    UIGraphicsBeginImageContextWithOptions(self.viewDrawableViewContainer.frame.size, NO, [UIScreen mainScreen].scale); 
else 
    UIGraphicsBeginImageContext(self.viewDrawableViewContainer.frame.size); 
[self.viewDrawableViewContainer.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Sé que esto probablemente es causada por la CPU que es igual a la de un ipad2, pero tardará aproximadamente 1 segundo. Cuanto más pinta o agrega el usuario, más tiempo tardará en renderizarse. A veces hasta 5 segundos, lo cual es realmente inaceptable. Entonces, ¿hay alguna opción para mejorar el rendimiento? Cualquier posibilidad de establecer una calidad de representación más pequeña, no necesito una representación en la resolución de retina más alta ...

¡Agradecería cualquier ayuda! Gracias de antemano

+1

¿Puedes anticipar qué vistas se dibujarán? De ser así, podría hacer el dibujo en segundo plano y almacenar en caché los resultados, lo que no congelaría el dispositivo. –

+0

De acuerdo, gracias por la pista, podría crear una imagen en segundo plano, pero el problema es que el usuario puede escribir algo de texto y tocar ir. Entonces tendría que hacer el dibujo inmediatamente después de la interacción del usuario porque la vista se cerrará después de tocar en go. Pero gracias, tal vez podría renderizar mientras la animación de cierre está funcionando. Lo probaré ... ¿Así que no hay otras formas de mejorar el rendimiento del renderizado? – Alexander

+0

Desafortunadamente no, producir 4 veces en esencialmente la misma CPU que muchos píxeles simplemente mata el rendimiento. Enmascararlo con animaciones es una gran manera de resolver el problema, y ​​es cómo lo hace Apple. Si le permite al usuario dibujar en una vista, ¿a qué está recurriendo? ¿No hay ningún UIImage que respalde la opinión de que puede retirarse inmediatamente en lugar de mostrar la vista en un contexto? –

Respuesta

9

Puede aumentar la velocidad renderizando a una resolución más baja. Use un factor de escala UIGraphicsBeginImageContextWithOptions menor que 1.0, p. Ej. 0.5.

Además, si no necesita alfa, puede obtener un impulso de velocidad pequeño al pasar SÍ para la bandera opaca. No he cronometrado la diferencia yo mismo.

+0

intenté esto. Usé NSDate * d1 = [NSDate date]; ... NSDate * d2 = [NSDate date]; [d2 timeIntervalSinceDate: d1]; para medir cuánto tiempo lleva, y no hay diferencia. iPad 3 es mucho más lento que iPad2 (~ 0.3sec a ~ 1.7sec) – Nadav

16

También puede aumentar la velocidad de representación modificando la calidad de interpolación en su contexto antes de llamar a renderizar en contexto. Pude obtener capturas de pantalla de mayor velocidad con este cambio que cambiando el factor de escala.

Por supuesto que puede usar ambos y no tiene que establecer la calidad en Ninguno, Baja aún fue una mejora para mí.

CGContextSetInterpolationQuality(ctx, kCGInterpolationNone); 

Además, por el factor de escala como se mencionó en la respuesta anterior asegurarse de que su factor de nueva escala es un múltiplo del original es decir, si la escala de la pantalla es de 1,0 que debe hacer algo así como 0.5 y no 0.8. El uso de .8 causará que el render calcule más información (porque no es una escala par) y por lo tanto lo hará más lento que usar 1.0 porque.

Por supuesto, esta no será una buena solución para todos.

+2

'CGContextSetInterpolationQuality' hace cosas maravillosas! En mi caso, estoy renderizando la capa de 'UICollectionView' con imágenes en celdas, cambiando la alta calidad de interpolación a una velocidad de fotogramas medios/bajos cuando se desplaza de manera muy significativa. – brigadir

Cuestiones relacionadas