2012-04-04 17 views
9

W mojej aplikacji używam metody zrzutów ekranu. Na moim iPadzie 2 jest bardzo szybki (około 130 ms), aby wykonać tę metodę. Ale na nowym iPadzie (na pewno ze względu na najwyższą rozdzielczość i ten sam procesor) zajmuje to około 700 ms! Czy istnieje sposób na optymalizację mojej metody? Być może istnieje sposób na bezpośrednią pracę z kartą graficzną?iPad 3 powolny zrzut ekranu

Oto moja metoda screenshot:

- (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; 

}

Dzięki za pomoc.

+0

Nie mogę ci tu pomóc. Ale myślę, że 700ms jest naprawdę powolne. Czy nie powinno to być 130ms * 4 = 520ms? –

+0

Spróbuj użyć 'UIGraphicsBeginImageContextWithOptions (imageSize, NO, 0.0f);' zamiast 'UIGraphicsBeginImageContextWithOptions (imageSize, NO, [UIScreen mainScreen] .scale);'. Spowoduje to zrzut ekranu 1: 1. Czy jest jakiś szczególny powód, dla którego potrzebujesz "[UIScreen mainScreen] .scale"? –

+0

@Jenox tak, to zależy, ale to raczej 700ms. – Pierre

Odpowiedz

3

Myślę, że to twórca Flipboarda mówił o tym problemie w podcastach. To prawdziwy problem z iPadem 3, ponieważ zwiększył czterokrotnie piksele.

To, co robił, robił zrzut ekranu z wyprzedzeniem w tle, a nie kiedy użytkownik zainicjował akcję - w przypadku, gdy użytkownik "przewrócił" stronę.

Nie wiem, czy to ci pomoże w twoim przypadku, ale z pewnością jest dobrym rozwiązaniem w wielu przypadkach.

0

To może ale nie musi wystarczyć dla twojej aplikacji, ale jedną z opcji jest zmniejszenie skali ekranu, np. przekazać 0,5 jako współczynnik skali do UIGraphicsBeginImageContextWithOptions. 4x szybciej, ale kompromisem jest utrata szczegółów/rozdzielczości.