samedi 28 avril 2012

22# AUUGH

Coucou.
J'ai dessiné ça sur paint, en partie avec mon extension que je m'étais programmée. Ça m'a donné envie de l'améliorer, et en parallèle j'ai commencé à apprendre à utiliser Qt (une bibliothèque C++ axée sur la création de fenêtres). Je vais donc peut-être finalement y ajouter quelques fonctionnalités et lui faire une belle GUI...
Concernant le moteur de voxels: j'ai implémenté le rendu par display list, mais il s'avère que l'approche pour le stockage de voxels dans un tableau tridimensionel n'est pas une idée si lumineuse que ça. Il se trouve que la majorité du temps, seuls environ 25% des "cases" du tableau sont remplies avec un voxel effectivement solide, le reste représente de l'air, du vide et n'est pas représenté graphiquement, mais prend néanmoins de la place en mémoire. Alors le rendu avec les display accélère effectivement l'affichage, mais le volume occupé en mémoire est ingérable (j'ai peur de dire une bêtise, je sais plus ce que ça représente, mais c'est beaucoup) pour un terrain de seulement, mettons 300*300*300 voxels. Je vais donc tenter une autre manière de stocker mes voxels: les 'map'. Il faut que j'en apprenne d'avantage avant d'aller plus loin, mais ça a l'air plus efficace et j'en parlerai quand j'en saurais plus. Si toutefois une personne pouvant m'aiguiller lit ces lignes, qu'elle se manifeste s'il vous plaît; je n'ai pas trouvé de ressources ou exemples satisfaisants sur internet, et j'ai du mal à distinguer la différence entre map, unordered_map, table de Hash, faut-il préférer boost::map ou std::map, sont-ce les mêmes ? Voilà. Pour les images c'est toujours pareil: clique pour agrandir :]

3 commentaires:

  1. Explores la solution des listes chainées (www.siteduzero.com/tutoriel-3-36245-les-listes-chainees.html) pour stocker tes positions de voxel sur l'axe Z. Tu aura un tableau de taille fixe pour tes X et Y (mettons 300*300) en revanche l'axe Z aura une taille variable en fonction du nombre de voxel à afficher.

    Ce qui m'étonne, c'est que ton tableau tridimensionnel soit si volumineux. Certes ça représente 9 000 000 d'objet, mais si tes voxel sont tous identiques, tu peux à chaque position ne stocker qu'un char (1 octet) qui dit si oui ou non la position possède un voxel. Ensuite tu n'as qu'à rendre le voxel définis une seule fois en mémoire. Et au final ça doit représenter (si je dis pas de conneries ^^) environ 9 Mo.

    Si, plus tard, tu veux donner à tes voxel des informations de texture ou de couleur ou autres (minecraft) tu peux utiliser ton char comme ENUM pour les différents models de voxel.

    tiens un tuto sur les conteneurs de la STL

    http://www.siteduzero.com/tutoriel-3-473855-les-conteneurs.html

    voilà j'espère ne pas être trop confus, c'est l'heure de la sieste ^^

    RépondreSupprimer
    Réponses
    1. J'ai déja envisagé toutes ces solutions, et ça n'est malheureusement pas forcémment plus efficace. Il y a aussi d'autres contraintes à prendre en compte; mais merci pour tes liens, je connaissais pas ce tuto sur les conteneurs :D

      Depuis le moments ou j'ai écrit cet article, j'ai eu le temps de réflechir à différentes solution, et en fin de compte une unordered map alliée à des display list paraît la meilleure combinaison possible, donc c'est la prochaine étape à implémenter .

      Supprimer
    2. effectivement l'affichage, mais le volume occupé en mémoire est ingérable (j'ai peur de dire une bêtise, je sais plus ce que ça représente, mais c'est beaucoup) pour un terrain de seulement, mettons 300*300*300 voxels. Je vais donc tenter une autre manière de stocker mes voxels: les 'map'. Il faut que j'en apprenne d'avantage avant d'aller plus loin, mais ça a l'air plus efficace et j'en parlerai quand j'en saurais plus. Si toutefois une personne pouvant m'aiguiller lit ces lignes, qu'elle se manifeste s'il vous plaît; je n'ai pas trouvé de ressources ou exemples satisfaisants sur internet, et j'ai du mal à distinguer la différence entre map, unordered_map, table de Hash, faut-il préférer boost::map ou std::map, sont-ce les mêmes ? Voilà. Pour les images c'est toujours pareil: clique pour agrandir :]
      Date de publication: 4/28/2012 11:27:00 PM
      3 réaction(s) - Commenter:


      Sebin11 mai 2012 14:24

      Explores la solution des listes chainées (www.siteduzero.com/tutoriel-3-36245-les-listes-chainees.html) pour stocker tes positions de voxel sur l'axe Z. Tu aura un tableau de taille fixe pour tes X et Y (mettons 300*300) en revanche l'axe Z aura une taille variable en fonction du nombre de voxel à afficher.

      Ce qui m'étonne, c'est que ton tableau tridimensionnel soit si volumineux. Certes ça représente 9 000 000 d'objet, mais si tes voxel sont tous identiques, tu peux à chaque position ne stocker qu'un char (1 octet) qui dit si oui ou non la position possède un voxel. Ensuite tu n'as qu'à rendre le voxel définis une seule fois en mémoire. Et au final ça doit représenter (si je dis pas de conneries ^^) environ 9 Mo.

      Si, plus tard, tu veux donner à tes voxel des informations de texture ou de couleur ou autres (minecraft) tu peux utiliser ton char comme ENUM pour les différents models de voxel.

      tiens un tuto sur les conteneurs de la STL

      http://www.siteduzero.com/tutoriel-3-473855-les-conteneurs.html

      voilà j'espère ne pas être trop confus, c'est l'heure de la sieste ^^
      Répondre
      Réponses


      Layl15 mai 2012 17:36

      J'ai déja envisagé toutes ces solutions, et ça n'est malheureusement pas forcémment plus efficace. Il y a aussi d'autres contraintes à prendre en compte; mais merci pour tes liens, je connaissais pas ce tuto sur les conteneurs :D

      Depuis le moments ou j'ai écrit cet article, j'ai eu le

      Supprimer