Domanda

Ho un grafico disegnato con CoreGraphics.

Questo grafico può essere fatta scorrere in orizzontale ed è disegnata come scorriamo esso.

Il problema è che su 3G / 3GS la velocità e le prestazioni del rotolo è buona, ma su iPhone 4 è più lento del previsto.

Suppongo che questo è un problema legato alla risoluzione più elevata di iPhone 4. E 'corretto?

Come posso aumentare le prestazioni su iPhone 4? Ha il quadro conversione automatica per disegnare sulla risoluzione di iPhone 4 o è il mio lavoro?

La ringrazio molto.

È stato utile?

Soluzione

L'iPhone 4 può essere molto più lento quando si tratta di CoreGraphics elaborazione.

Una possibile idea per il vostro caso. Quando l'utente scorre, piuttosto che disegnare piena risoluzione, trarre le CoreGraphics legati roba un contesto risoluzione mezzo. Poi prendere questo contesto come bitmap e la scala fino alla piena risoluzione. Questo sarebbe per iPhone4 solo e si perderebbe la qualità piacevole risoluzione più alta, ma solo mentre l'utente sta scorrendo.

Ecco un po 'di codice che ho scritto per il test tra i diversi dispositivi.

I miei risultati quando si visualizza la visualizzazione a schermo intero.

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

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

Altri suggerimenti

L'esperienza "è più lento", potrebbe descrivere in modo più preciso? Darò per scontato che il frame-rate del rotolo è stata abbassata al punto in cui non sembra liscia o anche balbetta.

Se è così, e se siete certi che sia la risoluzione che è la causa di questo, ci sono due metodi generali posso vedere.

  • aggiornamento ore per esempio metà dell'intervallo, rendendo metà fette larghe. Se Cocoa Touch non facilita questo, si potrebbe innescare un callback in un intervallo di tempo dal metodo di rendering che hai ora.
  • rendering "in anticipo ulteriormente" in modo che una parte del grafico nascosta ulteriormente fuori dell'area visibile viene resa quando è fatto scorrere in vista.

Sto assumendo che hai già guardato le proprietà "disegno" della vista, ecc opaco come fanno influiscono sulle prestazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top