2009-04-10 5 views
2

Je suis nouveau à Quartz2d donc j'espère que c'est une question facile à répondre.Quartz2D et écrêtage - Optimiser cette routine de dessin?

J'ai un scrollview dont la trame de contenu est 1024x768. Dans ce cadre, je pousse une vue personnalisée (avec l'image 1024x768) qui utilise Quartz2d pour faire un dessin. L'idée est, j'ai une grande zone que l'utilisateur peut faire défiler pour voir différentes parties.

Le problème que j'ai est, quand je fais défiler sur l'appareil, je reçois des erreurs d'avertissement de mémoire ou de performances de défilement terribles. C'est sans doute parce que je redessine tout le champ 1024x768. Je pensais que définir le chemin de détourage à l'offset UIScrollView aiderait .. et il le fait .. jusqu'à ce que je défile .. auquel cas la vue ne se redessine pas jusqu'à ce que le défilement s'arrête. dire à la vue de dessiner pendant scrollViewDidScroll entraîne également de mauvaises performances

quelqu'un peut-il me dire comment je peux optimiser ma routine de dessin?

i ont deux images .. dont un est se masqué, et les deux étant peints à l'écran (l'un sur l'autre)

- (void)drawRect:(CGRect)dirtyRect {

CGContextRef myContext = UIGraphicsGetCurrentContext(); 


// get our offset (where we've scrolled to) 
CGPoint offset = scrollView.contentOffset; 

    // clip to our offset.. uncomment for good performance but terrible scrolling 
//CGContextClipToRect(myContext, CGRectMake(offset.x, offset.y, 480, 320)); 


// make an image from the mask context 
CGImageRef aMaskImage = CGBitmapContextCreateImage (myMaskContext); 

// mask the first image 
CGImageRef aImage = CGImageCreateWithMask(myImageRef1, aMaskImage); 

CGContextDrawImage(myContext, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), myImageRef1); 
CGContextDrawImage(myContext, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), aImage); 


CGImageRelease(aImage); 
CGImageRelease(aMaskImage); 

}

merci à l'avance pour toute aide que vous pouvez fournir !

Répondre

0

Généralement, pour optimiser le défilement de grandes choses, vous devriez regarder dans CATiledLayer.

+0

merci. Je n'ai pas le temps de regarder cela maintenant, mais j'attribue cette réponse comme la seule et semble raisonnable. :) – dev

+0

Je suppose que l'autre réponse est d'observer l'argument dirtyRect, mais je pense que CATiledLayer est plus susceptible d'aider. –

0

Je suppose quelque part que vous appelez setNeedsDisplay. Vous devez appeler setNeedsDisplayInRect. Assurez-vous de ne transmettre que le rect qui a changé.

Questions connexes