Bonjour à tous,
J'essaye de programmer un petit jeu utilisant le même système que "minecraft" (pour ceux qui ne connaisse pas voici le lien : www.minecraft.net)
En réalité je n'essaye pas de copier le jeu mais d'utiliser le systeme de petit cube pour réaliser ma map. Cubes qui pourront dans le jeu être supprimés ou rajoutés.
Dans un premier temps j'utilise une Heightmap (image) que je lis. En fonction des hauteurs de celle-ci, j’affiche un certains nombres de petits cube sur l'axe Z.
* Je pensais dans un premiet temps utiliser une node par cube. En effectuant quelques tests, je me suis rendu compte que l'initialisation d'une zone comportant
une map de 512 *512 cubes a multiplié par un nombre qui variera en fonction de la hauteur du heightmap était beaucoup trop longue.
En d'autres termes l'ajout d'une node par cube n'est pas assez rapide et consomme énormément de ressource (mémoire).
C'est bien dommage car j'ai besoin de pouvoir par exemple supprimer un seul cube dans le jeu ou en rajouter d'autres .
* Je pensais donc alors crée une mesh composé des petits cubes et de l'afficher. De cette manière tout va très vite et je n'utilise qu'un seul node pour l'affichage de ma map. Seul soucis, je n'ai plus accès au petit cube en question et ne peux les faire disparaître un a un .
Je peux bien sure via un TriangleSelector savoir lorsque je touche un vertex mais je n'ai plus la possibilité de faire disparaître un cube à la fois
J’espère avoir été claire dans mon topic
Existe-il une autre façon de faire ?
Merci d'avance
Hors ligne
Hmm, je pense globalement voir quel est ton soucis.
pour ce qui est des cubes, si tu passes par la fonction addCubeSceneNode le soucis c'est qu'elle
va créer à chaque fois un cube avec un mesh associé. Ce qui est bien dommage en terme de ressources, surtout
quand on souhaite créer plusieurs centaines de cubes.
perso pour éviter ce genre de boulimie de mémoire je ferais plutôt ce genre de chose
scene::IMesh *cubeMesh = smgr->getGeometryCreator()->createCubeMesh(core::vector3df(ssize)); scene::ImeshSceneNode *CubeNode = smgr->addMeshSceneNode( cubeMesh);
tu peux créer autant de CubeNode que tu veux, il feront tous référence à un seul mesh, d'ou une énorme économie
de mémoire.
Après, en fonction de tes besoins, à toi de créer les quelques CubeMesh dont tu as besoin et de gérer le truc
en fonction des règle de ton jeux.
Hors ligne
Merci pour ta réponse, je vais tester
Effectivement, pour mes tests, j'utilisais le addCubeSceneNode et effectivement si il créé un mesh a chaque fois, cela va consommer beaucoup de mémoire.
merci
Hors ligne
C mieux mais beaucoup trop lent a l'affichage. Le mieux serait de pouvoir créer
un seul mesh à partir de l'ensemble des cubes mais a nouveau, je n'aurai plus de contrôle sur un cube que je voudrais détruire à moins de pouvoir recharger un nouveau mesh sans le cube en question.
Est- ce possible ? Si oui est ce que cela sera assez rapide ?
le IMeshManipulator ne permet il pas de le faire ?
merci d'avance ?
Hors ligne
thoced :
... petit jeu utilisant le même système que "minecraft" (pour ceux qui ne connaisse pas voici le lien : www.minecraft.net
ton lien ne semble pas fonctionner...
petite question, au niveau de la vue de ton jeux, as-tu une vue global permanante, ou la vue principale est-elle fixée sur une partie de ton level ?
Hors ligne
C'est bon j'ai trouvé quand même des info sur ce jeux.
En fait, dans ton cas il te faudrait créer des zones d'affichage, un peu comme un octree. L'avantage de manipuler des cubes empilés, c'est que cela simplifie
beaucoup la géométrie.
Tu créé des zones qui contiennent tes cubes (un cube geant servant de conteneur en quelque sorte), avec un AABBOX qui va bien, et tu passe par un AutomaticCulling() en
scene::EAC_FRUSTUM_BOX, et tu verras, tes performance augmenteront et tu garderas ta souplesse d'emplois avec des cubes bien indépendant
Hors ligne
Je comprends très bien le découpage en zone mais ce que je ne comprends pas c'est en quoi va t il y avoir une amélioration des performance ?
Irrlicht ne gère t il pas à la base un Octree pour l'affichage des Nodes ???
En d'autre terme, je pensais qu'Irrlicht partitionnait déjà en natif les nodes en les incluant lui même dans des BoudingBox de plus en plus petit. et Via Un Frustum Culling descendait dans l'arbre octree tant que le bounding box était visible par la caméra et ne descendait pas dans l'arbre si un boudingbox ne l'était pas.
Donc si je comprends bien, Irrlicht affiche les Nodes en Brut sans optimisation ??
Merci d'avance
Hors ligne
Pour te faire une idée de comment Irrlicht optimise" l'affichage, affiche le nombre de polygonnes affiché dans ta scene durant l'execution de
ton application, cela te donnera une idée ....
( driver->getPrimitiveCountDrawn(); )
Hors ligne
c55.me/minetest/ Tu t'es fait doubler, l'ami.
Dernière modification par Lagiol (19-11-2011 13:56:47)
Hors ligne