11
votes

Économiser et restaurer CGContext

J'essaie de sauvegarder et de restaurer un CGContext pour éviter de faire des calculs de dessin lourds pendant une seconde fois et je reçois l'erreur : CGGSTACKRESTore: Bitt de gstack .

Qu'est-ce que je fais mal? Quelle est la bonne façon de faire cela? xxx


0 commentaires

3 Réponses :


7
votes

Ne voulez-vous pas enregistrer d'abord, puis restaurer? Si vous restaurez avant une sauvegarde, il n'y a pas de contexte à restaurer, et vous obtiendriez une sous-fluide.

Voici la façon dont je l'ai utilisée: P>

  CGContextRef context = UIGraphicsGetCurrentContext();
  CGContextSaveGState(context);
  CGContextAddRect(context, originalRect);
  CGContextClip(context);

  [self drawInRect:rect];

  CGContextRestoreGState(context);


0 commentaires

20
votes

Je pense que vous êtes peut-être mal interpréter ce que cgcontextsavegstate () et cgcontextrestoregstate () faire. Ils poussent l'état graphique actuel sur une pile et l'apparaissent, vous permettant de transformer l'espace de dessin actuel, de changer de styles de ligne, etc., puis de restaurer l'état à ce qu'il était avant de définir ces valeurs. Il ne stocke pas les éléments de dessin, comme des chemins.

de la Documentation sur CGContextsavegState () :

Chaque contexte graphique maintient un pile d'états graphiques. Noter que Tous les aspects du dessin actuel environnement sont des éléments de la état graphique. Par exemple, le Le chemin actuel n'est pas considéré comme faisant partie de l'état graphique et est donc non enregistré lorsque vous appelez le CGContextsavegstate () Fonction.

La pile d'état graphique doit être réinitialisée au début de votre Drawrect: , c'est pourquoi vous obtenez des erreurs lorsque vous essayez de faire sauter un état graphique de la pile. Depuis que vous n'aviez pas poussé celui-ci, il n'y avait pas de tomber. Tout cela signifie que vous ne pouvez pas stocker votre dessin comme état graphique sur la pile, puis le restaurer plus tard.

Si tout ce que vous êtes inquiet consiste à mettre en cache votre dessin, cela se fait pour vous par le Calayer qui renvoie votre uiview (sur l'iPhone). Si tout ce que vous faites, c'est bouger votre vue, ce ne sera pas redessiné. Il ne sera tiré que si vous le direz manuellement de le faire. Si vous devez mettre à jour une partie du dessin, je vous recommande de scinder les éléments statiques sur leurs propres vues ou calayeurs afin que seule la partie qui change soit redessinée.


0 commentaires

0
votes

.. Basé sur votre code!, Il semble que vous restaurez le contexte avant de l'économiser. Première chose d'abord:

  1. Créer un contexte
  2. Enregistrez son état, AKA PUSH
  3. Faites des choses avec le contexte
  4. restaurer le contexte aka pop
  5. règle générale de chaque Store (poussoir) Il doit y avoir restaurer (pop)
  6. Relâchez le contexte lorsque vous avez terminé! Cela fait référence à ces contextes / s qu'ils ont cgCreate , cgCopy ,

    échantillon code: xxx


0 commentaires