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

GTK+ avec C & C++ Discussion :

[Gtkmm] Mise à jour graphique plus rapide.


Sujet :

GTK+ avec C & C++

  1. #1
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut [Gtkmm] Mise à jour graphique plus rapide.
    Bonjour, j'ai besoin d'aide pour régler un problème de mise à jour grpahique qui visiblement à un rapport avec la manière dont gtkmm gère les expose events.

    Je monte une application de test (sous Ubuntu64Bit) qui vise à intégrer Berkelium (http://berkelium.org) dans gtk(mm) - et sera open source dés que je peu pusher le repo (problèmes d'acces depuis le boulot).

    Berkelium est mis à jour (Berkelium::update()) toutes les 33 millisecondes. Il mets à jour les Berkelium::Window qui eux même envoie des messages (via fonctions virtuelles...) à des Berkelium::WindowDelegate. Celui pour l'affichage est onPaint().
    Dans onPaint() je copie les pixels d'un buffer fournis. En fait on nous fournis une liste de rectangles à mettre à jour, donc je copie les pixels de ces rectangles dans une Cairo::Surface que je garde pour chaque Berkelium::Window que j'ai créé.

    Mes Berkelium::WindowDelegate héritent aussi de Gtk:rawingArea. Du coup pour chaque rectangle modifié, j'appelle queue_draw_area(). De cette manière je m'attends à ce que on_expose_event() soit appelé pour chaque rectangle au moins.

    J'ai d'abord surchargé on_expose_event() pour copier les rectangles depuis mon buffer vers la fenetre (en utilisant un Cairo::Context créé depuis la fenetre courante).

    Ca marche, moyennant des rectangles mal placés, mais j'imagine que je dois avoir des bugs.

    Ce qui me prose problème est que visiblement, on_expose_event() n'est pas appelé pour chaque mise à jour graphique, et je ne trouve pas le moyen de forcer gtkmm(Gtk::Main?) à bien mettre à jour chaque des carrés.

    Par exemple, j'ai des animations flash dans les pages que je veux afficher. Ces animations ne sont mises à jour que sporadiquement, ce qui fait qu'on voit environ une frame toutes les 2 à 3 secondes. Pire : on ne voit pas la fin des animations.

    Il se peut que le problème vienne de Berkelium parceque cela ne concerne quasimment que les animations en flash. Par exemple les animations en gif sont mises à jour correctement.
    Mais il se peut aussi que ce soit parceque flash provoque énormément de mises à jour graphique et que cela est l'effet inverse dans la mise a jour de gtk, c'est à dire que certains events de mises à jour serait zappés.


    Est-ce que quelqu'un a déjà vu ce genre de problèmes?

    J'ai déjà vu quelque part qu'il valait mieu implémenter un handler connecté à un signal_expose(), ce que j'ia fait mais ne change strictement rien.

    Une idée?

  2. #2
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Isoler la cause du problème
    Pour isoler la cause du problème (Gtk ou Berkelium ?) pourquoi ne pas rafraichir un rectangle toutes les 35 ms avec une séquences d'images (par exemple 50 images blanches avec un point qui se déplace).

  3. #3
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Citation Envoyé par Klaim Voir le message
    je copie les pixels de ces rectangles dans une Cairo::Surface que je garde pour chaque Berkelium::Window que j'ai créé.
    Tu utilises bien les zones de clipping pour cela ? Parce que sinon tu redessines trop de choses... Plus la zone redessinée est grande, et plus cela prend de temps...
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  4. #4
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Oui j'utilise le cliping. Je pense qu'il doit y avoir des accès concurrenciels par contre parceque je comprends pas pourquoi les rectangles dessinés sont souvent mal placés.

    Je vous fourni les sources très bientot TT__TT

  5. #5
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Gtk(mm) et Berkelium marchent tous les deux parfaitement.

    C'est dans mon glue-code que je copiais des buffers graphiques sans prendre en compte le fait que c'étaient des positions relative au rectangle courant...

    C'est corrigé, maintenant tout marche et les animations sont fluides comme sur mon browser.


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

Discussions similaires

  1. [Débutant] Mise à jour graphique dans une autre figure que la principale
    Par Luis Vieira da Silva dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 26/06/2009, 13h04
  2. Mise à jour la plus simple d'un record
    Par dsolheid dans le forum Windows Forms
    Réponses: 2
    Dernier message: 10/01/2008, 02h01
  3. Mise à jour graphiques
    Par ThieBEN dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/12/2007, 17h08
  4. [Graphique]Problème Mise à jour graphique
    Par ThieBEN dans le forum IHM
    Réponses: 13
    Dernier message: 05/04/2007, 17h52
  5. [Conception] afficher la date de la mise à jour la plus récente
    Par dedel53 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 16/03/2007, 00h43

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