Est drawRect() destinée à être simplement un crochet dans lequel exécuter votre code de dessin?
Il est destiné à redessiner la région (rect) qui est transmis à vous, à l'aide de l'actuel contexte graphique de la pile. Pas plus.
Ou est-ce la méthode censé également redessiner les régions qui sont "endommagé", et ont besoin d'être repeints?
Pas de. Si elle est sale régions ne se chevauchent pas, vous pouvez recevoir plusieurs appels d' drawRect:
avec les différents rectangles passé à vous. Rectangles sont invalidées à l'aide de setNeedsDisplayInRect:
. Si seulement une partie de votre point de vue de la surface doit être redessiné, puis il vous sera demandé de dessiner la partie quand il est temps de dessiner.
Puis-je tirer mon truc une fois et ensuite il "colle", ou dois-je repeindre l'ensemble de la scène à tout moment via drawRect()?
Il ne fait pas un "bâton". Rects devenir invalidé au cours de votre application d'exécution, et vous êtes prié de redessiner ces rectangles lorsque le point de vue des besoins du système de mise à jour de l'écran. Vous repeindre uniquement le rectangle qui est demandé.
Dans certains cas, une simple mise en œuvre peut (plutôt paresseusement) invalider le point de vue de l'ensemble de l'rect à chaque fois une partie est invalidé. C'est généralement mauvaise, parce qu'elle nécessite généralement plus de dessin que ce qui est nécessaire, et est particulièrement de gaspillage lorsque les vues ne sont pas opaques.
Java est Graphics2D objet fonctionne de cette façon - vous devez dessiner l'ensemble de votre "image" à chaque fois que paint() est appelée, de sorte que vous devez être prêt à re-construire, à tout moment (ou cache).
Pas avec AppKit ou UIKit.
Comment voulez-vous mettre en œuvre un simple programme de dessin? Auriez-vous à "rappeler" chaque ligne/point/trait que l'utilisateur a attiré, et de répliquer à chaque fois drawRect() est appelée?
Vous devrez vous rappeler le contexte (par exemple, chaque ligne/point/trait) nécessaires pour attirer votre point de vue. Vous avez seulement besoin d'attirer la région qui est demandé. Techniquement, le système graphique ne serait pas vous plaindre si vous deviez dessiner en dehors de cette rect, mais qui pourrait conduire à des artefacts.
Pour un rendu complexe, il peut être plus facile ou plus efficace pour attirer l'extérieur de la mémoire tampon (par exemple, bitmap), puis de l'utiliser que prerendered représentation bitmap pour obtenir les choses à l'écran, tandis que dans drawrect:
. (voir aussi sa réponse pour les couches)
Comment à propos de "offscreen" rendu; pouvez-vous faire à tous de votre dessin, puis en appel [auto setNeedsDisplay] d'avoir de vos écritures affichée à l'écran?
Oui, vous pouvez le faire. Plus précisément, vous rendre à un tampon (par exemple, une image bitmap), lorsque vous avez terminé le rendu de l'image bitmap, la nullité de l'rect vous souhaitez insérer, puis de dessiner à l'écran en utilisant les données de l'image lorsque drawRect:
est appelé.
Disons que, en réponse à un toucher de l'utilisateur, je veux mettre un "X" sur l'écran où il a touché jusqu'. Le X doit y rester, et chaque toucher de nouveaux produit une autre X. Dois-je rappeler de tous ces retouche coordonnées et ensuite en tirer tous dans drawRect() ?
Eh bien, vous avez quelques options. Votre proposition est l'un (en supposant que vous dessinez à l'intérieur de l'rect passé à vous). Une autre serait de créer un "X", de la vue, et il suffit de rappeler les points nécessaires à la reconstruction de la vue si vous avez besoin de ces Xs pour conserver sur lance. Dans de nombreux cas, vous pouvez facilement diviser des problèmes complexes dans des couches (simple jeu en 2D):
- 1) L'image de fond avec l'horizon.
- 2) Certaines choses dans le premier plan qui ne changent pas souvent.
- 3) Le personnage que le joueur utilise l'utilisateur de naviguer à travers le jeu.
Ainsi, la plupart des problèmes peuvent être facilement divisé de sorte que vous n'avez pas à rendre tout tout le temps. Cela réduit la complexité et améliore les performances si bien fait. Si fait mal, elle peut être de plusieurs bien pire.