Historique des modifications - Message

Message #3562

Sujet: creation terrain


Type Date Auteur Contenu
Dernière modification 03-02-2008 01:20:19 Aseiy
Salut. deja ca va bien à Albi ou quoi? wink
Je t'explique vite fait pour le drop :
En réalité le moteur travaille par copie pour certaines chose donc tu peux les virer après les avoir ajouté.
Comment savoir s'il copie ou non? a priori je pense qu'il copie a peu pres tout excepté les trucs trop volumineux (les Mesh, les MeshBuffers, les nodes, les images)mais essaie de mettre des ->drop() sur tous les types d'éléments et tu verra bien si tu leve de l'exception. Si tu en leve une c'est que l'élément était utile. Si tu utilise gdb, le debuger, tu auras une exception directement dans le code irrlicht apres cette opération au prochain appel de sceneManager->drawAll.

virtual IAnimatedMesh* irr::scene::ISceneManager::addTerrainMesh ( const c8 * meshname,
video::IImage * texture,video::IImage * heightmap,...)
)
Cette fonction par exemple travaille sur trois pointeurs. Il est peu probable qu'irrlicht les recopie (les éléments sont volumineux et font donc perdre de la place en mémoire et du temps).

Pour la premiere question tu utilises jusqu'alors :
terrain[i][j] = maScene->addTerrainSceneNode
                    (    "../../media/heightmap2.bmp", 0, i+j, 
                        core::vector3df((float)(i+posJoueurX-1)*tailleCase, 0.f, (float)(j+posJoueurZ-1)*tailleCase));
                terrain[i][j]->setScale(core::vector3df(40, 4.4f, 40));
                terrain[i][j]->setMaterialFlag(video::EMF_LIGHTING, false);
                terrain[i][j]->setMaterialTexture(0, drive->getTexture(ntexTerrain));
                terrain[i][j]->setMaterialTexture(1, drive->getTexture("../../media/detailmap3.jpg"));
                terrain[i][j]->setMaterialType(video::EMT_DETAIL_MAP);
                terrain[i][j]->scaleTexture(1.0f, 20.0f);

Je suspecte grandement cette fonction de défoncer ta mémoire en copiant "../../media/heightmap2.bmp" à l'infini. Cette chene represente un mesh, c'est à dire la géométrie exacte et relativement gourmande en mémoire de ton objet. Souvent Irrlicht se rappelle qu'il a deja chargé quelque chose en mémoire mais pour le terrain, étant donné qu'on en utilise un seul en général, il est probable que ce ne soit pas sauvegardé.
Donc je te conseillerai plutot de faire une save de ton taff et de changer ton algo pour utiliser:

// PHASE A : le loading (dans le main ou à l'initialisation)
// A-1.1 : la plaine
IAnimatedMesh *terrainPlaine = maScene->irr::scene::ISceneManager::addTerrainMesh("terrainPlaine",
		drive->getImage("../../media/plaine.jpg"),
		drive->getImage(""../../media/heightmapMaPlaine.bmp""), [... arguments par defaut ...]);
// A- 1.2 & 1.3 & 1.4 & etc.
...
// B instancier 9 meshs scene node > tableau MaCarte[3][3]
// c'est du loading tu peux te permettre de perdre un peu de temps
for(...)
    for(...)
maCarte[i][j] = maScene->addAnimatedMeshSceneNode(terrainPlaine.....); (ou desertique ou ce que tu veux)

// PHASE 2 : En cours de partie
for...
{
    for...
    {
          // trouver le type de terrain
          switch()
          {
          case 0: 
                  meshTerrain = terrainPlaine;
                  break;
          case 1: ...
          }
          // changer le terrain :
         maCarte[i][j]->setMesh(meshTerrain);
    }
}

Pour optimiser l'algo je suis sur que t'aura pas de probleme smile. Par contre j'ai juste un doute... Je suis pas
sur que les TerrainSceneNode soit pas plus optimisé pour ce genre d'affichage... C'est douteux mais si tes FPS prennent un tir tu sauras d'ou viens le probleme wink

Bon courage.

P.S. : le probleme s'appelle, pompeusement, le 'dynamic loading' et pour le réaliser bien te faudrait des cases suffisemment petites pour être chargées rapidement et pas encombrer la mémoire... mais ca gache le coté grandiose non?
Création du message 03-02-2008 00:23:49 Aseiy
Salut. deja ca va bien à Albi ou quoi? wink
Je t'explique vite fait pour le drop :
En réalité le moteur travaille par copie pour certaines chose donc tu peux les virer après les avoir ajouté.
Comment savoir s'il copie ou non? a priori je pense qu'il copie a peu pres tout excepté les trucs trop volumineux (les Mesh, les MeshBuffers, les nodes, les images)mais essaie de mettre des ->drop() sur tous les types d'éléments et tu verra bien si tu leve de l'exception. Si tu en leve une c'est que l'élément était utile. Si tu utilise gdb, le debuger, tu auras une exception directement dans le code irrlicht apres cette opération au prochain appel de sceneManager->drawAll.

virtual IAnimatedMesh* irr::scene::ISceneManager::addTerrainMesh ( const c8 * meshname,
video::IImage * texture,video::IImage * heightmap,...)
)
Cette fonction par exemple travaille sur trois pointeurs. Il est peu probable qu'irrlicht les recopie (les éléments sont volumineux et font donc perdre de la place en mémoire et du temps).

Pour la premiere question tu utilises jusqu'alors :
terrain[i][j] = maScene->addTerrainSceneNode
                    (    "../../media/heightmap2.bmp", 0, i+j, 
                        core::vector3df((float)(i+posJoueurX-1)*tailleCase, 0.f, (float)(j+posJoueurZ-1)*tailleCase));
                terrain[i][j]->setScale(core::vector3df(40, 4.4f, 40));
                terrain[i][j]->setMaterialFlag(video::EMF_LIGHTING, false);
                terrain[i][j]->setMaterialTexture(0, drive->getTexture(ntexTerrain));
                terrain[i][j]->setMaterialTexture(1, drive->getTexture("../../media/detailmap3.jpg"));
                terrain[i][j]->setMaterialType(video::EMT_DETAIL_MAP);
                terrain[i][j]->scaleTexture(1.0f, 20.0f);

Je suspecte grandement cette fonction de défoncer ta mémoire en copiant "../../media/heightmap2.bmp" à l'infini. Cette chene represente un mesh, c'est à dire la géométrie exacte et relativement gourmande en mémoire de ton objet. Souvent Irrlicht se rappelle qu'il a deja chargé quelque chose en mémoire mais pour le terrain, étant donné qu'on en utilise un seul en général, il est probable que ce ne soit pas sauvegardé.
Donc je te conseillerai plutot de faire une save de ton taff et de changer ton algo pour utiliser:

// PHASE A : le loading (dans le main ou à l'initialisation)
// A-1.1 : la plaine
IAnimatedMesh *terrainPlaine = maScene->irr::scene::ISceneManager::addTerrainMesh("terrainPlaine",
		drive->getImage("../../media/plaine.jpg"),
		drive->getImage(""../../media/heightmapMaPlaine.bmp""), [... arguments par defaut ...]);
// A- 1.2 & 1.3 & 1.4 & etc.
...
// B instancier 9 meshs scene node > tableau MaCarte[3][3]
// c'est du loading tu peux te permettre de perdre un peu de temps
for(...)
    for(...)
maCarte[i][j] = maScene->addAnimatedMeshSceneNode(terrainPlaine.....); (ou desertique ou ce que tu veux)

// PHASE 2 : En cours de partie
for...
{
    for...
    {
          // trouver le type de terrain
          switch()
          {
          case 0: 
                  meshTerrain = terrainPlaine;
                  break;
          case 1: ...
          }
          // changer le terrain :
         maCarte[i][j]->setMesh(meshTerrain);
    }
}

Pour optimiser l'algo je suis sur que t'aura pas de probleme smile. Par contre j'ai juste un doute... Je suis pas
sur que les TerrainSceneNode soit pas plus optimisé pour ce genre d'affichage... C'est douteux mais si tes FPS prennent un tir tu sauras d'ou viens le probleme wink

Bon courage.

P.S. : le probleme s'appelle, pompeusement, le 'dynamic loading' et pour le réaliser bien te faudrait des cases suffisemment petites pour être chargées rapidement et pas encombrer la mémoire... mais ca gache le coté grandiose non?

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
130 invités en ligne
membre en ligne: -
RSS Feed