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

OpenGL Discussion :

[C++] Problèmes de performances en affichant des cubes [OpenGL 3.x]


Sujet :

OpenGL

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Points : 65
    Points
    65
    Par défaut [C++] Problèmes de performances en affichant des cubes
    Bonjour,

    Je viens vous voir car j'ai quelques soucis de performances pour l'affichage de mes objets 3D.
    Pour simplifier un peu la création d'un objet, j'ai décidé de créer une classe permettant de gérer tout ça pour moi. Sauf que je remarque que quand j'utilise cette classe pour afficher un certain nombre de cubes, le PC commence à saturer un peu (j'ai affiché 500 cubes pour mes tests, autrement dit pas grand chose).

    Voici ma fameuse classe :
    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
    #ifndef _OBJET3D
    #define _OBJET3D
     
    #include "Texture.hpp"
    #include "SHader.hpp"
     
    #include <vector>
    #include <glm/glm.hpp>
    #include <glm/gtx/transform.hpp>
    #include <glm/gtc/type_ptr.hpp>
     
    class Objet3D
    {
    	public :
    		Objet3D(int nombreTriangles);
    		bool modifierStructure(const std::vector<float>& coordonneesSommets, const std::vector<float>& coordonneesTexture, const std::vector<int>& identifiantsTextures);
    		void afficher(const Shader& shader, const glm::mat4& matriceProjection, const glm::mat4& matriceVue);
    		void tourner(float angle, glm::vec3 axes);
    		void translater(glm::vec3 translation);
    		void echelonner(glm::vec3 echelle);
    		void reinitialiserTransformations();
    		int ajouterTexture(std::string fichierTexture);
    		void supprimerTexture(int identifiantTexture);
     
    	private :
    		std::vector<Texture> m_textures;
    		std::vector<int> m_identifiantsTextures;
    		GLuint m_identifiantVBO;
    		GLuint m_identifiantVAO;
    		int m_nombreTriangles;
    		glm::mat4 m_matriceTransformations;
    };
     
    #endif
    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
    #include "Objet3D.hpp"
     
    Objet3D::Objet3D(int nombreTriangles) :
    m_nombreTriangles(nombreTriangles),
    m_matriceTransformations(glm::mat4(1))
    {
    	glGenBuffers(1, &m_identifiantVBO);
    	glBindBuffer(GL_ARRAY_BUFFER, m_identifiantVBO);
    	glBufferData(GL_ARRAY_BUFFER, (m_nombreTriangles * 15)* sizeof(float), 0, GL_STATIC_DRAW);
    	glBindBuffer(GL_ARRAY_BUFFER, 0);
     
     
    	glGenVertexArrays(1, &m_identifiantVAO);
    	glBindVertexArray(m_identifiantVAO);
     
    	glBindBuffer(GL_ARRAY_BUFFER, m_identifiantVBO);
    	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    	glEnableVertexAttribArray(0);
    	glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (void*)(m_nombreTriangles * 9 * sizeof(float)));
    	glEnableVertexAttribArray(2);
    	glBindBuffer(GL_ARRAY_BUFFER, 0);
     
    	glBindVertexArray(0);
     
    	m_matriceTransformations = glm::rotate(m_matriceTransformations, 20.0f, glm::vec3(0, 1, 0));
    }
     
    bool Objet3D::modifierStructure(const std::vector<float>& coordonneesSommets, const std::vector<float>& coordonneesTexture, const std::vector<int>& identifiantsTextures)
    {
    	m_identifiantsTextures = identifiantsTextures;
     
    	glBindBuffer(GL_ARRAY_BUFFER, m_identifiantVBO);
     
    	void *adresseVBO = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
    	if (adresseVBO == NULL)
    	{
    		std::cout << "[ERREUR] Récuperation du VBO" << std::endl;
    		glBindBuffer(GL_ARRAY_BUFFER, 0);
    		return false;
    	}
     
    	memcpy((char*)adresseVBO, coordonneesSommets.data(), (m_nombreTriangles * 9)* sizeof(float));
    	memcpy((char*)adresseVBO + m_nombreTriangles * 9 * sizeof(float), coordonneesTexture.data(), m_nombreTriangles * 6 * sizeof(float));
     
    	glUnmapBuffer(GL_ARRAY_BUFFER);
    	adresseVBO = 0;
     
    	glBindBuffer(GL_ARRAY_BUFFER, 0);
    }
     
    void Objet3D::afficher(const Shader& shader, const glm::mat4& matriceProjection, const glm::mat4& matriceVue)
    {
    	glUseProgram(shader.identifiant());
    	glBindVertexArray(m_identifiantVAO);
     
    	glUniformMatrix4fv(glGetUniformLocation(shader.identifiant(), "matriceAffichage"), 1, GL_FALSE, glm::value_ptr(matriceProjection * matriceVue * m_matriceTransformations));
     
    	glBindTexture(GL_TEXTURE_2D, m_textures[0].identifiant());
    	glDrawArrays(GL_TRIANGLES, 0, m_nombreTriangles * 3);
     
    	glBindTexture(GL_TEXTURE_2D, 0);
    	glBindVertexArray(0);
    	glUseProgram(0);
    }
     
    void Objet3D::tourner(float angle, glm::vec3 axes)
    {
    	m_matriceTransformations = glm::rotate(m_matriceTransformations, angle, axes);
    }
     
    void Objet3D::translater(glm::vec3 translation)
    {
    	m_matriceTransformations = glm::translate(m_matriceTransformations, translation);
    }
     
    void Objet3D::echelonner(glm::vec3 echelle)
    {
    	m_matriceTransformations = glm::scale(m_matriceTransformations, echelle);
    }
     
    void Objet3D::reinitialiserTransformations()
    {
    	m_matriceTransformations = glm::mat4(1);
    }
     
    int Objet3D::ajouterTexture(std::string fichierTexture)
    {
    	m_textures.push_back(Texture());
    	m_textures[m_textures.size() - 1].charger(fichierTexture);
     
    	return m_textures.size() - 1;
    }
     
    void Objet3D::supprimerTexture(int identifiantTexture)
    {
    	m_textures.erase(m_textures.begin() + identifiantTexture);
    }
    Mes 500 cubes, je les ai affiché de 2 façons : j'ai dans un premier temps créé 500 objets de type Objet3D, et je les ai affiché, et ensuite j'ai essayé avec une seul objet de type Objet3D, mais avec un nombre suffisant de vertex pour avoir 500 cubes (comme ça je ne fais qu'un appel à glDrawArrays). Mais dans les deux cas le PC supporte mal.

    Pourtant je pense que 500 cubes c'est pas grand chose, donc j'aimerais savoir ce qui cloche dans mon code (car j'imagine que le problème vient de cette classe).
    Merci d'avance

  2. #2
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Points : 293
    Points
    293
    Par défaut
    Votre code est correct , c'est le genre de code que j'utilise pour afficher des modèles de type md2 (pour l'instant). A noter cependant que l'on pourrait optimiser les appels à glUseProgram() , en effet si vous afficher 500 cube de type Objet3D ça vous ferat quand même 500 appel à glUseProgram() , de même pour les glGetUniformLocation(). Dans le cas où c'est un seul Objet3D , mon argument n'est plus suffisant . Bon après moi je préfère utiliser plusieurs vbo pour les différents attributs de sommets ( mais bon ce n'est qu'un avis personnel ). Quelle est votre configuration graphique ? Pensez à utiliser un debuggeur opengl (pour analyser les goulots d'étranglement).
    Mes premiers conseils seraient de regrouper les affichages selon le shader utilisé ( pour n'avoir qu'un seul appel à glUseProgram() pour un shader donné) , à part si vraiment celà pose un problème pour l'ordre d'affichage. Si vous utilisez un portable ayant la technologie optimus (chez nvidia) ou powerXpress (chez amd) vérifiez bien que votre programme ce lance sur le processeur graphique (nvidia ou amd) et pas sur le chipset intégré. Une dernnière chose : instancier 500 Objet3D n'est pas une très bonne idée , c'est le même principe que pour un modèle 3D , tu le charges une fois et tu fais des entitées qui vont contenir les informations : position , rotation , échelle , idTexture0, idTexture1 ... , ça prendra beaucoup moins de place en mémoire video .
    Bonne journée (oui c'est le matin )

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    Merci pour votre réponse.

    J'ai essayé de ne faire qu'un glUseProgram() au cas où, mais le problème ne vient effectivement pas de là.
    Ma carte graphique est la Nvidia gts 360m (pour ordi portable donc) mais n'ayant pas de chipset secondaire, c'est bien elle qui est activée (je précise aussi que c'est une carte de type "moyenne gamme", donc pas des moins puissantes).
    Sinon y a quelque chose qui m'étonne, c'est que ce qui est beaucoup sollicité semble être le processeur et non la carte graphique (quoi que pour celle ci, je n'ai pas moyen de savoir), je le vois en regardant dans le gestionnaire de tache.

    Par contre, je vois mal comment voir le goulot d'étranglement. Auriez vous quelques liens intéressants pour ça ?

    Une dernnière chose : instancier 500 Objet3D n'est pas une très bonne idée , c'est le même principe que pour un modèle 3D , tu le charges une fois et tu fais des entitées qui vont contenir les informations : position , rotation , échelle , idTexture0, idTexture1 ... , ça prendra beaucoup moins de place en mémoire video .
    J'ai du mal a comprendre. Vous voulez dire qu'il serait mieux de mettre tous les vertex de la scène dans un seul objet Objet3D ?


    EDIT : j'ai créé un code plus simple, sans VBO/VAO, avec ce code à chaque tour de boucle :
    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
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    		glClearColor(0.5, 0.5, 0.5, 1);
     
    		glUseProgram(shader.identifiant());
    		glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, coordonneesSommets.data());
    		glEnableVertexAttribArray(0);
    		glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, coordonneesTexture.data());
    		glEnableVertexAttribArray(2);
     
    		glUniformMatrix4fv(glGetUniformLocation(shader.identifiant(), "matriceAffichage"), 1, GL_FALSE, glm::value_ptr(matriceProjection * camera.matriceVue() * glm::mat4(1)));
    		glBindTexture(GL_TEXTURE_2D, texture.identifiant());
    		for (int i = 0; i < 500; ++i)
    		{
     
    			glDrawArrays(GL_TRIANGLES, 0, coordonneesSommets.size() / 3);
     
     
     
    		}
    		glBindTexture(GL_TEXTURE_2D, 0);
    		glDisableVertexAttribArray(2);
    		glDisableVertexAttribArray(0);
    		glUseProgram(0);
    		m_fenetre->display();
    Il s'avère qu'avec ce code ça rame tout autant, mais je pense que le soucis vient de glDrawArrays() (quand j'enlève cette ligne, le processeur est "libéré").
    J'ai aussi remarqué que quand j'éloigne la caméra des cubes, le jeu ne rame plus, mais bon je pense que c'est normal (moins de pixels à gérer).

  4. #4
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Points : 293
    Points
    293
    Par défaut
    Par contre, je vois mal comment voir le goulot d'étranglement. Auriez vous quelques liens intéressants pour ça ?
    Je vous conseilles des outils comme gDEBugger ou autre debuggeur OpenGL , ça vous permettra par exemple de savoir combien d'appel OpenGL est fais par seconde, le nombres de sommets par seconde etc ....
    Un lien http://jeux.developpez.com/telecharg.../Outils-OpenGL
    Normalement avec les vao et vbo , le processeur ne devrait pas être beaucoup sollicité
    Une dernnière chose : instancier 500 Objet3D n'est pas une très bonne idée , c'est le même principe que pour un modèle 3D , tu le charges une fois et tu fais des entitées qui vont contenir les informations : position , rotation , échelle , idTexture0, idTexture1 ... , ça prendra beaucoup moins de place en mémoire video .
    J'ai du mal a comprendre. Vous voulez dire qu'il serait mieux de mettre tous les vertex de la scène dans un seul objet Objet3D ?
    Ce n'est pas ce que je veux dire , et de plus le cube n'est pas approprié , par exemple si vous chargé un model 3D , vous le mettez en mémoire une fois pour toute et l'affichez dans différents endroits (idée des entitées associé à un même modèle )
    Il est préferable d'utiliser les vbo et vao , car ils sont obligatoire si on faits du code pour OpenGL dans le profile core
    Par contre sur ton nouveau code , tu fais appel à glDrawArrays() 500 fois sur les mêmes vertex , donc tu dessine ta scène 500 fois ?

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    Alors enfaite j'ai trouvé en partie ce qui n'allait pas. Enfaite j'affichais tous mes cubes au même endroit, alors que quand je les étales, il y a bien plus de FPS.
    De plus, j'ai arrêté de faire du vérrouillage/déverrouillage continuel de texture, et j'ai l'impression que ça fluidifie un peu le programme.
    Maintenant, c'est quand on arrive à 100000 cubes que ça commence à ramer. Est-ce un "bon score" ? Sachant que j'ai remis en place les VBO et VAO.

    Je vous conseilles des outils comme gDEBugger ou autre debuggeur OpenGL , ça vous permettra par exemple de savoir combien d'appel OpenGL est fais par seconde, le nombres de sommets par seconde etc ....
    Un lien http://jeux.developpez.com/telecharg.../Outils-OpenGL
    Cet outils n'est pas difficile à utiliser et bien pratique. Merci !

    Ce n'est pas ce que je veux dire , et de plus le cube n'est pas approprié , par exemple si vous chargé un model 3D , vous le mettez en mémoire une fois pour toute et l'affichez dans différents endroits (idée des entitées associé à un même modèle )
    Ah oui d'accord je vois, effectivement c'est préférable de faire comme ça.

    Par contre sur ton nouveau code , tu fais appel à glDrawArrays() 500 fois sur les mêmes vertex , donc tu dessine ta scène 500 fois ?
    Oui c'est bien ça (sachant que la scène ne contient que un cube). J'ai fait ça simplement pour pouvoir mesurer les performances (car ça revient en théorie à afficher 500 cubes) et pour voir si avec un code simple le processeur était soulagé.

    Mais bon, pour 100000 cubes c'est étonnant, le processeur est quand même beaucoup sollicité alors que j'utilise bien les VAO et VBO (même dans le cas où je ne crée qu'un objet Objet3D, contenant 100000 cubes). A moins que ce soit normal.

  6. #6
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Points : 293
    Points
    293
    Par défaut
    Effectivement pour le vérouillage/dévérouillage de texture , il ne faut pas oublier qu'OpenGL est une machine à état (super important pour l'optimisation). Du coup il est préférable d'afficher les objets qui partagent une même texture ensemble (à la limite plusieurs appel à glDrawArrays()) que de faire des dévérouilages itempestifs (d'ailleurs si je me souviens bien dans gDEBugger il y a une option pour être averti si l'on fais trop de changement d'état "inutile"). Pour le faite que ça rame moins avec les cubes non empilé c'est un peu normal , en général on a pas 500 surface qui se superposent.
    A priori celà me semble acceptable (après ça dépend de la taille des cubes) que ça commence à ramer à partir de 100000 cubes (en effet il n'y a pas d'algo de divison de l'espace mis en place , et donc on calcul tous les cubes ...)
    Pour le fait que le processeur soit beaucoup sollicité , utilisé vous un limiteur d'image par seconde ? (celà peut être utile , comme ça si l'image est calculée trop vite , on mets le programme en pause (dépend de l'implémentation, ça permet de diminuer drastiquement l'uc utilisé)

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    Pour le fait que le processeur soit beaucoup sollicité , utilisé vous un limiteur d'image par seconde ? (celà peut être utile , comme ça si l'image est calculée trop vite , on mets le programme en pause (dépend de l'implémentation, ça permet de diminuer drastiquement l'uc utilisé)
    J'utilise bien le limiteur, je l'ai mis à 120 images par secondes, mais le processeur est quand même pas mal sollicité (même à 60 FPS).

  8. #8
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Points : 293
    Points
    293
    Par défaut
    C'est un limiteur de fps d'une bibliothèque graphique ou tu l'as crée toi même ? (parce que si c'est fais maison , avec un sleep(times) la charge devrait diminuer de beaucoup)

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    C'est celui intégré à la SFML (c'est ce que j'utilise pour le fenêtrage), mais ça fonctionnait bien avant, quand j'utilisais juste la SFML, donc de ce coté là je pense pas pouvoir faire mieux.

  10. #10
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Points : 293
    Points
    293
    Par défaut
    J'ai vérifié ici , et effectivement la SFML fais bien sf::sleep().
    Après c'est peut être les opérations matricielles (chaque matrice de transformations associé à chaque cube), qui engendrent un coût non négligeable. Le petit bémol avec la SFML est que pour l'instant elle utilise encore des fonctions depreciée , donc on ne peut pas faire un contexte 100% core profile ( normalement ça devrait être fixé dans les futures version) ( à part celà c'est une très bonne bibliothèque)

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    Après c'est peut être les opérations matricielles (chaque matrice de transformations associé à chaque cube), qui engendrent un coût non négligeable.
    Je doute que ça vienne de là, j'ai codé une petite classe pour afficher plein de cubes de manière aligné, sauf que j'envoie la translation directement dans le VBO pour ne pas passer par les matrices de transformations. Et le CPU est toujours beaucoup utilisé avec cette méthode.

  12. #12
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Points : 293
    Points
    293
    Par défaut
    Citation Envoyé par Nikogram Voir le message
    Je doute que ça vienne de là, j'ai codé une petite classe pour afficher plein de cubes de manière aligné, sauf que j'envoie la translation directement dans le VBO pour ne pas passer par les matrices de transformations. Et le CPU est toujours beaucoup utilisé avec cette méthode.
    Tu fais comment pour stocker les transformations dans les vbo ?
    Edit: à moins que tu précalculs avant les positions des sommets (c'est à dire que tu as autre chose dans tes vbo q'un cube de centre l'origine par exemple)

  13. #13
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    Bonjour !

    Un détail : dans ta fonction de rendu tu fais un appel à glGetUniformLocation.
    Pourquoi ne stockes-tu pas la valeur une fois pour toutes (dans ta classe de shader) ?
    Ca serait un gain de temps (je ne l'ai jamais quantifié, par contre).
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    Tu fais comment pour stocker les transformations dans les vbo ?
    Edit: à moins que tu précalculs avant les positions des sommets (c'est à dire que tu as autre chose dans tes vbo q'un cube de centre l'origine par exemple)
    En faite vu que je ne fais qu'une translation, je n'ai qu'à ajouter les composantes de la translation aux sommets que j'envoie aux VBO.

    Bonjour !

    Un détail : dans ta fonction de rendu tu fais un appel à glGetUniformLocation.
    Pourquoi ne stockes-tu pas la valeur une fois pour toutes (dans ta classe de shader) ?
    Ca serait un gain de temps (je ne l'ai jamais quantifié, par contre).
    Ce glGetUniformLocation, je ne le fais qu'une fois par frame, avant d'afficher mes cubes. Et vu que la matrice que j'envoie est modifiée à chaque frame (elle est liée à la caméra, qui elle bouge) je peux guère faire mieux.

    Mais bon, peut-être que le GPU est surchargée à 1 million de triangles, et qu'une partie du travail est donné au CPU. Parce que quand j'affiche que 500 cubes par exemple le processeur n'est pas du tout utilisé.

  15. #15
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    La matrice est modifiée, mais sa "Uniform location" n'est pas modifiée dans le shader compilé, donc je pense que tu as tout intérêt à la stocker quelque part.
    Mais si tu ne le fais qu'une fois par frame et pas une fois par cube, effectivement le gain devient limité.

    EDIT :
    Tu renvoies donc les VBO à chaque frame ?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  16. #16
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    J'ai du mal à voir comment stocker une Uniform location, est-ce que tu as un code d'exemple ?
    Et pour les tests non, je n'envoie les données au VBO qu'au départ.

  17. #17
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    Si on part du principe que cette location est stockée dans le shader, associée au nom, on pourrait avoir ceci :

    Après compilation du shader :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GLuint loc = glGetUniformLocation( shader.identifiant(), "matriceAffichage" );
    shader.setLocation( "matriceAffichage", loc );
    A l'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glUniformMatrix4fv(shader.getLocation( "matriceAffichage" ), 1, GL_FALSE, glm::value_ptr(matriceProjection * camera.matriceVue() * glm::mat4(1)));
    Dans mon moteur je fais différemment, j'ai wrappé les uniform dans des classes (FrameVariable) qui ont comme membre leur location.
    Au moment d'activer le shader, j'active toutes les variables qui ont une location définie. (ce qui enlève la surcharge de la recherche dans la table associative, quelle qu'elle soit).
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  18. #18
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    Ah d'accord ok.
    J'ai donc stocké la location dans une variable, mais ça n'a pas beaucoup d'effets sur le CPU.

  19. #19
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    As-tu essayé de n'activer que le minimum ? (enlever les textures, désactiver les états subsidiaires, ... )

    EDIT :
    Pour le peu d'effet du stockage de la "location", ça ne m'étonne pas, si ce n'est fait qu'une fois par frame.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  20. #20
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    J'ai enlevé les lignes glBindTexture(), toujours pareil.
    Mais je vois pas trop quoi enlever d'autre à part ça.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [2008R2] SSAS problème de connexion au traitement des cubes
    Par loosk dans le forum SSAS
    Réponses: 14
    Dernier message: 12/09/2020, 12h53
  2. [2008R2] Problème de connexion au traitement des cubes.
    Par toto9o dans le forum SSAS
    Réponses: 3
    Dernier message: 18/08/2011, 14h19
  3. Réponses: 3
    Dernier message: 29/08/2008, 09h49
  4. Problème de chargement des cubes Olap
    Par CoGnos8 dans le forum Cognos
    Réponses: 1
    Dernier message: 11/05/2008, 01h01
  5. [Performances]Afficher des mesures FPS
    Par GLDavid dans le forum Graphisme
    Réponses: 16
    Dernier message: 01/03/2006, 15h16

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