Frage

Ich habe ein Diagramm mit Core Graphics gezeichnet.

Dieses Diagramm horizontal gescrollt werden kann und es ist gezeichnet, wie wir sie blättern.

Das Problem ist, dass auf 3G / 3GS die Geschwindigkeit und die Leistung der Scroll gut ist, aber auf dem iPhone 4 ist langsamer als erwartet.

Ich nehme an, dies ein Problem auf die höhere Auflösung des iPhone bezogen ist 4. Ist das richtig?

Wie kann ich die Leistung auf dem iPhone 4 erhöhen? Hat der Rahmen automatische Konvertierung auf iPhone 4 Auflösung zu ziehen oder ist es meine Arbeit?

Vielen Dank.

War es hilfreich?

Lösung

Das iPhone 4 viel langsamer, wenn es darum geht, Core Graphics Verarbeitung.

Eine mögliche Idee für Ihren Fall. Wenn der Benutzer blättert, anstatt mit voller Auflösung zu zeichnen, ziehen Sie Ihre Core Graphics Sachen eine halbe Auflösung Kontext bezogen. Dann nehmen Sie diesen Kontext als Bitmap und skaliert es in voller Auflösung auf. Dies würde nur für iPhone4 sein und Sie würden die schöne höhere Auflösung Qualität verlieren, aber nur sein, während der Benutzer scrollen.

Hier ist ein Code, den ich schrieb sich für zwischen den verschiedenen Geräten zu testen.

Meine Ergebnisse bei der Anzeige die Ansicht auf Vollbild.

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

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

Andere Tipps

Die Erfahrung „es ist langsamer“, könnte man es beschreiben genauer? Ich gehe davon aus, dass die Frame-Rate der Spirale abgesenkt wurde, wo es sieht nicht glatt oder sogar stottert.

Wenn ja, und wenn Sie sicher sind, dass es die Auflösung ist, dass die Ursache dafür ist, gibt es zwei allgemeine Methoden kann ich sehen.

  • Update um zum Beispiel die Hälfte des Intervalls, Rendering halb so breit Scheiben. Wenn Cocoa Touch nicht, dass erleichtern, können Sie einen Rückruf bei einem Zeitintervall von der Rendering-Methode auslösen Sie jetzt haben.
  • machen „weiter im Voraus“, so dass ein Teil der Grafik versteckt weiter außerhalb des sichtbaren Bereichs gemacht wird, wenn es auf den Bildschirm gescrollt wird.

Ich nehme an, Sie haben bereits bei den „Zeichnen“ Eigenschaften der Ansicht sehen, Opaque usw., wie sie die Leistung beeinträchtigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top