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 :

Fuite de mémoire avec VBO ?


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 29
    Par défaut Fuite de mémoire avec VBO ?
    Bonjour,

    Je suis à la recherche des éventuelles fuites de mémoire pouvant se trouver dans mon code et memcheck/valgrind me sort la chose suivante (entre autres) au niveau de la mise à jour de mon VBO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ==2601== Invalid write of size 1
    ==2601==    at 0x04027420: memcpy (mc_replace_strmem.c:497)
    ==2601==    by 0x08057291: ObjetVP::updateCoordonneesVertex() (ObjetVP.cpp:227)
    ==2601==    by 0x08057977: ObjetVP::refreshAffichage() (ObjetVP.cpp:416)
    ==2601==    by 0x0805c7d8: TextureVP::display() (TextureVP.cpp:149)
    ==2601==    Address 0xb6ed741e is not stack'd, malloc'd or (recently) free'd
    ==2601==
    Or justement, le contenu de la méthode updateCoordonneesVertex() est le suivant :
    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
    /**
     * Met à jour les coordonnées des vertex du VBO.
     * @return -1 en cas d'erreur, 0 sinon
     */
    int ObjetVP::updateCoordonneesVertex() {
    	// Début de la communication avec le VBO
    	glBindBuffer(GL_ARRAY_BUFFER, vboId);
    	pos_vbo = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
    	if (pos_vbo == NULL) {
    		return -1;
    	}
     
    	printf("sz tabVertex: %d --- nbVertex: %d --- sz Vertex: %d\n", sizeof(tabVertex), NB_VERTEX, sizeof(Vertex));
    	// Transfert de la mise à jour au VBO
    	memcpy(pos_vbo, tabVertex, NB_VERTEX * sizeof(Vertex));
    	// On termine la communication avec le VBO
    	glUnmapBuffer(GL_ARRAY_BUFFER);
    	pos_vbo = NULL;
    	return 0;
    }
    Je ne comprends pas d'où vient l'erreur sachant que :
    - La ligne du printf() me renvoie bien "sz tabVertex: 7200 --- nbVertex: 225 --- sz Vertex: 32".
    - Je ne pense pas avoir fait quelque chose de trop différent du tuto dont je me suis inspiré.

    Donc si vous avez une idée... O_o

    Merci et bonne journée.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    Tout d'abord, vous n'avez pas une fuite de mémoire (enfin, votre citation, ne décrit pas une fuite) mais un accès en dehors de votre mémoire (celle qui résulte très souvent en erreur de segmentation).

    ==2601== Invalid write of size 1
    Indique que vous écrivez 1 octet en dehors de votre zone alloué (mémoire allouée par votre programme)

    Après, la ligne incriminée, c'est le memcpy. Donc j'imagine que l'un de vos pointeurs n'est pas alloué à la bonne taille, ou alors la taille passé à memcpy n'est pas la bonne.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 29
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Tout d'abord, vous n'avez pas une fuite de mémoire (enfin, votre citation, ne décrit pas une fuite) mais un accès en dehors de votre mémoire (celle qui résulte très souvent en erreur de segmentation).
    Oui au temps pour moi... J'ai tellement l'habitude d'utiliser valgrind pour "rechercher des fuites de mémoire" que j'abuse un peu du terme.

    Citation Envoyé par LittleWhite Voir le message
    Après, la ligne incriminée, c'est le memcpy. Donc j'imagine que l'un de vos pointeurs n'est pas alloué à la bonne taille, ou alors la taille passé à memcpy n'est pas la bonne.
    Et justement! C'est la raison pour laquelle j'ai donné le résultat de la ligne contenant le printf().
    Je demande bien au memcpy() de copier les 225 * 32 (= 7200) octets de tabVertex (qui fait bien 7200 octets j'ai vérifié) à l'endroit pointé par pos_vbo. pos_vbo, quant à lui, est un GLvoid *. A priori je n'ai pas le choix car c'est ce que doit me renvoyer glMapBuffer(). Certes je ne spécifie nulle part la taille de la zone pointée par pos_vbo mais quand même : pourquoi "Invalid write of size 1" et pas "Invalid write of size 7200" ?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Pouvez vous me montrer le code de la création du buffer.
    Et puis dans la technique votre memcpy est "unsafe" (cas d'une réallocation totale)
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 29
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Pouvez vous me montrer le code de la création du buffer.
    Pas de problème. Le voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void ObjetVP::initVBO() {
    	glGenBuffers(1, &vboId); // Create the buffer ID, this is basically the same as generating texture ID's
    	glBindBuffer(GL_ARRAY_BUFFER, vboId); // Bind the buffer (vertex array data)
     
    	glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * NB_VERTEX, NULL, GL_DYNAMIC_DRAW);
    	glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertex) * NB_VERTEX, tabVertex);
     
    	// Make sure you put glVertexPointer at the end as there is a lot of work that goes on behind the scenes
    	// with it, and if it's set at the start, it has to do all that work for each gl*Pointer call, rather than once at
    	// the end.
    	glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(8));
    	glVertexPointer(2, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(0));
    }
    Au passage quelques déclarations de variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct {
    		GLfloat location[2];
    		GLfloat tex[2];
    		GLubyte padding[16]; // Pads the struct out to 32 bytes for performance increase
    	} Vertex;
     
    GLuint vboId;			// Vertex Buffer Object ID
    GLvoid *pos_vbo;			// Communication avec le VBO
    Vertex tabVertex[NB_VERTEX];			// Tableau des vertex
    Citation Envoyé par LittleWhite Voir le message
    Et puis dans la technique votre memcpy est "unsafe" (cas d'une réallocation totale)
    C'est à dire ? Je n'ai pas très bien compris en quoi c'est sécurisé... O_o

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Pouir le memcpy
    j'ai cru comprendre qu'il fallait plus ce baser sur le pointeur retourne plus que celui en parametre.
    Y a le cas de recouvrement, ou la doc le precise.
    Apres ... en fait, j'ai confondu avec 'realloc' :red:

    Et pour le probleme, je dois dire que je ne vois pas du tout ce qui provoque ce rapport de valgrind.
    Juste pour essayer, mettez la taille + 1 lors de l'allocation du buffer (un essai sur un autre PC, et ou avec un autre pilote, ne serait pas du luxe )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. Fuite de mémoire avec GUI Swing
    Par pouvoir triforce dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 17/06/2011, 00h26
  2. Fuites de mémoire avec cvLoadImage et cvCvtColor
    Par Fabounch dans le forum OpenCV
    Réponses: 2
    Dernier message: 03/03/2010, 11h45
  3. Problème de fuite de mémoire avec GTK+
    Par gwenhael dans le forum GTK+
    Réponses: 15
    Dernier message: 03/01/2008, 16h22
  4. Fuites mémoires avec Vector
    Par ..alex.. dans le forum SL & STL
    Réponses: 15
    Dernier message: 10/08/2006, 11h35
  5. Fuite mémoire avec valgrind
    Par franchouze dans le forum C++
    Réponses: 3
    Dernier message: 05/06/2006, 16h47

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