IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Apple Discussion :

autorefresh sur un NSOpenGLView [Cocoa]


Sujet :

Apple

  1. #1
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 451
    Points
    28 451
    Par défaut autorefresh sur un NSOpenGLView
    Bonjour,

    je teste OpenGL sous cocoa (sous Delphi XE2) et je rencontre un problème pour lequel je ne trouve pas de solution satisfaisante.

    j'ai un NSOpenGLView avec ses méthodes "prepareOpenGL" et "drawRect:" qui me permettent d'affiche ce que je veux. Mais cet affichage est fonction du temps, je veux donc forcer une réaffichage "aussi souvent que possible" pour avoir une animation.

    typiquement, sous Windows j'invoque InvalidateRect() à la fin du message WM_PAINT pour redessiner ma fenêtre en boucle.

    Or, si j'invoque "setNeedsDisplay: YES" à la fin de la méthode "drawRect:" ma fenêtre ne se redessine pas.

    Je ne veux pas utiliser un Timer qui forcerait une périodicité, je veux que mon application affiche l'image "aussi souvent que possible", indiquer que le contenu doit être redessiné me semble être l'approche la plus douce...mais elle ne fonctionne pas.

    Une solution serait aussi d'avoir un événement "Idle", sous Windows c'est un traitement qu'on lance quand la pile de message est vide et que l'application n'a rien à faire... existe-il l'équivalent dans NSApplication ?

    EDIT: j'ai tenté un "setNeedsDisplay: YES" dans "applicationDidUpdate:" mais ça ne fonctionne pas non plus ! Alors que si je l'invoque depuis un bouton ça fonctionne...

    EDIT: en fait si ça fonctionne avec "applicationDidUpdate:" mais pas en boucle, il faut que je bouge la souris par exemple...

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 451
    Points
    28 451
    Par défaut
    J'ai trouvé une solution !

    version Objective-C (approximative, ce n'est pas mon langage de programmation)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    {
    // déclarer l'évènement "IdleEvent"
     [[NSNotificationCenter defaultCenter] addObserver:self selector:OnIdle name:@"IdleEvent" object:null]
     
    // déclarer une notification
     NSNotification* DoIdle = [NSNotification notificationWithName:@"IdleEvent" object:self]
    
    // a lancer avant Run et à chaque execution de OnIdle :)
     [[NSNotificationQueue defaultQueue] enqueueNotification:DoIdle postingStyle:NSPostWhenIdle]
    }
    
    - void OnIdle(NSNotitication *notification) {
     ... 
    }

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 451
    Points
    28 451
    Par défaut
    il y a tout de même un bémol

    si je clique sur un bouton et garde le bouton enfoncé...l'Idle ne se produit plus

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 952
    Points : 4 378
    Points
    4 378
    Par défaut
    lire la doc de NSTimer et de la famille des performSelectorOnMainThread:...

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 451
    Points
    28 451
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    lire la doc de NSTimer et de la famille des performSelectorOnMainThread:...
    tu me suggères d'utiliser un timer ? et donc de fixer le framerate...ça me plait moyen.

    d'autre part, pour autant que je comprenne le fonctionnement de tout cela, le problème vient d'un traitement des messages de souris dans une boucle différente (NSEventTrackingRunLoopMode) qui ne traite pas ma notification Idle et probablement pas non plus le timer.

    j'en suis à me demander s'il ne faudrait pas surcharger nextEventMatchingMask:untilDate:inMode:dequeue: - qui semble être le point central de traitement des events - pour glisser un Idle quand la queue est vide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Débat sur l'I.A (Intelligence Artificielle)
    Par Anonymous dans le forum Intelligence artificielle
    Réponses: 457
    Dernier message: 05/07/2016, 01h11
  2. Documentation gratuite sur l'API Windows, COM, DCOM, OLE, etc.
    Par Community Management dans le forum Windows
    Réponses: 1
    Dernier message: 16/11/2006, 15h28
  3. [Kylix] Kylix embarqué sur PDA ?
    Par Anonymous dans le forum NoSQL
    Réponses: 10
    Dernier message: 29/11/2002, 13h59
  4. Réponses: 4
    Dernier message: 27/03/2002, 11h03
  5. F.A.Q, Doc, cours, tutoriels sur JBuilder
    Par Ricky81 dans le forum JBuilder
    Réponses: 0
    Dernier message: 14/03/2002, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo