méthode drawRect, NSImage et conseils de debug

tethystethys Membre
09:19 modifié dans API AppKit #1
Bonjour,
en réalisant une appli qui redessine une pièce sur une vue cible, j'ai quelquefois le dessin qui se passe bien, et d'autres fois rien qui ne se passe,
mes traces passent pourtant au même endroit et je n'arrive pas à  trouver de conditions systématiques qui expliqueraient l'un ou l'autre des comportements (dessin correct ou dessin inexistant),

auriez-vous un conseil de méthode pour debugger ces problèmes liés à  drawRect, à  part tracer le paramètre de l'image que l'on redessine,

sinon, est-ce que mon dessin sur ma vue peut être perturbé par le fait de dessiner sur une autre vue en même temps ?
(c'est fait à  la fin d'un drop qui fait un drawRect dans ma vue source)

Réponses

  • mpergandmpergand Membre
    09:19 modifié #2
    dans 1326042950:

    sinon, est-ce que mon dessin sur ma vue peut être perturbé par le fait de dessiner sur une autre vue en même temps ?
    (c'est fait à  la fin d'un drop qui fait un drawRect dans ma vue source)


    Non, il ne faut pas appeler drawRect directement !
    mais SetNeedsDisplay ou setNeedsDisplayInRect:
  • DrakenDraken Membre
    09:19 modifié #3
    Un développeur ne doit JAMAIS appeler drawRect() directement, car il ne contrôle pas la manière dont les vues sont affichées. L'OS fait sa petite "cuisine graphique" dans son coin, décidant lui-même des priorités d'affichage. En forçant l'affichage à  se faire immédiatement, tu interfères avec le processus d'affichage normal. C'est MAL !

    Tu dois utiliser SetNeedsDisplay pour indiquer que le contenu d'une vue n'est plus valable, pour que l'OS puisse la redessiner en tenant compte des autres opérations graphiques en cours.


  • Eric P.Eric P. Membre
    09:19 modifié #4
    dans 1326042950:

    sinon, est-ce que mon dessin sur ma vue peut être perturbé par le fait de dessiner sur une autre vue en même temps ?
    (c'est fait à  la fin d'un drop qui fait un drawRect dans ma vue source)


    Comme mpergand et Draken l'ont dit, si tu utilises SetNeedsDisplay, cela ne peux pas arriver et ne veux même rien dire.
    Tu ne peux pas dessiner "en même temps" dans 2 vues.
    Elles seront mises à  jour l'une après l'autre par 2 procédures drawRect différentes appelées par 2 SetNeedsDisplay (1 pour chaque vue).
  • tethystethys Membre
    09:19 modifié #5
    j'ai du mal m'exprimer
    je n'appelle jamais la fonction directement mais bien
    <br />	[self setNeedsDisplay:YES];<br />
    


    seulement je le fais dans deux vues différentes (avec deux méthodes drawRect donc) et également dans mon controlleur (qui fait un setImage d'une vue, accesseur qui fait lui-même un setNeedsDisplay)
    c'est juste une supposition, quelles peuvent être la cause de tels problèmes d'affichage, non systématiques ? - à  part des appels directs à  drawRect -
  • CéroceCéroce Membre, Modérateur
    09:19 modifié #6
    C'est difficile à  dire. Si tu faisais des choses compliquées, je dirais qu'il est possible que tu ne dessines pas dans le bon contexte graphique; mais quand drawRect: est appelée, le contexte graphique courant est celui de la fenêtre.

    Ensuite, il y a des choses plus évidentes:
    - couleur blanche ou totalement transparente
    - épaisseur du trait trop fine
    - dessin en dehors de la vue (ça arrive souvent lorsqu'on travaille avec les matrices).

    Pour déboguer, NSLog() pour l'affichage des coordonnées est souvent une bonne solution parce que ça n'interrompt pas le programme.
    J'ai personnellement mes propres NSLog() pour un point, un rectangle et une matrice.

    Quand on fait du graphisme, il y a toujours des petits algos pour calculer l'emplacement des éléments, etc. Je ne saurais que trop te conseiller de bien séparer chaque algo dans une méthode ou fonction pour pouvoir regarder au débogueur les paramètres d'entrée et ce que tu obtiens en sortie.

    Pour finir, deux applis qui servent souvent: Pixie pour voir si tu dessines bien au bon endroit (au pixel près), et Quartz Debug qui permet de voir les rafraà®chissements (parfois inutiles) d'écran.
  • tethystethys Membre
    09:19 modifié #7
    ok, merci du conseil, je vais en effet organiser un peu mon code et mon debug,
    mais je devrais trouver car j'avais backupé une version 'stable' avant des modifs.
    je découvre aussi ces outils Pixie et quartz Debug
    Mac fournit quand même une panoplie d'outils d'aide au dev qui semblent bétons et gratuits, rien que le FileMerge est très utile,
    d'ailleurs au sujet de FileMerge, est-il possible de modifier les fichiers en comparaison en 'transférant' une des modifs à  l'autre fichier ? c'est ce qui manque pour en faire un outil à  la hauteur d'un ExamDiff Pro sous Windows,
  • CéroceCéroce Membre, Modérateur
    09:19 modifié #8
    dans 1326145794:

    d'ailleurs au sujet de FileMerge, est-il possible de modifier les fichiers en comparaison en 'transférant' une des modifs à  l'autre fichier ?

    Oui.
  • HerveHerve Membre
    09:19 modifié #9
    Se souvenir aussi que la méthode graphique ("drawRect") dessine les objets les uns sur les autres. Si ta pièce est dessinée avant le reste, elle sera fort logiquement recouverte...
Connectez-vous ou Inscrivez-vous pour répondre.