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 :

Vbo : stream ou pas ?


Sujet :

OpenGL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Points : 74
    Points
    74
    Par défaut Vbo : stream ou pas ?
    hello.

    Voici mon code source :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    glBindBuffer(GL_ARRAY_BUFFER, bufferID);
    if(update)
        glBufferData(GL_ARRAY_BUFFER, vertexArray.size()*sizeof(float), &vertexArray[0], GL_STREAM_DRAW);
    glVertexPointer(4, GL_FLOAT, 0, 0);
    Ce code permet d'afficher de la géométrie (vertexArray) mais cette géométrie ne change quasi jamais, d'où mon "if(update)" pour améliorer la vitesse de mon programme si la géométrie ne change pas.

    Ma question : est-ce que GL_STREAM_DRAW est adapté à ce genre de situation ? Est-ce qu'il est garanti que ma géométrie va rester dans la mémoire de la carte graphique étant donné que je ne la re-dessine pas à chaque frame ?

    merci.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    Je n ai pas la reponse a ta question, mais ce que je peux te dire, c'est que les resources GPU peuvent "disparaitre" de ta carte graphique... simplement car d autres applications sont elles aussi capable de faire des allocations GPU auquel cas la driver fait de la place comme il peut ...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Points : 74
    Points
    74
    Par défaut
    Merci Smashy mais le driver ne s'arrange pas pour garder les données quelques part quand la mémoire vidéo est pleine ? (par exemple en Ram)

    Pour une géométrie entièrement statique, j'exécute ce genre de code juste une fois au début de mon application :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glBindBuffer(GL_ARRAY_BUFFER, bufferID[COORD_OBJECT]);
    glBufferData(GL_ARRAY_BUFFER, 4*sizeof(float)*2, stArray, GL_STATIC_DRAW);
    C'est donc faut ? Mais alors il n'y a plus d'avantage à utiliser GL_STATIC_DRAW par rapport à GL_STREAM_DRAW, si ?!

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    En fait, je reconsidere la question initial ...

    de memoire (et a confirmer) :

    - avec STATIC_DRAW, tu ne dois pas pouboir changer le buffer comme tu veux

    - avec STREAM_DRAW, tu peux changer le buffer, mais tu n'est pas oblige de le remplir chaque frame


    Pour la question de reconstitution des resources GPU par le driver , je vais botter en touche ...

    sur directX , il me semble (de memoire mais c'est loin) qu'il y a des maniere de s'assurer que les resources se reconstruisent automatiquement (backup CPU vers GPU si "LOST") (flag genre "MANAGED")

    Pour OpenGL, je ne pense pas que tu disposes de ce genre de facilite

    (TOUT CA A FAIRE CONFIRMER PAR DES GENS PLUS COMPETENTS QUE MOI)

    Par contre, je il y a des possibilites au moins de detection de perte de ressource (sous GL)


    Difficile pour moi a partir d'ici (acces net restreint) de consulter les doc OpenGL sur le sujet ... sans promesse j essaierai de faire ca un peu plus tard


    Sinon , tu peux deja faire des testes (en cradot) a la main genre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void drawScene(){
     
      static int frame_count = 0;
     
      if (frame_count & 1 == 0){ /* pair / impair */
     
      } else {
     
      }
     
      ++frame_count;
     
    }
    et faire des tests en utilisant deux buffers (un static , un dynamic) , en remplissant le dynamic une frame sur x ...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Points : 74
    Points
    74
    Par défaut
    Merci, je viens de regarder un code source avec un STATIC_DRAW et le code du glBufferData se trouve bien à l'init du programme.

    Quand tu dis ceci : "avec STREAM_DRAW, tu peux changer le buffer, mais tu n'est pas oblige de le remplir chaque frame" Ok mais c'est sans être certain que le driver ne va pas virer les données en mémoire lors d'une frame où on ne rempli pas le buffer ? Si c'est ça, je trouve ça un peu null

    Quant au test, je ne comprend pas bien. J'ai déjà testé le code source de ma question initiale...il fonctionne mais peut-être qu'il ne fonctionnera pas chez quelqu'un qui à une carte graphique de 32Mo ! Bref, c'est en quelque sorte un comportement indéterminé et donc difficile de testé de façon sûr.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    En gros, ta carte graphique peut detruire spontannement des resources a toi pour ses besoins en memoire. Ca peut arriver n'importe quand, mais pour un besoin normal, il y a qd meme tres peu de chances pour que ca arrive (il faudrait a cote de ton .exe, un programme gourmand en resource (qui a dit vista ?)) ... c'est valable pour TOUTE RESOURCE (STREAM_STATIC ou PAS)

    Donc, c'est surtout un detail que je donnais.


    maintenant, en 2008, une machine avec 32 Mo de GPU, ca s appelle une calculatrice

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Points : 74
    Points
    74
    Par défaut
    Un détail si on veux.... avec un jeux vidéo actuel, je croit que l'on peut remplir très vite la mémoire de la carte graphique et donc si je fait un STATIC_DRAW à l'initialisation de mon jeux, rien ne me garanti qu'il sera encore affiché après 1 heure de jeux. Tu en est vraiment sûr ? Ça me parait quand même important et j'en ai jamais entendu parler !

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    Ce phenomene est independant du STATIC_DRAW / STREAM_DRAW.

    Mais dans le cas ou la ressource est perdue, tu peux toujours la reinitialiser (manuellement malheureusement sous GL) que ce soit STATIC ou pas.

    En indiquant STREAM_DRAW , on indique au driver que cette ressource est susceptible de changer souvent (mon avis, c'est que cette indication permet justement a un driver de savoir quelles resources virer en premier ...)


    Maintenant, si tu fais des test pour toi et que tu reserves quelques texture+VBuffer , la perte de resource ne devrait pas trop t'inquieter.

    D ici j'ai pas acces a GL.org mais dans les extensions, de memoire , tu peux savoir si le resource est lost ou pas donc en pseudo code il faudrait faire quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void use_buffer(GLint id){
     
      if ("gl_IsBufferLost(id)"){
     
        recreate_resource(id);
      }
     
      glBindResource(id);
     
    }

Discussions similaires

  1. [OpenGL 3.x] Les VBO ne fonctionnent pas sans VAO :(
    Par greg2 dans le forum OpenGL
    Réponses: 1
    Dernier message: 13/11/2014, 17h29
  2. héberger ses vidéos : "streaming" ou pas ?
    Par talvins dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 19/10/2011, 11h19
  3. format application/octet-stream et pas txt
    Par the_crow_man dans le forum POSIX
    Réponses: 9
    Dernier message: 18/06/2008, 10h41
  4. Regarder une série en streaming : légal ou pas ?
    Par n@n¤u dans le forum Films & TV
    Réponses: 6
    Dernier message: 02/05/2007, 14h57
  5. [HTML] streaming video *.rm marche avec FF pas avec IE
    Par gretch dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 24/10/2006, 15h05

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