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

DirectX Discussion :

Problème de performance lors d'affichage de texte (malgré une class BitmapFont Perso)


Sujet :

DirectX

  1. #1
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut Problème de performance lors d'affichage de texte (malgré une class BitmapFont Perso)
    Salut à tous

    J'ai un soucis avec DirectX, c'est que sur une scène ou je tourne à environ 600 FPS, si j'ai le malheur d'afficher 4 pauvres lignes de texte, les FPS chutent à 80 !
    Si j'en affiche plus je tombe à 20 et c'est ingérable.

    J'ai pourtant créé une classe BitmapFont perso, justement pour éviter d'utiliser GDI avec la classe D3D.Font par défaut de DirectX...

    J'ai essayé de tout désactiver (Recherches informations Char, arreter la modification du VertexBuffer, Shader simplifié au maximum... Bref au final apres avoir tout désactiver au lieu d'afficher un texte j'avais une série de carré noir superposés.), rien à faire, au mieux je passe de 80 a 95 FPS...

    J'en déduis donc que la chute de FPS vient du fait que ma fonction DrawString appelle une boucle de fonction DrawChar, et que ca lui plait pas...

    Voici le code du DrawString:
    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
     
    public Point DrawString(string Text, int x, int y, Color color, int StartX)
    {
        Point carret = new Point(x, y);
     
        for (int i = 0; i < Text.Length; i++)
        {
            if (Text[i] != '\n')
            {
                //Char Info
                FontChar fcChar = _chars[Text[i]];
                //DrawChar
                DrawChar(Text[i], fcChar.XOffset + carret.X, fcChar.YOffset + carret.Y, color);
                carret.X += fcChar.Advance;
             }
        }
        return carret;
    }
    et du DrawChar
    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
     
    public void DrawChar(char c, float x, float y, Color color)
    {
        FontChar fcChar = _chars[c];
        float u, v;
     
        //Update Quad
        u = (float)fcChar.TX / (float)_textureWidth;
        v = (float)fcChar.TY / (float)_textureHeight;
        Quad[0] = new CustomVertex.TransformedTextured(x, y, 0f, 1f, u, v);
     
        u = (float)(fcChar.TX + fcChar.TWitdh) / (float)_textureWidth;
        v = (float)fcChar.TY / (float)_textureHeight;
        Quad[1] = new CustomVertex.TransformedTextured(x + fcChar.TWitdh, y, 0f, 1f, u, v);
     
        u = (float)fcChar.TX / (float)_textureWidth;
        v = (float)(fcChar.TY + fcChar.THeight) / (float)_textureHeight;
        Quad[2] = new CustomVertex.TransformedTextured(x, y + fcChar.THeight, 0f, 1f, u, v);
     
        u = (float)(fcChar.TX + fcChar.TWitdh) / (float)_textureWidth;
        v = (float)(fcChar.TY + fcChar.THeight) / (float)_textureHeight;
        Quad[3] = new CustomVertex.TransformedTextured(x + fcChar.TWitdh, y + fcChar.THeight, 0f, 1f, u, v);
     
        //Update VB
        vb.SetData(Quad, 0, LockFlags.None);
     
        //Dessin
        //
        effect.SetValue("objectDiffuse", _texture);
        effect.SetValue("color", new Vector4((float)color.R / 255f, (float)color.G / 255f, (float)color.B / 255f, 0));
        int numPasses = effect.Begin(0);
        for (int a = 0; a < numPasses; a++)
        {
            effect.BeginPass(a);
     
            _device.SetStreamSource(0, vb, 0);
            _device.VertexFormat = CustomVertex.TransformedTextured.Format;
            _device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);
     
            effect.EndPass();
        }
        effect.End();
    }
    Une idée ?
    Merci d'avance !

    PS: QUand je dis 4 pauvres lignes, c'est vraiment ça:
    "Entrer dans le jeu
    Configuration
    Infos
    Quitter"
    Et ca me fait perdre 520 FPS !

  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 : 40
    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
    Ce qui tue tes performances, c'est que tu dessines chaque caractère un à un. Les appels aux effets, à SetStreamSource, et DrawPrimitive sont très coûteux, si tu le fais 200 fois pour afficher 200 caractères ton CPU sera complétement saturé pendant que ton GPU se tournera les pouces.

    Il faut que DrawChar ne fasse qu'ajouter un quad à ton vertex buffer dynamique, puis à la fin de DrawString seulement tu peux rendre tout ton vertex buffer (et donc tous tes caractères) d'un coup d'un seul.

    Pour ce qui est de la couleur, met cette info dans ta structure de vertex plutôt que de la passer à l'effet.

  3. #3
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut
    Oki je vais essayer !

    Merci beaucoup
    (Des années que tu es présent sur ce forum et toujours aussi efficace )

    Edit:
    Effectivement déjà en mettant le

    //Prepare Shader
    effect.SetValue("objectDiffuse", _texture);
    effect.SetValue("color", new Vector4((float)color.R / 255f, (float)color.G / 255f, (float)color.B / 255f, 0));
    effect.Begin(0);
    effect.BeginPass(0);

    Avant le FOR (char), je remonte de 80 FPS a 270
    Je vais faire ce que tu m'as dis pour le vertexbuffer alors maintenant !
    Encore merci

  4. #4
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut
    C'est nickel, je remonte de 80 FPS à environ 470
    Un (3ème :p) grand merci à toi

    Pour ceux que ca intéresse voilà le code:

    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
     
    public void DrawChar(FontChar fcChar, float x, float y, Color color)
    {
        float u, v;
     
        //Add Quad
        u = (float)fcChar.TX / (float)_textureWidth;
        v = (float)fcChar.TY / (float)_textureHeight;
        Quad[BufferIndex] = new CustomVertex.TransformedColoredTextured(x, y, 0f, 1f, color.ToArgb(), u, v);
     
        u = (float)(fcChar.TX + fcChar.TWitdh) / (float)_textureWidth;
        v = (float)fcChar.TY / (float)_textureHeight;
        Quad[BufferIndex + 1] = new CustomVertex.TransformedColoredTextured(x + fcChar.TWitdh, y, 0f, 1f, color.ToArgb(), u, v);
     
        u = (float)fcChar.TX / (float)_textureWidth;
        v = (float)(fcChar.TY + fcChar.THeight) / (float)_textureHeight;
        Quad[BufferIndex + 2] = new CustomVertex.TransformedColoredTextured(x, y + fcChar.THeight, 0f, 1f, color.ToArgb(), u, v);
     
        Quad[BufferIndex + 3] = Quad[BufferIndex + 1];
     
        u = (float)(fcChar.TX + fcChar.TWitdh) / (float)_textureWidth;
        v = (float)(fcChar.TY + fcChar.THeight) / (float)_textureHeight;
        Quad[BufferIndex + 4] = new CustomVertex.TransformedColoredTextured(x + fcChar.TWitdh, y + fcChar.THeight, 0f, 1f, color.ToArgb(), u, v);
     
        Quad[BufferIndex + 5] = Quad[BufferIndex + 2];
     
        BufferIndex += 6;
    }
    public Point DrawString(string Text, int x, int y, Color color, int StartX)
    {
        Point carret = new Point(x, y);
     
        //Prepare Shader
        effect.SetValue("objectDiffuse", _texture);
        effect.Begin(0);
        effect.BeginPass(0);
        //Pour chaque Char
        for (int i = 0; i < Text.Length; i++)
        {
            if (Text[i] != '\n')
            {
                //Char Info
                FontChar fcChar = _chars[Text[i]];
                //DrawChar
                DrawChar(fcChar, fcChar.XOffset + carret.X, fcChar.YOffset + carret.Y, color);
                carret.X += fcChar.Advance;
            }
        }
        //Update VB
        vb.SetData(Quad, 0, LockFlags.None);
     
        //Dessin
        _device.SetStreamSource(0, vb, 0);
        _device.VertexFormat = CustomVertex.TransformedColoredTextured.Format;
        _device.DrawPrimitives(PrimitiveType.TriangleList, 0, Text.Length*2);
     
        //End
        effect.EndPass();
        effect.End();
        BufferIndex = 0;
        return carret;
    }

  5. #5
    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 : 40
    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
    Content de t'avoir aidé à retrouver des perfs dignes de ce nom

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

Discussions similaires

  1. Problèmes de performances lors des écritures
    Par bambino3996 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 22/09/2011, 14h25
  2. Problème de performance lors de suppression/insertion
    Par cedrich dans le forum Administration
    Réponses: 8
    Dernier message: 30/03/2011, 09h51
  3. Réponses: 1
    Dernier message: 04/01/2010, 11h32
  4. Problème d'affichage de texte avec une carte cliquable
    Par Tussilage dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 03/03/2009, 20h59
  5. [VB.Net] Problème d'affichage de text dans une MessageBox
    Par eultartuffe dans le forum Windows Forms
    Réponses: 6
    Dernier message: 03/04/2006, 20h56

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