Pregunta

Tengo un pequeño problema de velocidad de ejecución. En la carga, genero un CGMutablePath que contiene al menos 1000 puntos. Quiero desplazarme por este camino en la pantalla, así que uso este tipo de código:

-(void) drawRect:(CGRect)rect {

    /*
    Here, I have a timer calling drawRect 60 times per second.
    There's also code for the scale and currentTime, based on
    an MP3 playback (AVAudioPlayer);
    */

    CGContextRef ref = UIGraphicsGetCurrentContext();   
    CGContextClearRect(ref, [self frame]);

    CGContextSaveGState(ref);
    CGContextTranslateCTM(ref, s.width/2+currentTime, 1);
    CGContextScaleCTM(ref, scale, 1);
    CGContextAddPath(ref, myGraphPath);
    CGContextSetRGBFillColor(ref, .1, .1, .1, .8);
    CGContextFillPath(ref);
    CGContextRestoreGState(ref);
}

El problema es que es un poco lento, no mucho, pero como necesito agregar mucho más código gráfico ... Me preguntaba si el dispositivo está dibujando la ruta completa (una vez que se aplica la escala, la ruta tiene aproximadamente 10.000 píxeles de ancho), o solo la parte visible en la pantalla. ¿Qué puedo hacer para optimizar esto?

¿Fue útil?

Solución 2

Después de probar muchas cosas (como dividir mi enorme ruta de 1000 puntos en rutas más pequeñas de 10 puntos, etc.), he portado todo a openGL, usando matrices de vértices simples. Me tomó cerca de 4 horas portarlo todo (incluso escalando el camino, desplazándolo, etc ...) y ahora, obtengo una animación completa de 60 fps todo el tiempo, cuando tenía un promedio de solo 22 fps con picos de 28 cuando utilizaba el CoreGraphics.

Otros consejos

Dibujar una ruta de 1.000 puntos o 10.000 puntos 60 veces por segundo realmente va a ralentizar la aplicación, si es posible. Si la ruta es estática, realmente debería mirar solo dibujarla una vez dentro de su UIView, de modo que se almacene en caché dentro de la capa UIView, y animar la capa alrededor. Debe estar animado, puedes ver el nuevo CAShapeLayer, que brinda la capacidad de animar una ruta Bezier simplemente aplicando una animación a su propiedad de ruta.

Sin embargo, 10,000 píxeles serán más anchos que el tamaño máximo de textura en el iPhone (2048 x 2048), por lo que tendrá problemas para mostrarlo en cualquier vista o capa estándar y puede necesitar dividirlo en partes más pequeñas o use un CATiledLayer para representarlo en la pantalla.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top