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 :

Problème de rapidité


Sujet :

2D Java

  1. #1
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut Problème de rapidité
    Bonjour

    Voilà je suis en train de développer un jeu et j'ai des soucis de temps de réponse d'affichage. J'affiche sur un JPanel une image avec une mise à l'échelle et un positionnement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    AffineTransform at = AffineTransform.getTranslateInstance(xe, ye);
    at.concatenate(AffineTransform.getScaleInstance(1.0 / zoom[izoom], 1.0 / zoom[izoom]));
    g2.drawRenderedImage(laCarte.getVueCarte(), at);
    Ensuite j'affiche les pions de manière similaire

    Y a t'il moyen d’accélérer l'affichage car c'est parfois assez lent
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il faudrait avoir un peu plus de code...


    Est-ce que le niveau de zoom change souvent ?
    Si la réponse est non il serait préférable de créer une image à la bonne taille une seule fois, puis de la dessiner directement.


    De même, il est préférable d'utiliser des "Compatible Image", c'est à dire des images au format natif utilisé par la configuration matérielle.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        public static BufferedImage toCompatibleImage(BufferedImage image) {
            BufferedImage compatibleImage = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration()
            		.createCompatibleImage(image.getWidth(), image.getHeight(), image.getTransparency());
            Graphics g = compatibleImage.getGraphics();
            g.drawImage(image, 0, 0, null);
            g.dispose();
            return compatibleImage;
        }

    a++

  3. #3
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Déjà je vais tester les "Compatible Image"
    Pour ce qui est du zoom j'ai effectivement quelques niveaux mais comme les images sont grandes (2048x2048 pixels) j'ai un peu peur d'utiliser trop de mémoire. J'avais testé cette solution à une époque et j'avais eu des soucis.
    Là ou je perd du temps aussi c'est que je dois grisé certains endroits de mon images. Les zones à griser sont des polygones voilà ce que j'ai fait
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    private void griseFond(BufferedImage fond) {
    		Graphics g= fond.getGraphics();
    		for (Polygone zone : lesZones) {
    			int x0 = (int) zone.getxMin();
    			int y0 = (int) zone.getyMin();
    			int LL = (int) zone.getLargeur();
    			int HH = (int) zone.getHauteur();
    			BufferedImage imgRendu = new BufferedImage(LL, HH, BufferedImage.TYPE_INT_ARGB);
    			Graphics2D g2r = (Graphics2D) imgRendu.getGraphics();
    			g2r.drawImage(fond, 0, 0, LL, HH, x0, y0, x0 + LL - 1, y0 + HH - 1, null);
     
    			BufferedImage imgMasq = new BufferedImage(LL, HH, BufferedImage.TYPE_INT_ARGB);
    			Graphics2D g2m = (Graphics2D) imgMasq.getGraphics();
    			g2m.setColor(Color.WHITE);
    			g2m.fillRect(0, 0, LL, HH);
    			g2m.setColor(Color.BLACK);
    			int lesX[] = getLesX(zone, 1, x0);
    			int lesY[] = getLesY(zone, 1, y0);
    			g2m.fillPolygon(lesX, lesY, lesX.length);
    			int noir = Color.BLACK.getRGB();
    			int blanc = Color.WHITE.getRGB();
    			for (int x = 0; x < LL; x++) {
    				for (int y = 0; y < HH; y++) {
    					int col = imgRendu.getRGB(x, y);
    					int msk = imgMasq.getRGB(x, y);
    					if (msk == noir) {
    						Color gris = new Color(col);
    						int val = (gris.getRed() + gris.getGreen() + gris.getBlue()) / 3;
    						gris = new Color(val, val, val);
    						imgRendu.setRGB(x, y, gris.getRGB());
    					}
    					if (msk == blanc) {
    						imgRendu.setRGB(x, y, 0x00FFFFFF);
    					}
    				}
    			}
    			g.drawImage(imgRendu,  x0, y0, x0 + LL - 1, y0 + HH - 1,0, 0, LL, HH, null);
    		}
    		g.dispose();
    	}
    Comme cette opération est longue je me suis dit que je pourrais créer au départ une image grisée de mon image de fond et puis combiner
    L'idée est de créer un masque un masque en noir et blanc avec mon polygone
    l'appliquer à l'image grisée pour récupérer la partie grise
    puis l'afficher dans l'image de fond

    On peut résumer ça à résultat final = (masque ou gris) et (masque et fond)

    je n'ai pas trouvé comment faire cette opération rapidement

    masque Nom : masque.png
Affichages : 64
Taille : 1,7 Ko
    gris Nom : grise.png
Affichages : 64
Taille : 3,0 Ko
    fond Nom : fond.png
Affichages : 69
Taille : 3,0 Ko
    résultat final Nom : resultat.png
Affichages : 75
Taille : 3,4 Ko
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

Discussions similaires

  1. [Hibernate][Oracle] Problème de rapidité
    Par Saloucious dans le forum Hibernate
    Réponses: 7
    Dernier message: 27/11/2008, 11h00
  2. Problème de rapidité d'exécution ou compilation
    Par HASSIOMAR dans le forum Langage
    Réponses: 2
    Dernier message: 17/07/2008, 13h13
  3. [OpenGL] Problème de rapidité
    Par mplant dans le forum Développement 2D, 3D et Jeux
    Réponses: 23
    Dernier message: 09/01/2007, 17h04
  4. Problème de rapidité avec mon pc
    Par Ganak dans le forum Windows XP
    Réponses: 8
    Dernier message: 05/12/2006, 14h11
  5. Réponses: 4
    Dernier message: 13/04/2006, 08h57

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