Skip to content
Cesar Leblic edited this page Jan 20, 2014 · 2 revisions

VertexManager:

Le VertexManager a pour objectif de dessiner des entités tout en :

  • réduisant les transfères de données de la RAM à la VRAM
  • en supprimant les doublons
  • et en sérialisant le plus possible les objets sur la mémoire GPU.

1ére Objectif - Limiter les transfères RAM-VRAM

Les Transfère RAM-VRAM sont contrôlé par une VertexPool composant la class de VertexManager. Elle permet le contrôler la nécessité d'effectuer une mise à jour des données sur le GPU. Ceci se traduisant pas deux types d’événements généraux.

  • Update Majeur : Intervient dans le cas d'un agrandissement de la Pool (possible l'hors de l'ajout d'une Entité dans la VertexManager). Ceci implique un recalcule des offsets de la pool utilisée pour dessiner ainsi que le transfère total des données de la RAM sur la VRAM.
  • Update Mineur: Intervient dans le cas d'un ajout d'entité pouvant être inséré dans des emplacement disponible de la pool. Ce cas peux se présenter lorsqu'une donnée est supprimée de la pool, elle n'est pas automatiquement retirée du GPU. Et ceci car il serait trop couteux de ré-allouer sur la VRAM. A la place la pool ne permet plus au vertexManager de dessiner l'entité supprimée, mais garde l'emplacement comme potentiellement disponible pour d'autres. Ainsi lorsque qu'un nouvelle entité est insérée, sa taille est testée par rapport aux emplacements disponibles et ses données sont ensuite transférées par copie vers le GPU sans procéder à d'allocation. Cette update permet de faire yoyo avec des données entre la RAM et la VRAM sans avoir à faire de grosses mises à jour inutiles et couteuses.

2éme Objectif : Supprimer les doublons.

Optimisation simple et efficace. Lorsqu'une entité est ajoutée au vertexManager celle-ci est considérée comme Drawable. C'est à dire qu'à partir de ce moment elle possède un pointeur sur le vertexManager afin de lui permettre de la dessiner. La géométrie de celle-ci est alors envoyée à la vertexPool du manager qui s'occupe de vérifier que ses informations ne sont pas déjà présente dans l'un de ses emplacements. Ainsi plusieurs entités peuvent pointer sur la même géométrie.

3éme Objectif: Sérialisation des données.

Toutes les données sont contenues dans un unique VBO (VertexBufferObject), organisé de façon à ce que la pool puisse renvoyer des offsets sur les emplacements à dessiner lors d'un appel au draw du VertexManager. Ainsi les positions, les couleurs, les normales, ect... de tout les objets sont sérialisés et ceci grâce à l'utilisation des VertexAttribPointer qui sont réinitialisés à chaque fois qu'un update Majeur est occasioné.

Clone this wiki locally