Pregunta

I haber un gráfico dibujado con CoreGraphics.

Esta tabla se puede desplazar horizontalmente y se dibuja como nos desplazamos a él.

El problema es que en 3G / 3GS de la velocidad y el rendimiento del desplazamiento es bueno, pero en el iPhone 4 es más lento de lo esperado.

supongo que se trata de una cuestión relacionada con la mayor resolución del iPhone 4. Es correcto?

¿Cómo puedo aumentar el rendimiento en el iPhone 4? ¿La conversión automática marco para dibujar en el iPhone 4 resolución o se trata de mi trabajo?

Muchas gracias.

¿Fue útil?

Solución

El iPhone 4 puede ser más más lenta cuando se trata de CoreGraphics de procesamiento.

Una posible idea para su caso. Cuando el usuario se desplaza, en lugar de dibujar la resolución completa, sacar sus CoreGraphics cosas relacionadas con un contexto mitad de resolución. Luego tomar ese contexto como un mapa de bits y ampliarlo para la resolución completa. Esto sería para iPhone4 solamente y se perdería la buena calidad más alta resolución, pero sólo será mientras el usuario se desplaza.

Aquí hay un código que escribí para la prueba entre los diferentes dispositivos.

Mis resultados se visualizará la vista a pantalla completa.

  • 3G, 9 FPS
  • 3GS, 16 FPS
  • i4, 5 FPS (rollo)

CoreGraphicsTestView.h

#import <UIKit/UIKit.h>
@interface CoreGraphicsTestView : UIView 
{
    int displayCounter;
    float displayInterval;
    char fps[50];
}
@end

CoreGraphicsTestView.m

#import "CoreGraphicsTestView.h"
#define RNDN(s, e) ((((CGFloat)rand() / (CGFloat)INT_MAX) * ((e)-(s)) + (s)))
#define RNDX(s, e, r) (RNDN((s), (e)) * (r).size.width)
#define RNDY(s, e, r) (RNDN((s), (e)) * (r).size.height)
#define RNDR(r) (CGRectMake(RNDX(0,0.50,(r)),RNDY(0,0.50,(r)),RNDX(0.50,1.0,(r)),RNDY(0.50,1.0,(r))))
@implementation CoreGraphicsTestView
- (id)initWithFrame:(CGRect)frame 
{
    if ((self = [super initWithFrame:frame])) 
    {
        self.backgroundColor = [UIColor blackColor];
        srand(time(NULL));
        fps[0] = '\0';
    }
    return self;
}
- (void)updateDisplayCounter:(CGContextRef)c rect:(CGRect)rect
{
    displayCounter++;
    float now = (float)clock() / (float)CLOCKS_PER_SEC;
    if (now - displayInterval > 1)
    {
        sprintf(fps, "%0.0f", displayCounter / (now - displayInterval));
        printf("%s\n", fps);
        displayInterval = now;
        displayCounter = 0;
    }
    CGContextTranslateCTM(c, 5, 40);
    CGContextScaleCTM(c, 1.0, -1.0); 
    CGContextSetFillColorWithColor(c, [UIColor whiteColor].CGColor);
    CGContextSelectFont(c, "Arial", 18, kCGEncodingMacRoman);
    CGContextShowTextAtPoint(c, 0, 0, fps, strlen(fps));
}
- (void)setRandomColor:(CGContextRef)c
{
    CGFloat components[4] = {1,RNDN(0, 1),RNDN(0, 1),RNDN(0, 1)};
    CGContextSetFillColor(c, components);
}
- (void)drawRect:(CGRect)rect
{
    CGContextRef c = UIGraphicsGetCurrentContext(); 
    for (int i=0;i<5;i++)
    {
        [self setRandomColor:c];
        CGContextFillRect(c, RNDR(rect));
        [self setRandomColor:c];
        CGContextFillEllipseInRect(c, RNDR(rect));
    }
    [self updateDisplayCounter:c rect:rect];
    [self performSelector:@selector(setNeedsDisplay) withObject:nil afterDelay:0.0];
}
@end

Otros consejos

La experiencia "es más lento", ¿podría describir con mayor precisión? Vamos a suponer que la velocidad de fotogramas del desplazamiento se ha bajado hasta donde no se ve a suavizar o incluso tartamudea.

Si es así, y si está seguro de que es la resolución que es la causa de esto, hay dos métodos generales que puedo ver.

  • actualización a por ejemplo la mitad del intervalo, lo que hace la mitad de las rebanadas de ancho. Si Cocoa Touch no facilita que, se podría desencadenar una devolución de llamada en un intervalo de tiempo del método de representación que tiene ahora.
  • render "más adelantado", por lo que una parte de la gráfica oculta aún más fuera del área visible se hace cuando se desplaza a la vista.

Estoy asumiendo que ya ha visitado las propiedades "dibujo" de la vista, etc opaco ya que afectan al rendimiento.

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