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 :

Lenteurs moteur graphique


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 311
    Par défaut Lenteurs moteur graphique
    Bien le bonjour à tous.

    J'ai commencer à faire un petit moteur graphique pour gérer la lumière dans un jeu 2D.
    Ce petit bout de code marche bien mais trop lentement.
    Surement que ma façon de le concevoir n'est pas la bonne.
    Voila comment il est fait:

    1- Je créé un objet World qui contient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    protected static Graphics2D calqueLum;
    protected static BufferedImage bufferedCalqueLum;
    Puis je le lance avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void Start(){
    bufferedCalqueLum = new BufferedImage(Frame.frameWidth, Frame.frameHeight, BufferedImage.TYPE_INT_ARGB );
    calqueLum = bufferedCalqueLum.createGraphics();
    }
    2- Je créé un objet Light qui hérite de World.
    Avec sa méthode AddLight je dessine dans "calqueLum" un cercle avec des triangles dont la couleur opaque au centre devient translucide en s'évasant.

    3- Et pour finir, dans World.DisplayLight() j'inverse l'alpha de tout les pixels avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public void DisplayLight(){
    	for(int x = 0, y = 0; x < bufferedCalqueLum.getWidth(); x++){ for(; y < bufferedCalqueLum.getHeight(); y++){
    			Color nuitColor = new Color(bufferedCalqueLum.getRGB(x, y), true);
    			Color rgba = new Color(nuitColor.getRed(), nuitColor.getGreen(), nuitColor.getBlue(), (255 - nuitColor.getAlpha()));
    	        	bufferedCalqueLum.setRGB(x, y, rgba.getRGB());
            } y = 0; }
     
    	Image imagecalqueLum = Toolkit.getDefaultToolkit().createImage(bufferedCalqueLum.getSource());
    	Panel.feuille.drawImage(imagecalqueLum, 0, 0, null);
     
    	calqueLum.dispose();
    }
    Sachant que bufferedCalqueLum.getHeight() vaut 1080 et que bufferedCalqueLum.getWidth() vaut 1920 sa fait beaucoup de pixels.
    Du coup il me faudrait surement une autre idée.

    Merci de votre aide.

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    bon, déjà getPixel / setPixel ce n'est pas le plus performant pour modifier le contenu d'une image. Il vaut mieux accéder directement au tableau de int via les Raster, et ca nécessite que tu te perde un peu dans la javadoc

    ensuite, pourquoi tu t'emmerde à aller inverser la valeur de alpha? Pourquoi ne pas simplement changer ta formule de composition quand tu utilisera cette image? C'est bien plus performant de dire au composite de faire
    (srccolor * dstalpha) + (dstcolor * (1-dstalpha))
    plutôt que de lui dire de faire
    (srccolor * (1-dstalpha)) + (dstcolor * dstalpha) et en plus d'inverser manuellement l'alpha sur l'image dst.


    Selon moi donc, ton problème de base est que tu simplifie trop ton système (préparer tes données sources en les modifiant régulièrement) plutôt que de faire te reposer sur ce qui existe (formule de compositing) qui à complexifier tes données (ajout d'un flag pour savoir si oui ou non le alpha est inversé)

  3. #3
    Membre éclairé Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 311
    Par défaut
    Pour l'histoire de l'alpha, (si c'est bien ca que tu veux dire) je ne peut pas coller mon cercle sur un fond noir parce que je veux rendre le fond en question transparent, donc ca ne peut pas marcher a moins de créé une autre BufferedImage qui contient le ou les cercles et de comparer les pixels de chaque BufferedImage, ce qui prend encore plus de resources (A moins que tu ai une autre idée).

    Ensuite pour l'utilisation du Raster si tu peut m'aiguiller stp, parce que j'ai mis trois semaines a comprendre comment fonctionnes les BufferedImage...
    J'ai trouver ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BufferedImage image = myImage;//or whatever
    Raster ras=image.getData();
    DataBuffer data=ras.getDataBuffer();
    Et maintenant j'en fait quoi?

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Pecose Voir le message
    Pour l'histoire de l'alpha, (si c'est bien ca que tu veux dire) je ne peut pas coller mon cercle sur un fond noir parce que je veux rendre le fond en question transparent, donc ca ne peut pas marcher a moins de créé une autre BufferedImage qui contient le ou les cercles et de comparer les pixels de chaque BufferedImage, ce qui prend encore plus de resources (A moins que tu ai une autre idée).
    Vu que je ne comprends pas ce que tu fais, je peux pas t'aider. Ma remarque était juste que, inverser l'alpha dans une image (ce que tu fais) et souvent inutile car il suffit d'inverser l'algo utilisant, plus tard, cet alpha.

    Citation Envoyé par Pecose Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BufferedImage image = myImage;//or whatever
    Raster ras=image.getData();
    DataBuffer data=ras.getDataBuffer();
    Et maintenant j'en fait quoi?
    Tu typecast en ByteDataBuffer/IntegerDataBuffer/ autre suivant ce que t'as retourné le BufferedImage, mais vu que t'es parti sur un INT_ARGB, il y a des chances que ce soit du integer. Enfin, il y a des méthodes sur ces sous classes pour accéder au tableau de int formant l'image, qu'il suffit de modifier directement, si je ne dis pas de bêtise.

    Tu peux aussi utiliser getSamples / setSamples sur WritableRaster, mais je ne sais pas laquelle des deux méthodes est la plus rapide.

  5. #5
    Membre éclairé Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 311
    Par défaut
    Ca s'appelle DataBufferInt / DataBufferByte au cas ou tu cherche.
    Par contre j'ai rien trouver d'utile, mais si tu as un moyen moins lourd que le mien d'inverser l'alpha de mon image je suis preneur.
    Parce que j'ai strictement rien trouver sur l'algo d'on tu parle.

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ben c'est ton algo que j'aimerais voir. Là tu inverse le alpha sur une image, mais je suppose que tu fais quelque chose de cette image, à la fin

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

Discussions similaires

  1. definition d'un moteur graphique
    Par elekis dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 13/11/2012, 15h36
  2. [Singleton] Moteur graphique : Singleton est-il un bon pattern ?
    Par Takusen dans le forum Design Patterns
    Réponses: 3
    Dernier message: 16/09/2008, 10h40
  3. Important: Conception d'un moteur graphique
    Par LightniN dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 18/11/2007, 13h26
  4. Créer un moteur graphique commercial
    Par taftouf dans le forum Moteurs 3D
    Réponses: 11
    Dernier message: 26/02/2007, 09h17
  5. entiers ou réels pour un moteur graphique?
    Par f56bre dans le forum Moteurs 3D
    Réponses: 2
    Dernier message: 22/10/2006, 17h25

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