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 :

[XNA] GROS problèmes de performances


Sujet :

XNA/Monogame

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 40
    Points : 50
    Points
    50
    Par défaut [XNA] GROS problèmes de performances
    Bonsoir tout le monde,

    Je vous expose mon problème :

    J'ai creer un loader de map pour mon projet XNA, en gros mon fichier

    mapcontient l'ensemble des coordonées composant chaque faces. J'initialise

    mes vertex à partir de ces données, ensuite je cree les triplets d'indices

    respectifs à chaques faces.
    Dans la methode draw, je redessine à chaques fois la totalité des faces de

    ma map. Le rendu est plutot pas mal, à caméra fixe ...
    En effet lorsque je dois effectuer un mouvement que ça soit une rotation ou

    une translation OMG! Les performances oscillents de 1 à 5 fps max!!!

    Inacceptable .. inexploitable dirais-je plutot surtout de la part de mon

    xboite360 ...

    Donc voila etant novice dans le domaine, j'ai fait des fautes c'est sur.

    Mais savoir lesquelles ça c'est une autre histoire ^^

    C'est donc pour ça que je fais appel à tt personnes qui pourra m'éclaircir

    sur certains points :

    - Comment XNA gère t'il l'affichage des faces?
    - Les redessine t'il meme s'il elle ne sont pas visible à l'écran? Même si

    elle sont "cachées" derrière d'autres faces?
    - Dois je redessiner toutes les faces de ma map à chaque appel de la

    fonction Draw? (je procède comme cela actellement et ça me semble assez

    lourd j'avoue)
    - Si ma technique vous semble incorrecte laquelle me conseillez vous pour

    gagner un maximum de performances ?
    - Quel type de gestion pour mes vecteur de vertex et d'indices ? au niveau

    de l'allocation de la mémoire ?

    Enfin voila je compte sur vous pour m'éclaircir sur ces points

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    - Les redessine t'il meme s'il elle ne sont pas visible à l'écran? Même si

    elle sont "cachées" derrière d'autres faces?
    Oui, ça c'est à toi de gérer (voir FAQ 3D, section culling).

    - Dois je redessiner toutes les faces de ma map à chaque appel de la

    fonction Draw? (je procède comme cela actellement et ça me semble assez

    lourd j'avoue)
    Oui. Enfin celles qui sont visibles, si tu fais du culling.

    - Quel type de gestion pour mes vecteur de vertex et d'indices ? au niveau

    de l'allocation de la mémoire ?
    Ca a peu d'importance, du moment que tu cases bien ça dans un vertex / index buffer en mémoire vidéo.

    A part ça difficile d'en dire plus, il faudrait voir du code, et voir quel genre de géometrie tu affiches (nombre de polygones, nombre de textures, shaders ?, ...).

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 40
    Points : 50
    Points
    50
    Par défaut
    Salut,

    Tout d'abord merci pour ta réponse.

    Je me suis renseigné un peu sur le net c'est jours ci :
    Concernant les données techniques de la xbox360 j'ai pu lire qu'elle peut traiter 500 millions de polygones par seconde, pour un taux de transfert de 16 "gigasamples" par seconde avec un traitement antialiasing 4x, plutot impresionnant
    Mais ce que je ne comprend pas, c'est pourquoi ma petite map de 4433 polygones pose autant de problèmes à la bête ??

    Raisonnement de néophyte surement ... Mais bon je comprend pas

    Deuxiemement, j'ai ete voir la FAQ sur la 3D du site merci. J'ai cherché de la doc à propos du partionnement de l'espace en octree (qui m'a lair d'être l'une des solutions les plus adaptées pour un nioubi )
    Je n'ais pas trouvé grand chose en francais, mais surtout pas mal de docs en anglais. Malheureusement rien de bien concrêt.

    Pour l'octree j'ai bien compris le principe, mais comment l'appliquer à ma map. Je m'explique, on parle de division d'un parent en 8 fils chaque fils contenant une liste d'objets contenus par ce dernier et ainsi de suite jusqu'a un certains niveau max. Avec des objets dans l'absolu je vois comment faire, mais comment diviser lorsqu'il s'agit par exemple d'un mur, d'un arbre, d'une voiture ou d'une maison? Selon quels critères puis-je diviser ? Vertex?, Triangles?, Polygones?, Textures?

    Enfin voilà j'aimerais déjà bien pouvoir réussir ça histoire de pouvoir y appliquer un petit frustum culling par la suite. Mais je reste quand meme sceptique ... ma ptite map non "cullé" ne devrait pas poser autant de problèmes à la base non? sachant que je n'y applique pas de texture et que j'utilise un bête basicEffect ...


    Enfin need help quoi ^^

    Merci bien

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    De telle performances avec 4433 polygones, non ce n'est pas normal. Il y a forcément un truc bête qui traîne dans ton code, essaye de le réduire au strict minimum pour déterminer la source du problème.

    Concernant le stockage dans l'octree : pour du terrain statique par exemple tu peux stocker les triangles, par contre pour les objets "ponctuels" et les objets dynamiques, stocke les objets directement.

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 40
    Points : 50
    Points
    50
    Par défaut
    J'ai peut être une idée ... au niveau de la liaison des indices j'ai fais un truc assez barbare. J'ai entendu parler de triangulation afin de déterminer les triangles de mes polygones. Je vais tjs essayer ça en attendant

    Merci


    EDIT : je viens de compter mes indices j'en ais 8696 pour cette map ça m'a lair d'être dans les normes je ne comprend tjs pas ...

  6. #6
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    tu peux essayer de mesurer le temps que prennent les différentes parties de ton programme, ça te permettrai de trouver une portion de code qui prend anormalement trop de temps
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  7. #7
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Question bête, le mesh n'est pas reconstruit à chaque fois qu'il est dessiné par hasard ?

    (Ok c'est une question bête, mais parfois... la plus simple des explications peut résoudre le plus compliqué des problèmes, ou pas...)

  8. #8
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 40
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par Ti-R
    Question bête, le mesh n'est pas reconstruit à chaque fois qu'il est dessiné par hasard ?

    (Ok c'est une question bête, mais parfois... la plus simple des explication peut résoudre le plus compliqué des problèmes, ou pas...)
    Il n'y a pas de questions bete
    Tu veux dire quoi exactement par reconstuire le mesh à chaque fois?

    merci

  9. #9
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    J'initialise mes vertex à partir de ces données, ensuite je cree les triplets d'indices respectifs à chaques faces.
    A quel moment ? (à vérifier que cela ne c’est pas glissé dans la fonction qui affiche ta scène ou une fonction qui se rafraîchi pendant l’affichage)

    Dans la methode draw, je redessine à chaques fois la totalité des faces de ma map
    Par quelle méthode ? (Tu dessines faces par faces ? ou un tableaux de faces ?)

  10. #10
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 40
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par Ti-R
    A quel moment ? (à vérifier que cela ne c’est pas glissé dans la fonction qui affiche ta scène ou une fonction qui se rafraîchi pendant l’affichage)
    En fait comme tu dis je le fesais à chaque affichage, j'ai modifié cela. Mais bon ça ne change pas grand chose...

    Citation Envoyé par Ti-R
    Par quelle méthode ? (Tu dessines faces par faces ? ou un tableaux de faces ?)
    En fait j'ai un tableau contenant plusieurs instances d'une classe polygone (que j'ai créé) représentant tout les polygones de ma map. Elle contient une fonction "Render()" qui s'occupe de dessiner le polygone à partir de ses vertex et indices (qui sont en variable membre).

    En gros je fais une grosse boucle qui parcours mon tableau de polygones un par un appelant ainsi pour chacuns sa methode "Render()" respective.

    merci

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Il faudrait voir un peu plus de code, notamment la fonction Render de ta classe Polygone.

    Mais bon déjà le fait d'avoir une classe Polygone ça ne suggère pas des perfs optimales, idéalement tu devrais avoir tous les triangles de ton niveau dans un gros vertex buffer statique, que tu affiches en un appel.

  12. #12
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 40
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par Laurent Gomila
    Il faudrait voir un peu plus de code, notamment la fonction Render de ta classe Polygone.

    Mais bon déjà le fait d'avoir une classe Polygone ça ne suggère pas des perfs optimales, idéalement tu devrais avoir tous les triangles de ton niveau dans un gros vertex buffer statique, que tu affiches en un appel.

    Merci pour ta réponse, en gros voici ma classe polygones :

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
     
    public class Polygon
        {
            uint textureId;
            Plane polyPlane;
            uint nbVertices; 
            Vertex [] vertices;
     
            // main device 
            GraphicsDevice device;
     
            VertexBuffer vertexBuffer;
            IndexBuffer indexBuffer;
            int nbIndices;
     
            public Polygon(GraphicsDevice device, uint textureId, Plane polyPlane, uint nbVertices, Vertex [] vertices)
            {
                this.device = device; 
                this.textureId = textureId; 
                this.polyPlane = polyPlane;
                this.nbVertices = nbVertices;
                this.vertices = vertices;
            }
     
            public Polygon(GraphicsDevice device)
            {
                this.device = device;
            }
     
            public void Initialize()
            {
                InitializeVertices();
                InitializeIndices();
            }
     
            private void InitializeVertices()
            {
                VertexPositionNormalTexture[] vertices = new VertexPositionNormalTexture[nbVertices];
     
                for (int i = 0; i < nbVertices; i++)
                {
                    float x = (float)this.Vertices[i].Coord.X;
                    float y = (float)this.Vertices[i].Coord.Y;
                    float z = (float)this.Vertices[i].Coord.Z;
     
                    Vector3 normal = new Vector3((float)this.PolyPlane.Normal.X,
                        (float)this.PolyPlane.Normal.Y,
                        (float)this.PolyPlane.Normal.Z);
     
                    Vector2 texture = new Vector2((float)this.Vertices[i].U,
                        (float)this.Vertices[i].V);
     
                    Vector3 position = new Vector3(x, y, z);
     
                    vertices[i].Normal = normal;
                    vertices[i].Position = position;
                    vertices[i].TextureCoordinate = texture; 
                }
     
                vertexBuffer = new VertexBuffer(device,
                    typeof(VertexPositionNormalTexture),
                    (int)nbVertices,
                    ResourceUsage.WriteOnly,
                    ResourceManagementMode.Automatic);
     
                vertexBuffer.SetData(vertices);
     
            }
     
            private void InitializeIndices()
            {
                nbIndices = ((int)nbVertices - 2) * 3; 
     
                indexBuffer = new IndexBuffer(
                    device,
                    typeof(short),
                    nbIndices,
                    ResourceUsage.WriteOnly,
                    ResourceManagementMode.Automatic);
     
                short[] indices = new short[nbIndices];
     
     
                for (short i=0, j=0; i < nbIndices; i += 3, j++)
                {
                    indices[i] = 0;
                    indices[i + 1] = j; indices[i + 1]++;
                    indices[i + 2] = indices[i + 1]; indices[i + 2]++;
                }
     
                indexBuffer.SetData(indices);
     
            }
     
            public void Render()
            {
                int nbPrimitives = nbIndices / 3;
     
                device.Vertices[0].SetSource(vertexBuffer, 0, VertexPositionNormalTexture.SizeInBytes);
                device.Indices = indexBuffer;
                device.VertexDeclaration = new VertexDeclaration(this.device, VertexPositionNormalTexture.VertexElements);
                device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, (int)nbVertices, 0, nbPrimitives);
            }
     
     public uint TextureId
            {
                get { return textureId; }
                set { textureId = value; }
            }
     
            public Plane PolyPlane
            {
                get { return polyPlane; }
                set { polyPlane = value; }
            }
     
            public uint NbVertices
            {
                get { return nbVertices; }
                set { nbVertices = value; }
            }
     
            public Vertex[] Vertices
            {
                get { return vertices; }
                set { vertices = value; }
            }
    }
    Voilà la gueule de ma classe, en fait les 4 premiers champs ( textureId, polyPlane, nbVertices,vertices) sont initialisés par mon loader. J'appele avant tout la methode Initialize() pour chaque polygones histoire d'itinialiser son vertexbuffer ainsi que les indices.
    (D'ailleurs je me demande si je procède correment pour calculer les indices mais je ne pense pas que le probleme soit là vu que tt se dessine correctement ... )
    Puis vient la fameuse fonction render ...

    Enfait comme tu dis j'ai pensé à faire un gros buffer de vertex contenant tout les points, mais ce qui me turlupine c'est comment vais je faire pour les indices alors ? etant donné qu'ils sont relatifs à un seul polygone ... j'ai du louper un chapitre ^^

    merci

  13. #13
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 40
    Points : 50
    Points
    50
    Par défaut
    Merci à tous j'ai reglé mon problème.
    Comme proposé j'ai utilisé un meme buffer pour les vertices ainsi que pour les indices, pour ces derniers j'ai juste ajouté +nombre de vertices du polygones précédent pour avoir le bon rapport

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

Discussions similaires

  1. Gros problème de performance
    Par Patersson dans le forum Windows Presentation Foundation
    Réponses: 15
    Dernier message: 07/10/2010, 15h46
  2. Gros problème de performance
    Par Syl_20 dans le forum OpenGL
    Réponses: 15
    Dernier message: 16/12/2007, 18h19
  3. GROS problèmes de performances
    Par fda dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 02/08/2007, 14h02
  4. [Tomcat] Gros problèmes de performance
    Par Tourix dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 04/06/2007, 15h58
  5. Gros problème de performance
    Par steelidol dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 23/11/2006, 08h37

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