2012-01-17 3 views
0

J'utilise NSTimer pour actualiser 5 contextes et les coller sur 5 vues toutes les 0,03 secondes. Cela a bien fonctionné dans le simulateur et a fonctionné à un taux de trame très élevé, mais il a ensuite décroché lorsqu'il a été déployé sur un iPod. J'ai baissé le taux à .1 et vu peu d'amélioration. Existe-t-il un moyen plus efficace de redessiner ces contextes?Mauvaises performances de l'appareil lors de la redéfinition des vues

Certains code:

- (void)addViews{ 
[self.superview addSubview:mag]; 
[self.superview addSubview:vc]; 
[self.superview addSubview:na]; 
[self.superview addSubview:wave]; 
[self.superview addSubview:mon]; 

[self.superview addSubview:selector]; 

looper = [NSTimer timerWithTimeInterval:0.03 
           target:self 
           selector:@selector(setNeeds) 
           userInfo:nil 
           repeats:YES]; 

[[NSRunLoop mainRunLoop] addTimer:looper forMode:NSRunLoopCommonModes]; 
} 

-(void)setNeeds{ 
[mag setNeedsDisplay]; 
[vc setNeedsDisplay]; 
[na setNeedsDisplay]; 
[wave setNeedsDisplay]; 
[mon setNeedsDisplay]; 
} 

Ceci est l'ajustement du contexte appliqué à chaque vue. Essentiellement une loupe.

- (void)drawRect:(CGRect)rect { 
CGPoint magnifiedPoint = [viewToMagnify convertPoint:coordPoint fromView:self.superview]; 

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextTranslateCTM(context,(self.frame.size.width*0.5),(self.frame.size.height*0.5)); 
CGContextScaleCTM(context, 1.3, 1.3); 
CGContextTranslateCTM(context,-1*(magnifiedPoint.x),-1*(magnifiedPoint.y)); 
[self.viewToMagnify.layer renderInContext:context]; 
} 
+0

Probablement. Il est difficile d'en être sûr sans voir votre code, cependant. –

+0

Oui, c'est définitivement un problème de redessiner les contextes sur les vues. Je fais simplement trop de vues trop vite. J'aurais aimé connaître une méthode plus efficace. – MyNameIsKo

+2

Question évidente: pourquoi la minuterie? N'y a-t-il pas un événement (toucher/glisser pour déplacer la vitre d'exposition, données sous-jacentes modifiées, etc.) que vous pourriez raccorder à la place de ce mécanisme d'interrogation que vous avez construit? –

Répondre

1

Le dessin du Core Graphics est relativement lent car il n'est pas accéléré matériellement en utilisant OpenGL. Pour tout sauf le dessin le plus trivial, Core Graphics est trop lent pour l'animation en temps réel sur iOS.

L'animation de base est beaucoup plus rapide car elle utilise l'accélération matérielle OpenGL. Je suggère d'essayer de réaliser votre effet en utilisant autant que possible l'animation Core. Chaque UIView est soutenu par un CALayer afin que toutes les transformations que vous appliquez à votre propriété view.transform soient très rapides. Vous pouvez également masquer dynamiquement une vue à l'aide d'une image en définissant la propriété view.layer.mask. Vous pouvez peut-être simuler votre effet de grossissement en mettant à l'échelle la vue elle-même (ou une copie de la vue avec le même contenu) et en la masquant à un cercle. De cette façon, vous n'aurez jamais besoin d'appeler renderInContext ou de faire n'importe quel dessin CGContext, et le tout devrait fonctionner à une fréquence décente.

+0

Ceci est un très bon conseil et peut même être la réponse à mon problème. Mon problème maintenant est d'obtenir une copie de la vue principale que je veux agrandir sans utiliser de contextes. – MyNameIsKo

+0

Vraisemblablement, le code existe dans votre application pour générer cette vue en premier lieu. Ne pouvez-vous pas exécuter les mêmes méthodes pour en obtenir une copie? Ou copiez-vous profondément ses sous-vues dans une autre vue en faisant simplement une boucle sur les sous-vues et en générant de nouvelles vues du même type avec les mêmes propriétés? –

+0

Vous pouvez également en extraire une copie dans une vue d'image à l'aide de renderInContext, puis agrandir cette vue en utilisant la technique de transformation d'affichage. De cette façon, la performance de la copie de l'image ne se produit qu'une fois au lieu de chaque image pendant que vous effectuez un panoramique et un zoom et sera beaucoup moins visible. –

Questions connexes