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

2D Java Discussion :

Affichage rapide, quelle librairie?


Sujet :

2D Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 37
    Points : 16
    Points
    16
    Par défaut Affichage rapide, quelle librairie?
    Salut,

    Je suis en train de développer un petit shoot'em up (-> http://www.gemine.net/shootemup002.jar ) et je suis confronté à quelques problèmes de performance : je suis à 5 vaisseaux à peine et ça rame sur certaines machines... Pourtant je compte bien rajouter de nombreux objets dans l'écran de jeux, il faut donc absolument que je puisse gérer beaucoup plus vite chaque mise à jour du JPanel dans lequel je dessine.
    En essayant d'optimiser une première fois, j'ai modifié légèrement mon code pour qu'aucune image ne soit chargée au moment de l'affichage (en effet j'avais fait une ou deux bétises et certaines images étaient chargée depuis le disque dur au moment de l'affichage !) mais ce n'est toujours pas suffisant.

    Je me tourne donc vers vous pour que vous me conseillez une autre solution. Actuellement j'utilise awt/swing, pensez vous que si je me tournais vers LWJGL ou JOGL, je pourrais gagner beaucoup en performance et j'aurais une application fluide avec un grand nombre d'objet à afficher à l'écran?

    Si vous pensez que mon problème vient plutôt de ma façon de coder, je peux mettre les fichiers sources en ligne.

    Merci d'avance

  2. #2
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 641
    Points
    7 641
    Par défaut
    Salut,

    Citation Envoyé par Quintoff
    ça rame sur certaines machines...
    Est-ce qu'il y a quelques points communs entre les machines qui rament? Processeur? Mémoire? Système? Version de JRE?
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Utilises tu des images compatibles?

    http://www.jroller.com/page/gfx/?anc...p_effects_part

    Car celles ci augmente la vitesse de traitement en s'assurant qu'elles sont boien compatibles avec la carte graphique

    De même tu pourrait essayer de ne repeindre que certaines parties de ton JPanel et utilisant le clip des formes affichées
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 37
    Points : 16
    Points
    16
    Par défaut
    >Est-ce qu'il y a quelques points communs entre les machines qui rament? Processeur? Mémoire? Système? Version de JRE?

    La machine avec laquelle je développer est un AMD Athlon 2400+ avec 512 Mo de ram et tourne sous Ubuntun 6.10, je l'ai testé avec sous un MacBook Pro et ça tourne beaucoup mieux mais pas de là à mettre 10 tirs joueurs + 30 tirs ennemis + 5 rochers + 10 vaisseaux ...
    Sinon sous windows j'ai pas vraiment ajouter des objets pour tester mais ça à l'ai de tourner +- comme mon AMD et même peut être un peu plus fluide.
    Pour info sous Ubuntu j'ai des problème avec certain mode de couleur (24 bits notamment) et j'ai quelques doutes sur l'utilisation de la carte graphique.

    >Utilises tu des images compatibles?

    Je connaissais, je cours mettre ça en place
    EDIT : Je connaissais PAS

    >De même tu pourrait essayer de ne repeindre que certaines parties de ton JPanel et utilisant le clip des formes affichées

    Ca ce n'est pas vraiment possible car je dois rafraîchir toute la zone de jeux (fond défilant + grande superficie occupée par les tirs et vaisseaux).

    Sinon quand je parcours la liste des vaisseaux et des tirs à afficher, j'utilise des Iterator qui parcourent des ArrayList, vous pensez qu'il y a un méthode plus efficace (de simples tableaux ne suffisent pas, les listes sont appellées à changer de taille régulièrement).

    Merci d'avance

  5. #5
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    pour les ArrayList mieux vaut passer par une boucle for qu'un iteratot (ceci est vrai pour toute classe implémentant RandomAccess)
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  6. #6
    Membre actif Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 239
    Points
    239
    Par défaut
    Salut,

    Si tu en as la possibilité, je te conseignerai de passer ton jeux en mode plein écran(http://java.sun.com/docs/books/tutor...een/index.html). Je suis aussi en train de faire un jeux qui possède différent mode d'affichage et le plus rapide(de loin) c'est quand je suis en mode plein écran.

    Bonne année à tous,
    Hydraland

  7. #7
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 108
    Points : 3 203
    Points
    3 203
    Par défaut
    Si tu envisage la 3D, je conseil JMonKeyEngine, on fait des trucs superbes rapidement. http://jmonkeyengine.com/
    Ce moteur tourne sur LWJGL.

    l'import de nombreux formats 3D (3dsmax,maya,quake...) et la facilité de créer des maps (avec 2 images jpg) est sont point fort.
    Il a de tres nombreuses capacités 3D, bloom,antialiasing,vertexshader,...

    Il est loin devant Java3D .

    un petit tour dans les demos : http://jmonkeyengine.com/index.php?o...d=25&Itemid=48
    Systèmes d'Informations Géographiques
    - Projets : Unlicense.science - Apache.SIS

    Pour un monde sans BigBrother IxQuick ni censure RSF et Les moutons

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 37
    Points : 16
    Points
    16
    Par défaut
    Merci pour vos réponses,

    >pour les ArrayList mieux vaut passer par une boucle for qu'un iteratot

    Utiliser un boucle for comme ceci tu veux dire ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(Object o : collection) {
        //...
    }
    >Si tu en as la possibilité, je te conseignerai de passer ton jeux en mode plein

    Ok je vais essayer de faire ça et je te tiens au courant

    >Si tu envisage la 3D, je conseil JMonKeyEngine

    Merci pour l'info, c'est bon à savoir que ce soit pour ce projet ou évetuellement pour d'autre à venir.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 37
    Points : 16
    Points
    16
    Par défaut
    sinok > Le problème c'est que je dois enlever certains objets de l'ArrayList pendant que je le parcours ... Alors si j'utilise un for, je n'ai pas d'Iterator et donc je dois enlever l'objet directement dans l'ArrayList mais comme il est en cours de lecture, Java le place en lecture seule et donc si je tente de le modifier j'ai une exception. J'ai contourner ce problème pour l'ajout de nouveaux objets dans l'ArrayList : quand je dois ajouter un objet quand il est en cours de lecture, je le met en "liste d'attente" et j'attends que l'ArrayList ne soit plus lu pour ajouter la liste.

    Pour en lever un objet je fais simplement ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Iterator i = maCollection.iterator();
    while(i.hasNext()) {
              //...
              if(condition) i.remove();
    }
    Pense tu que je devrais faire une "liste d'attente" également pour les objets à enlever ou alors ça alourdirait encore mon programme?

    Merci d'avance

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 37
    Points : 16
    Points
    16
    Par défaut
    Désolé pour le triple post mais pour ce qui est des image compatibles, je vois comment créer une image compatible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BufferedImage image = gc.createCompatibleImage(width, height);
    Mais là mon image est vide...

    Alors après si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    image = ImageIO.read(this.getClass().getRessource("monimage.png"));
    Mon image ne sera plus une image compatible...

    D'où ma question, comment charger une image depuis le disque dur et la rendre compatible?

    Merci d'avance

  11. #11
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par Quintoff
    Désolé pour le triple post mais pour ce qui est des image compatibles, je vois comment créer une image compatible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BufferedImage image = gc.createCompatibleImage(width, height);
    Mais là mon image est vide...

    Alors après si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    image = ImageIO.read(this.getClass().getRessource("monimage.png"));
    Mon image ne sera plus une image compatible...

    D'où ma question, comment charger une image depuis le disque dur et la rendre compatible?

    Merci d'avance
    Regarde le lien de Sinok, tu y trouveras cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static BufferedImage loadCompatibleImage(URL resource) throws IOException {
        BufferedImage image = ImageIO.read(resource);
        GraphicsConfiguration configuration = GraphicsEnvironment.
          getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
        BufferedImage compatibleImage = configuration.createCompatibleImage(image.getWidth(),
                                                                            image.getHeight());
        Graphics g = compatibleImage.getGraphics();
        g.drawImage(image, 0, 0, null);
        g.dispose();
        return compatibleImage;
      }

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 37
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par wichtounet
    Regarde le lien de Sinok, tu y trouveras cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static BufferedImage loadCompatibleImage(URL resource) throws IOException {
        BufferedImage image = ImageIO.read(resource);
        GraphicsConfiguration configuration = GraphicsEnvironment.
          getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
        BufferedImage compatibleImage = configuration.createCompatibleImage(image.getWidth(),
                                                                            image.getHeight());
        Graphics g = compatibleImage.getGraphics();
        g.drawImage(image, 0, 0, null);
        g.dispose();
        return compatibleImage;
      }
    Merci, alors quand je charge mes images de cette façon, ça fonctionne vraiment très bien! Sauf que j'utilise des images partiellement transparentes, les pixels transparents sembles remplacés par des pixels aléotoires alors je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    configuration.createCompatibleImage(image.getWidth(), image.getHeight(), Transparency.TRANSLUCENT);
    Mais la le programme devient au moins 5 fois plus lent!

    Dois-je dire adieu à la transparence? Ce serait difficile dans ce contexte...

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 37
    Points : 16
    Points
    16
    Par défaut
    Je suppose que c'est un problème avec le driver pour ati de ubuntu parce que sous Mac os X (macbook pro) ça gère la transparence sans que je doive préciser quoi que ce soit et c'est beaucoup plus performant! Plus de 500 vaisseaux sans que ça rame..

  14. #14
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Salut,

    Le problème vient de ta gestion de l'affichage...

    Par décompilation de ton .jar, j'obtiens ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            do
            {
                ecran.repaint();
                try
                {
                    Thread.sleep(15L);
                }
                catch(Exception exception) { }
            } while(true);
    et toute la "création" de l'image est faite dans paintComponent.

    Pour la création de l'image dans paintComponent, c'est un défaut car tu considères que le rafraîchissement sera appelé uniquement quand tu fais toi-même le repaint (toutes les 15 ms environ). Or il peut y avoir d'autres appels "automatiques", qui entraînent une reconstruction de l'image inutile (alors que tu aurais pu la garder en mémoire, avec une BufferedImage ou VolatileImage, que tu te contenterais de dessiner sur ton Graphics de paintComponent).

    Pour l'autre problème, c'est un peu plus grave niveau perfs...
    Si ton rafraichissement (l'appel réel à paintComponent, qui est asynchrone par rapport à l'appel à repaint()) se termine plus de 15ms après l'appel à repaint(), ton système s'écroule, et ça rame...
    Et en plus parfois ça rafraichit alors qu'il n'y a pas besoin...

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 37
    Points : 16
    Points
    16
    Par défaut
    Merci,

    Et si j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setIgnoreRepaint(true);
    ?

    De cette façon je n'aurais plus d'appels à repaint extérieurs à mon programme donc le premier problème ne devrait plus se présenter?

    Pour ce qui est du cas où l'affichage de l'écran de jeux dépasse la pause que je fais entre chaque appel, je pensais que comme c'était écrit, le programme attendait la fin de paintComponent(g) avec de faire une pose?

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    Utilise tu du double buffering ? Sinon c'est a envisager.
    http://java.sun.com/docs/books/tutor...doublebuf.html

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 37
    Points : 16
    Points
    16
    Par défaut
    Non je n'en utilisais pas car même si généralement le résultat obtenus lors d'une animations avec du double buffering et plus agréable, il réduit la vitesse de rafraîchissement de l'écran et je n'avais pas assez de vitesse pour me le permettre (test à l'appuis). Mais maintenant que j'utilise des images compatibles et que j'ai gagné beaucoup, je pense que je vais l'appliquer à mon application.

    Merci

    Sinon quelqu'un à une idée pour mon problème de transparence sous Ubuntu?

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 37
    Points : 16
    Points
    16
    Par défaut
    Voila je suis passé à AWT pour pouvoir bénéficier d'un BufferStrategy et avoir une accélération matérielle.

    De plus, j'ai réussit à résoudre mon problème de vitesse avec des images transparentes sous ubuntu!
    J'utilisais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    createCompatibleImage(windth, height);
    puis j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    createCompatibleImage(windth, height, Tranparency.TRANSLUCENT);
    La transparence était bien là mais ça devenait très lent !
    J'ai finalement trouvé mon bonneur avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    createCompatibleImage(windth, height, Tranparency.BITMASK);
    Sauriez vous me dire pourquoi svp? J'aime bien savoir comment fonctionne ce que j'utilise

    Merci d'avance

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    J'avais tester chez moi (Dapper) ta premiere version et je n'ai pas eut de probleme majeur...
    En ce qui concerne Ubuntu, Quintoff a surement raison.
    Deja fait un , et si la reponse est non tu a trouvé ton probleme.

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 37
    Points : 16
    Points
    16
    Par défaut
    A ben oui la réponse est non...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. regex quelle librairie est la plus rapide
    Par ouiouioui dans le forum Débuter
    Réponses: 11
    Dernier message: 28/01/2009, 15h23
  2. affichage rapide d'un tableau
    Par exter666 dans le forum MFC
    Réponses: 16
    Dernier message: 15/04/2005, 03h02
  3. Quelle librairie (portable) utiliser pour le son ?
    Par Nico*3-3 dans le forum Bibliothèques
    Réponses: 20
    Dernier message: 19/03/2005, 00h01
  4. [Acquisition Video]Quelle Librairie ??
    Par Belzano dans le forum Choisir un environnement de développement
    Réponses: 3
    Dernier message: 10/08/2004, 17h27

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