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

SDL Discussion :

pause lors du déplacement de la fenetre


Sujet :

SDL

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut pause lors du déplacement de la fenetre
    Salut tout le monde!

    Voila, j'ai remarqué que lorsqu'on déplace la fenêtre SDL a l'aide de la souris l'application se met en pause.

    ça me pose probleme, en effet je calcul le temps que met chaque iteration de ma boucle principale pour certaines opérations, en déplaçant la fenetre ce temps peut prendre des valeurs non voulus.
    il est simple de mètre de coté le traitement quand le temps de boucle est anormal, mais je préférerai ne manquer aucun traitement.
    y'a t'il donc un moyen de récupérer ce temps de pause affin de le soustraire au temps de la boucle?? ou de savoir si la fenetre est en cours de déplacement??

  2. #2
    Membre éclairé
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Points : 875
    Points
    875
    Par défaut
    Bonjour,

    N'est-ce pas le frametime qui aide dans ce cas là ? Le temps que prend une frame pour tout afficher.

    Et la frame suivante on applique les transformations des objets comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    déplacer.x * frametime;

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    ouaip, justement, le frametime est beaucoup trop elevé si jamais la fenêtre était déplacé.

    on pourrais avoir un frametime régulier avec une grosse augmentation d'un coup. par exemple, avec un déplacement de la fenêtre pendant 500 ms, si le programme a un frametime régulier ça donnerai ça :
    ... 10 .. 10 .. 10 .. 510 .. 10 .. 10 ...

    le déplacement de l'image ne serai pas donc régulier, au moment du déplacement de la fenêtre il y aurai comme une sorte de "saut". je voudrai éviter ça.

    si je savais pendant combien de temps a été déplacé la fenêtre, je pourrais corriger :
    ... (10-0) .. (10-0) .. (10-0) .. (510-500) .. (10-0) .. (10-0) ...

  4. #4
    Membre éclairé
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Points : 875
    Points
    875
    Par défaut
    On voudrait que l'image continue où elle s'était arrêtée lors du déplacement de la fenêtre ? Peut être essayer de ne pas baser le mouvement par rapport au frametime. Est-ce pour un besoin spécifique ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par Happy Voir le message
    On voudrait que l'image continue où elle s'était arrêtée lors du déplacement de la fenêtre ?
    exactement
    Citation Envoyé par Happy Voir le message
    Peut être essayer de ne pas baser le mouvement par rapport au frametime.
    le problème c'est que le déplacement est effectivement calculé en fonction du frametime.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Points : 413
    Points
    413
    Par défaut
    Salut,

    oui en effet avec SDL lors de manipulation de la fenetre le thread principal est bloque.

    La seule solution pour ne pas bloquer le rendu durant le deplacement de la fenetre (ou le clique sur la barre de titre en general) serait sans doute d utiliser un autre thread.

    Sinon la solution facile pour eviter des "sauts" dans l update du a une frame trop longue lorsque l update reprend est de de clamper le deltatime avec quelque chose du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Calcul du deltaTime 
    // ...
     
    if (deltaTime > MAX_DELTA_TIME)
        deltaTime = MAX_DELTA_TIME;
    Apres il faut bien regler MAX_DELTA_TIME :
    trop bas et les pc peu puissants feront tourner l appli au ralenti
    trop haut et il y aura toujours des sauts

    Apres tu peux peut etre mixer ca avec l evenement SDL_VIDEOEXPOSE (envoye lorsque la fenetre est modifiee de l exterieur). Par exemple clamper le deltatime uniquement si on catch cet evenement, ou alors carrement sauter l update de cette frame.
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    Apparemment SDL_VIDEOEXPOSE ne correspond qu'a l'agrandissement de la fenêtre après l'avoir réduite dans la barre de tache. aucune réaction au déplacement de la fenêtre.

  8. #8
    Membre éclairé
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Points : 875
    Points
    875
    Par défaut
    Ou bien si le deltaTime est trop grand, appliquer le dernier bon deltaTime. Juste une idée.

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    Ouai, ça parait être une bonne solution, mais c'est pareil que de ne pas traiter les données anormales, on se contente de remplacer les données erronées par quelque chose de plus "normal" mais ça ne correspond pas à la réalité.

    bref, si il n'y a pas moyen de récupérer ce "temps de pause", cette solution reste correcte.

  10. #10
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Je pense qu'un temps max_delta_time te conviens aussi: Par exemple, imagine, il y a un gros ralentissement de l'ordi, tu voudrais pas qu'il y ait un saut non plus, et là je ne vois que le max_delta_time comme solution.

    Sinon, à mon avis, il faudrait utiliser http://www.libsdl.org/cgi/docwiki.cgi/SDL_SysWMEvent, ou alors récupérer la position de la fenêtre avec SDL_VIDEO_WINDOW_POS (regarde envvars dans la doc) mais je sais pas si c'est automatiquement mis à jour, tu pourrais aussi utiliser http://www.libsdl.org/cgi/docwiki.cgi/SDL_GetWMInfo pour avoir le handle sur la fenêtre, et récupérer la position.

    Tout ça pour te dire que je préfère la solution du delta max
    Après peut-être que si seul le main thread est bloqué tu as moyen de faire qqchose avec un thread parallèle?

  11. #11
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    j'évite au maximum les threads, je me contenterai du delta max bien que ça ne soit pas exactement ce que je cherche, ça fonctionne très bien.

  12. #12
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 855
    Points : 218 551
    Points
    218 551
    Billets dans le blog
    118
    Par défaut
    J'avais eu le même problème ( pas pour la SDL par contre ) et il semble aussi que ce soit limité à Windows ( pas sur ). La solution n'est pas vraiment le delta.

    On récapitule:

    Nous avons une animation ( scrolling à la noix ) qui se base sur la différence de temps entre deux images pour connaitre sa nouvelle position.
    Lorsque l'on clique sur l'on clique sur la barre de titre ( ou déplacement de la fenetre ), le programme se met en pause ( Si je me rapelle bien, le programme n'est plus executé ... ).
    Le problème c'est que lorsque l'on a relaché, le temps entre les deux images et immense ( par rapport à d'habitude ).

    La solution est pourtant ultra simple. Comme le programme n'est plus exécuté, il faut juste crée un Temps virtuel.
    A chaque update du programme ... on incrémente une sorte de compteur ( ou temps virtuel ) qui techniquement, à le même impact que le temps machine. Du coup, comme pendant la pause, le compteur ne sera pas incrémenté, bah il n'y aura pas de problème de "saut".
    De plus un temps virtuel est super pratique dans les animations ( on peut faire des marche arrière avec des systèmes d'interpolation... )

    Exemple:

    Si l'on fait un update fixe du programme ( disons toutes les 15 ms ), dans la fonction d'update y a juste à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    virtualTime += 15;
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  13. #13
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Ce qui est bien avec le virtual time c'est qu'on peut mettre le jeu en pause facilement

  14. #14
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    d'après moi ta technique revient au même que de ne pas tenir compte du temps. dans ce cas il suffit de faire une simple incrémentation de positionavec un Delay ou autre pour que ça n'arrive que toutes les 15ms par exemple. l'objet se déplacera d'un px toutes les 15 ms minimum, et selon l'ordinateur, la vitesse sera saccadée.

  15. #15
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 855
    Points : 218 551
    Points
    218 551
    Billets dans le blog
    118
    Par défaut
    Pas vraiment ... Le virtual time est basé sur le temps réel, quand même. Votre boucle de jeu, reste la même que celle que vous avez actuellement ( avec la pause et l'update toute les 15 ms ).
    Ce qui donne, que dans cette update, votre temps virtuel est augmenté par une valeur fixe, certe, mais que comme cette fonction est appelé que toute les 15 ms , ça reste absé sur le temps )

    Si vous avez des problèmes sur la conception du la boucle de jeu, je pense qu'actuellement la meilleur idée est de lire cette article:
    http://dewitters.koonsolo.com/gameloop.html
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/04/2014, 09h36
  2. Réponses: 22
    Dernier message: 27/12/2008, 00h12
  3. Interdire déplacement d'une fenetre
    Par ramoud dans le forum Visual C++
    Réponses: 5
    Dernier message: 18/12/2006, 16h37
  4. Réponses: 2
    Dernier message: 24/11/2005, 17h33
  5. [TForm] Problème lors du déplacement d'une fenêtre sans barre de titre
    Par Benjamin GAGNEUX dans le forum Composants VCL
    Réponses: 3
    Dernier message: 14/10/2004, 17h10

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