2012-04-04 17 views
9

In meiner App verwende ich eine Screenshot-Methode. Auf meinem iPad 2 ist es sehr schnell (ca. 130 ms) diese Methode auszuführen. Aber auf dem neuen iPad (sicherlich aufgrund der höchsten Auflösung und der gleichen CPU) dauert es etwa 700 ms! Gibt es eine Möglichkeit, meine Methode zu optimieren? Vielleicht gibt es eine Möglichkeit, direkt mit der Grafikkarte zu arbeiten?iPad 3 langsam screenshot

Hier ist meine Screenshot Methode:

- (UIImage *)image { 
CGSize imageSize = self.bounds.size; 

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) UIGraphicsBeginImageContextWithOptions(imageSize, NO, [UIScreen mainScreen].scale); 
else UIGraphicsBeginImageContext(imageSize); 

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSaveGState(context); 
CGContextTranslateCTM(context, [self center].x, [self center].y); 
CGContextConcatCTM(context, [self transform]); 
CGContextTranslateCTM(context, -[self bounds].size.width * [[self layer] anchorPoint].x, -[self bounds].size.height * [[self layer] anchorPoint].y); 
[[self layer] renderInContext:context]; 
CGContextRestoreGState(context); 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
return image; 

}

Vielen Dank für Ihre Hilfe.

+0

Kann Ihnen hier nicht helfen. Aber ich denke, dass 700ms wirklich langsam sind. Sollte es nicht wie 130ms * 4 = 520ms sein? –

+0

Verwenden Sie 'UIGraphicsBeginImageContextWithOptions (imageSize, NO, 0.0f);' anstelle von 'UIGraphicsBeginImageContextWithOptions (imageSize, NO, [UIScreen mainScreen] .scale);'. Dies wird für 1: 1-Screenshot sorgen. Oder gibt es einen bestimmten Grund, warum Sie '[UIScreen mainScreen] .scale' dort benötigen? –

+0

@Jenox Ja, es hängt davon ab, aber es ist mehr wie 700ms. – Pierre

Antwort

3

Ich glaube, es war der Entwickler von Flipboard, der in einem Podcast über dieses Problem sprach. Es ist ein echtes Problem mit dem iPad 3, weil sie die Pixel vervierfacht haben.

Was er tat, war, den Screenshot vor der Zeit im Hintergrund zu machen, nicht wenn der Benutzer die Aktion einleitete - in seinem Fall, wenn der Benutzer die Seite "umblätterte".

Ich weiß nicht, ob dies Ihnen in Ihrem Fall helfen wird, aber es ist sicherlich ein praktikabler Ansatz für viele Fälle.

0

Dies kann oder kann nicht für Ihre Anwendung ausreichen, aber eine Option ist es, den Screenshot herunter zu skalieren, z. Übergeben Sie 0,5 als Skalierungsfaktor an UIGraphicsBeginImageContextWithOptions. 4x schneller, aber der Kompromiss ist ein Verlust von Detail/Auflösung.

Verwandte Themen