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

XNA/Monogame Discussion :

Question sur le Draw


Sujet :

XNA/Monogame

  1. #1
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 83
    Points : 76
    Points
    76
    Par défaut Question sur le Draw
    Bonjour,

    J'ai une question concernant la méthode SpriteBatch.Draw. Admettons mon code qui suit :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    /// <summary>
            /// Update le layer
            /// </summary>
            /// <param name="gameTime"></param>
            public void Update(Vector2 currentOriginPos)
            {
                this.sDisplayToDisplay.Clear();
     
                float posXMin = 0;
                float posXMax = 0;
                float posYMin = 0;
                float posYMax = 0;
     
                // On calcul les positions d'origine relative
                float relativeOriginPosXMin = currentOriginPos.X;
                float relativeOriginPosXMax = (currentOriginPos.X + Config.ScreenWidth);
                float relativeOriginPosYMin = currentOriginPos.Y;
                float relativeOriginPosYMax = currentOriginPos.Y + Config.ScreenHeight;
     
                foreach (SpriteDisplay sDisplay in this.sDisplayList)
                {
                    posXMin = sDisplay.scaledPosX;
                    posXMax = (short)(sDisplay.scaledPosX + (short)(sDisplay.scaledWidth * Config.DisplayCoeff));
     
                    if (((posXMin >= relativeOriginPosXMin) && (posXMin <= relativeOriginPosXMax))
                        || ((posXMax >= relativeOriginPosXMin) && (posXMax <= relativeOriginPosXMax))
                        || ((posXMin <= relativeOriginPosXMin) && (posXMax >= relativeOriginPosXMax)))
                    {
                        posYMin = sDisplay.scaledPosY;
                        posYMax = (short)(sDisplay.scaledPosY +(short)(sDisplay.scaledHeight * Config.DisplayCoeff));
     
                        if (((posYMin >= relativeOriginPosYMin) && (posYMin <= relativeOriginPosYMax))
                        || ((posYMax >= relativeOriginPosYMin) && (posYMax <= relativeOriginPosYMax))
                        || ((posYMin <= relativeOriginPosYMin) && (posYMax >= relativeOriginPosYMax)))
                        {
                            this.sDisplayToDisplay.Add(sDisplay);
                        }
                    }
                }
            }
     
            /// <summary>
            /// Dessine le layer
            /// </summary>
            /// <param name="gameTime"></param>
            public void Draw(SpriteBatch batch, Vector2 currentOriginPos)
            {
                float relativePosX = 0;
                float relativePosY = 0;
     
                foreach (SpriteDisplay sDisplay in this.sDisplayToDisplay)
                {
                    relativePosX = sDisplay.scaledPosX - (currentOriginPos.X * this.layerRef.speed);
                    relativePosY = sDisplay.scaledPosY + currentOriginPos.Y;
     
                    batch.Draw(sDisplay.sTexture, new Rectangle((int)relativePosX, (int)relativePosY, (int)sDisplay.scaledWidth, (int)sDisplay.scaledHeight), Color.White);
                }
            }
    La boucle Update permet de remplir un tableau de sDisplay (c'est des sprites) en calculant leur position d'affichage par rapport à l'origine en cours. Cela me permet de ne Draw que ceux qui apparaissent à l'écran dans la boucle Draw.

    La question est : Est-ce que ce que je fais dans la boucle Update est utile, ou alors le SpriteBatch s'occupé déjà (en interne) de ne pas afficher ce qui n'apparait pas à l'écran ?

    C'est pas très clair alors si vous voulez plus de précision hésitez pas =)

    Merci !

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 897
    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 897
    Points : 219 633
    Points
    219 633
    Billets dans le blog
    125
    Par défaut
    Bonjour,

    Je pense que en interne les tests pour savoir si c'est hors écran ou pas, sont déjà fait. Et ce parce qu'au sinon ça crasherai .

    Mais dans un monde 3D, ce n'est pas toujours fait, et ça coute cher ( pas en crash mais en performance ).

    Donc comme vous êtes en 2D, vous pouvez laisser tout vos sprites, je pense.

  3. #3
    Membre averti Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Points : 340
    Points
    340
    Par défaut
    C'est juste une idée mais si tu fais avec et sans ta méthode et que tu compare le nombre de Mo en mémoire pris par ton prog tu verras si c'est efficace ( essaye sur un grand nombre de sprite ).

    C'est juste une idée, pas sur qu'elle marche.

  4. #4
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 83
    Points : 76
    Points
    76
    Par défaut
    Ok je vais faire ça puis je vous dirai =) Merci !

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 897
    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 897
    Points : 219 633
    Points
    219 633
    Billets dans le blog
    125
    Par défaut
    Citation Envoyé par yodaime Voir le message
    C'est juste une idée mais si tu fais avec et sans ta méthode et que tu compare le nombre de Mo en mémoire pris par ton prog tu verras si c'est efficace ( essaye sur un grand nombre de sprite ).

    C'est juste une idée, pas sur qu'elle marche.
    Je ne comprends pas ... vous semblez vouloir chercher une fuite de mémoire ...

  6. #6
    Nouveau membre du Club Avatar de Léonard Labat
    Homme Profil pro
    Consultant .NET
    Inscrit en
    Juillet 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2010
    Messages : 17
    Points : 33
    Points
    33
    Par défaut
    Effectivement, les pixels hors écran ne sont pas passés au pixel shader et ne sont donc pas dessinés. Il n'y a donc pas besoin de le gérer nous même

    C'est juste une idée mais si tu fais avec et sans ta méthode et que tu compare le nombre de Mo en mémoire pris par ton prog tu verras si c'est efficace ( essaye sur un grand nombre de sprite ).

    C'est juste une idée, pas sur qu'elle marche.
    En fait, pour étudier ce comportement, il aurait plutôt fallu analyser les temps de traitement

Discussions similaires

  1. 2 Questions sur le System.Drawing
    Par MaelstroeM dans le forum VB.NET
    Réponses: 3
    Dernier message: 17/09/2007, 12h49
  2. Quelques questions sur le TWebBrowser...
    Par CorO dans le forum Web & réseau
    Réponses: 3
    Dernier message: 17/01/2003, 21h23
  3. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  4. Réponses: 2
    Dernier message: 11/08/2002, 21h27
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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