IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

[DX9][C#] Optimisation rendu


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 113
    Par défaut [DX9][C#] Optimisation rendu
    Salut,

    Voilà je suis sur un projet de modélisation d'étagère d'entrepot...

    Ces étagère peuvent être constituées de centaine de cubes (meshbox).

    J'ai mis en place une gestion de la camera pour me deplacer à l'intérieur ...
    Seulement dès que je bouge avec la camera je suis obligé de tout recharger sur la 3D ( le nombre de meshbox peut aller jusqu'à 16000).
    A cause du grand nombre de mesh un lague se créé...

    Est-il possible de bouger la camera sans avoir à tout redessiner.


    Je voulais savoir ce que je pouvais faire pour optimiser la modélisation pendant le changement de d'angle de la camera ??

    J'ai pensé mettre en place un thread qui tournerait pendant le deplacement de la camera et remplacerait une étagere de meshbox par un seul meshbox de la taille de l'étagère.

    Vais-je gagner en performance par ce procédé ? Voyez vous une autre solution ??

    Merci

  2. #2
    Membre éclairé
    Avatar de funkydata
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 515
    Par défaut
    Qu'est-ce que tu entends par "tout recharger" ?

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 113
    Par défaut
    Je redessine tous mes meshbox des que je bouge ma camera ...

  4. #4
    Membre éclairé
    Avatar de funkydata
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 515
    Par défaut
    Ca dépend donc de ta scène... si tes boites ne sont pas tout le temps visible du fait de la rotation ou du mouvement de la caméra tu peux faire du Frustum Culling. Si les boites sont en générale toutes affichées mais cachées les unes derrière les autres tu peux faire de l'Occlusion Culling... Enfin bref sa dépend surtout de ta scène. Tu peux aussi, accessoirement, faire les 2

  5. #5
    Membre expérimenté Avatar de Sixissor
    Étudiant
    Inscrit en
    Février 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 206
    Par défaut
    Salut.

    Tu fais comment pour tout afficher ? Tu peux montrer ta boucle de rendu (le principal) ?

    En tout cas 16 000 meshBox ça me parait beaucoup compte tenu que tu veux afficher une étagère d'entrepot si j'ai bien compris. Y'a peut-être moyen de faire ça avec moins de polygones non ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 82
    Par défaut
    LOD, progressive mesh est peut etre aussi une solution à envisager.

  7. #7
    Membre éclairé
    Avatar de funkydata
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 515
    Par défaut
    Citation Envoyé par xterminhate
    LOD, progressive mesh est peut etre aussi une solution à envisager.
    Ben disons que la mise en place de ces techniques dans le cas présent n'est pas trop possible : comment simplifier la géométrie d'un cube ?

  8. #8
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 113
    Par défaut
    En gros j'appelle une méthode modéliser qui pour chaque clé d'une table de hashage va effecetuer la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
     
    public void modeliserEtagereHorizontal(int dir, float coordX, float coordY, float coordZ)
    		{
    			float x = coordX , y = coordY , z = coordZ ;
    			float yTemp = 0.0f;
    			// Pour gérer les emplacement de différentes tailles.
    			float xDiff = 0f, yDiff = 0f, zDiff = 0f;
    			float xDiff2 = 0f, yDiff2 = 0f, zDiff2;
    			float xBase = 0.0f, yBase = 0.0f, zBase = 0.0f;
    			float diff = 0f, diff2 = 0f;
     
    			//this.initialiserCoordonnes(coordX,coordY,coordZ);
    			this.mesh = (Mesh)this.meshListe[this.numeroEmplacementMeshListe];
    			Hashtable tableHashage;
    			tableHashage = this.tableDeHashage.TableHashageEtag;
    			Material mat = new Material();
     
    			TableDeHashage.CodificationEmplacement codifEmpl = new TableDeHashage.CodificationEmplacement();
    			TableDeHashage.Emplacement emplacement = new TableDeHashage.Emplacement();
    			int indiceColonne = 0,indiceNiveau = 0;
    			string etat = "";
     
     
    			codifEmpl.allee = codifEtagere.allee;
    			codifEmpl.zoneStockage = codifEtagere.zoneStockage;
     
     
    			/** Parcours de la zone de l'entrepot choisie **/			
    			#region Boucle de Modélisation
     
    			for (indiceColonne = 0; (indiceColonne < this.nombreColonne) ; indiceColonne++)
    			{
    				for (indiceNiveau = 0; (indiceNiveau < this.nombreNiveau) ; indiceNiveau++)
    				{									
    					codifEmpl.colonne = indiceColonne;
    					codifEmpl.niveau = indiceNiveau;
    					emplacement = this.recupererEmplacement(indiceColonne, indiceNiveau);
    					etat = emplacement.etat;
    					if(emplacement.dimension.longueur != 0)
    					{
    						if((indiceColonne == 0) && (indiceNiveau == 0))
    						{
    							xBase = emplacement.dimension.longueur * 100;
    							yBase = emplacement.dimension.largeur * 100;
    							zBase = emplacement.dimension.profondeur * 100;
     
    							// Permet de se posistionner sur le même niveau
    							yTemp = (1.0f - yBase)/2;
    							if(yTemp > 0)
    								y = yBase - yTemp;
    							else
    								y = yBase + yTemp;
    							this.initialiserCoordonnes(x,y,z);
    						}
     
    						xDiff = emplacement.dimension.longueur * 100;
    						yDiff = emplacement.dimension.largeur * 100;
    						zDiff = emplacement.dimension.profondeur * 100;
    						this.initialiserTailleEmplacement(xDiff,yDiff,zDiff);
     
    						switch(CritereMod)
    						{
    							case "etatEmplacement":
    								if(etat != "")
    								{			
    									if(siCritereCkecked(etat))
    									{
    										mat.Diffuse = this.recupererCouleurEtatEmplacement(etat);	// On récupere la couleur correspondant à l'état de l'emplacement
    										// Si en mode texture
    										if(textureElem)
    										{
    											// Si etat vide on passe en mode "arrete"
    											if(mat.Diffuse.Equals(matEmplVide.Diffuse))
    												DirectxManager.DeviceD3D.RenderState.FillMode = FillMode.WireFrame;
    											// Sinon en mode texture
    											else
    												DirectxManager.DeviceD3D.RenderState.FillMode = FillMode.Solid;
    										}		
    										else
    										{
    											DirectxManager.DeviceD3D.RenderState.FillMode = FillMode.Solid;
    										}
    									}
    									else
    									{
    										mat.Diffuse = Color.White;
    										DirectxManager.DeviceD3D.RenderState.FillMode = FillMode.Solid;
    									}
    									DirectxManager.DeviceD3D.RenderState.CullMode = Cull.CounterClockwise;
    								}
    								break;
     
    							case "emplacementReserves":
    								if(emplacement.reserve)
    									mat.Diffuse = Color.Black;
    								else
    									mat.Diffuse = Color.White;
    								break;
     
    							case "classeAffectation":
    								mat.Diffuse = emplacement.classeAffectation.couleurClasseAff;
    								break;
     
    							case "classeRotation":
    								mat.Diffuse = emplacement.classeRotation.couleurClasseRot;
    								break;
     
    							case "codeArticle":
    								if(emplacement.codeArticle.codeArt == fenetre.CodeArticleRecherche)
    									mat.Diffuse = Color.Red;
    								else
    									mat.Diffuse = Color.White;
    								break;
     
    							case "codeFamilleArticle":
    								mat.Diffuse = emplacement.codeFamilleArticle.couleurCodeFamilleArt;
    								break;
    						}
    						DirectxManager.DeviceD3D.Material = mat;
     
     
     
     
    						emplacement = this.recupererEmplacementSuivant(indiceColonne, indiceNiveau);
    						if(emplacement.dimension.longueur != 0)
    						{
    							xDiff2 = emplacement.dimension.longueur * 100;
    							yDiff2 = emplacement.dimension.largeur * 100;
    							zDiff2 = emplacement.dimension.profondeur * 100;
    						}
     
    						if(indiceNiveau == 0)
    						{
    							z += (xDiff - xBase)/2;
    							y += (yDiff - yBase)/2;													
    						}
    						Matrix WorldMatrix = Matrix.RotationYawPitchRoll(rotation.Y, rotation.X, rotation.Z);                        
    						WorldMatrix *= Matrix.Translation(x, y, z);                        
    						DirectxManager.DeviceD3D.Transform.World = WorldMatrix;
     
     
    						diff2 = yDiff - yDiff2;			// Calcul de la différence en longueur
    						diff2 = diff2 / 2;	
    						if(diff2 > 0)
    							y += this.largeurEmpl - diff2;
     
    						else 
    							if(diff2 < 0)
    							y += this.largeurEmpl - diff2;
    						else
    							y += this.largeurEmpl;
     
     
    						if(this.longueurEmpl != 0)
    						{
    							if(this.numeroEmplacementMeshListe < (this.nombreDEmplacements -1))
    							{
    								this.mesh.DrawSubset(0);
    								this.numeroEmplacementMeshListe++;
    								this.mesh = (Mesh)this.meshListe[this.numeroEmplacementMeshListe];
    							}
    						}
    					}
     
    				}
    				diff = xBase - xDiff;			// Calcul de la différence en longueur
    				diff = diff / 2;	
    				if(diff > 0)
    					x += (this.longueurEmpl *dir)+ diff;  // on décale en largeur		
    				else
    					x += (this.longueurEmpl *dir)- diff;  // on décale en largeur		
    				y = coordOrd;
    			}
    			#endregion
    		}

    Dedans je définis la position de chaque meshBox, la couleur et le mode d'affichage ... tout ça dans le but de former mon étagère sans que les emplacement se chevauchent ...

    Sinon comment faire du frustum culling ??
    Merci

  9. #9
    Membre éclairé
    Avatar de funkydata
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 515
    Par défaut
    Oula !!! Oui ca doit ramer en effet
    Ben déjà tu recréé à chaque itération tous les meshs
    Crée ta géometrie une bonne fois pour toute à l'initialisation aprés tu n'auras qu'a gérer les transformations et l'affichage de tes subsets dans la boucle de rendu... C'est sur que si tu pars de zéro à chaque fois aucunes techniques ne te fera rendre ta scène plus vite !

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 82
    Par défaut
    Citation Envoyé par funkydata
    Ben disons que la mise en place de ces techniques dans le cas présent n'est pas trop possible : comment simplifier la géométrie d'un cube ?
    Quelle idée aussi des cubes....

  11. #11
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 113
    Par défaut
    Quelles sont les lignes qui sont gourmandes en ressources dans ma fonction qui font ralentir et qui peuvent être mises ailleurs ?

    Pouvez vous m'aider à retirer ce qui ne devrait pas être dans mes "for" ??

    Existe-t-il un logiciel permettant de savoir ça pour les cartes ATI ?
    Merci.

Discussions similaires

  1. Optimiser le rendu d'une rich:subTable
    Par emaks dans le forum JSF
    Réponses: 0
    Dernier message: 12/01/2012, 17h22
  2. Question :optimisation du rendu Ogre3d
    Par Mytech dans le forum Ogre
    Réponses: 8
    Dernier message: 21/06/2008, 22h23
  3. [C++ DX9] Plusieurs problêmes (rendu de point et picking)
    Par caparenlive59 dans le forum DirectX
    Réponses: 5
    Dernier message: 13/07/2007, 16h20
  4. [FLASH MX 2004]Optimisation du rendu d'un fichier .swf
    Par yezhouden dans le forum Flash
    Réponses: 3
    Dernier message: 15/07/2004, 09h38
  5. [DirectDraw] Que faire pour optimiser le rendu ???
    Par mat.M dans le forum DirectX
    Réponses: 8
    Dernier message: 12/12/2003, 18h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo