13 votes

La meilleure façon d'utiliser les VBO

Quels sont les moyens les plus rapides et les plus souples (applicables dans la plupart des situations) d'utiliser les VBO ?

Je suis en train de développer une application openGL et je veux qu'elle soit la plus performante possible, j'ai donc besoin de quelqu'un pour répondre à ces questions. J'ai lu beaucoup de questions et de réponses mais je pense qu'il y a trop d'informations dont je n'ai pas besoin, ce qui me perturbe le cerveau...

  • Combien de vbos dois-je utiliser ?
  • Comment créer des vbos ?
  • Comment mettre à jour les données vbos si la taille des données n'est pas fixe ?
  • Comment dois-je rendre les vbos ?
  • Comment dois-je traiter les données dans vbos que je ne veux plus rendre ?

18voto

datenwolf Points 85093
  • Combien de vbos dois-je utiliser ?

Le moins possible. Le changement de VBO a un coût faible, mais mesurable. En général, vous essaierez de regrouper les données similaires dans des VBO. Par exemple, dans un jeu FPS, tous les types de déchets qui traînent dans la rue, les petits accessoires, etc., seront généralement situés dans le même VBO ou dans un petit nombre de VBO.

Il s'agit également de la taille des lots de dessins. glDraw… qui rendent moins d'une centaine de primitives sont sous-optimaux (cela a toujours été le cas, même il y a 15 ans). Il est donc préférable d'utiliser au moins 100 primitives dans la mesure du possible. Mais si un seul maillage n'a que, disons, 20 triangles (accessoires à faible polycomptage pour l'instanciation ou autre), chacun dans son propre VBO, vous ne pouvez plus faire de lots plus importants.

  • Comment créer des vbos ?

glGenBuffers glBindBuffer glBufferData

MISE À JOUR Vous pouvez passer un pointeur nul à la fonction data de glBufferData pour initialiser l'objet tampon sans définir les données.

  • Comment mettre à jour les données vbos si la taille des données n'est pas fixe ?

Créez des VBO avec une granularité plus grossière que la taille de vos données. Votre système d'exploitation le fait de toute façon pour vos données côté hôte, c'est ce qu'on appelle la pagination. De plus, si vous voulez utiliser glMapBuffer Le fait que l'objet tampon soit un multiple de la taille de la page de l'hôte est très agréable pour l'ensemble du système.

La taille habituelle d'une page sur les systèmes actuels est de 4 Ko. C'est donc la granularité de la taille de l'OBV que je choisirais. UPDATE : Vous pouvez demander à votre système d'exploitation quelle taille de page il utilise. Cela dépend du système d'exploitation, je poserais une autre question à ce sujet.

Mettre à jour les données à l'aide de glBufferSubData ou les mapper avec glMapBuffer modifier dans la mémoire mappée côté hôte, puis glUnmapBuffer.

Si les données dépassent l'objet tampon, créez-en un nouveau, plus grand, et copiez-le avec glCopyBufferSubData. Voir le dernier paragraphe.

  • Comment dois-je rendre les vbos ?

glBindBuffer glDraw

  • Comment dois-je traiter les données dans vbos que je ne veux plus rendre ?

Si les données ne consomment qu'une partie de l'espace de stockage virtuel, qu'elles le partagent avec d'autres données et que vous ne manquez pas de mémoire, alors, eh bien, n'y accédez pas. L'idéal est de conserver un index permettant de savoir quelle partie de l'OBV est disponible pour quel type de tâche. Cela ressemble beaucoup à la gestion de la mémoire, en particulier à un système connu sous le nom de piles d'objets (obstacks).

Toutefois, il peut s'avérer utile de compacter un objet tampon existant. Pour ce faire, vous devez créer un nouvel objet tampon, le lier en tant que cible d'écriture, l'ancien objet tampon étant sélectionné en tant que cible de lecture. Utilisez ensuite glCopyBufferSubData pour copier le contenu dans un nouvel objet tampon plus compact. Bien sûr, vous devrez alors mettre à jour toutes les références au nom de l'objet tampon (=OpenGL ID) et aux décalages.

Pour cette raison, il est logique d'écrire une couche d'abstraction fine sur les objets tampons OpenGL qui garde la trace des données typées réelles dans les blobs sans structure que sont les objets tampons OpenGL.

-2voto

Quonux Points 2166

Combien de vbo dois-je utiliser ?

Autant que vous en avez besoin, cela semble idiot mais c'est ainsi.

Comment mettre à jour les données vbos si la taille des données n'est pas fixe ?

Écraser et rendre le même OVB avec des données et des longueurs différentes.

Comment créer des vbos ?

Comment dois-je rendre les vbos ?

voir Tutoriel VBO

Comment dois-je traiter les données dans vbos que je ne veux plus rendre ?

créer un nouveau vbo et y copier les données ou ne rendre que les parties du vbo qui sont en mémoire.

Pour ne rendre que des parties, voir glVertexBuffer glTexCoordPointer (il suffit de calculer le nouveau pointeur et la nouvelle taille sur la base du décalage)

Editer 1 :

L'utilisation d'un seul VBO pour tout ne convient pas, car il faut gérer soi-même l'attribution des nouvelles positions de vertex/coordonnées de texture, ce qui devient très vite désordonné.

Il est préférable de regrouper les petits accessoires dans des VBO et d'effectuer les commandes de dessin par lots.

Puis-je ajouter des données à un tampon avec glBufferSubData (ajouter 100 éléments à un tampon de taille x) ?

Non, ce n'est pas possible car la description dit updates a subset of a buffer object's data store et un sous-ensemble est un ensemble plus petit à l'intérieur d'un ensemble.

Édition 2

Un bon tutoriel est également Apprendre la programmation graphique 3D moderne mais elle n'est pas spécifique à la VBO.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X