Accueil > Forum > > > > Optimiser la vitesse d affichage
Optimiser la vitesse d affichage
vendredi 17 novembre 2006 à 11:43:11 |
Optimiser la vitesse d affichage

jojomillenium
|
Bonjour,
J'ai une fonction de dessin que j appelle dans mon DrawGLScene(), elle lis un tableau de 11 elements d'une classe layer, et dans chaque element jâi un tableau de quads corespondant au polygon que je veux dessiner sur chacune des couches. J'ai des parametres sur ces couches comme "visible" (que je peux changer en live sur mon programme pour chaque layer independamenet)
seulement j'ai un des truc que je dois dessiner qui contient plus de 300 000 polygons! et ca saccade pas mal lorsque je veut le deplacer ou tourner avec ma souris! J'utilise le glutess car certain de ces polygons sont concaves! L'element "bottom" est un tableau des points des sommet de mes polygons comme suit : {x1,y1,x2,y2,x3,y3,..}
bref, ma question est simple, y a t il un moyen d'optimiser au maximum ceci pour que ca s affiche plus vite!?
avant d avoir mes polygon concave, j'utilisais glArray, mais maintenant que j'ai le gluTess que puis je faire? Est ce possible de faire 11 gllist ( par exemple glGenList(11) ) et dans chaque list y mettre tous les polygon correspondant? dans ce cas il ne me restera dans mon DrawQuads() qu'un boucle de test sur la visibilité de la couche pour la dessiner ou pas! Ca rendrai le "dessinage" plus rapide a votre avis?
Merci pour votre aide!
void DrawQuads() { nombrequads=0;
if(SaveLayers) { for(int i=0; i<11; i++) { if(LLayer[i].visible==true) { for(int q=0; q<LLayer[i].num_quads; q++) {
glColor4f(LLayer[i].color.r,LLayer[i].color.g,LLayer[i].color.b, LLayer[i].color.a); int num_pts = LLayer[i].quad[q].num_pts; GLdouble pt_bottom[250][3]; for(int p=0; p<num_pts; p++) { pt_bottom[p][0]=LLayer[i].quad[q].bottom[p*2]; pt_bottom[p][1]=LLayer[i].zstart; pt_bottom[p][2]=LLayer[i].quad[q].bottom[p*2+1]; }
// ON DESSINE LA FACE DU BAS
GLdouble pt_top[250][3]; for(p=0; p<num_pts; p++) { pt_top[p][0]=LLayer[i].quad[q].bottom[p*2]; pt_top[p][1]=LLayer[i].zstart + LLayer[i].h; pt_top[p][2]=LLayer[i].quad[q].bottom[p*2+1]; }
GLUtesselator *tobj; tobj = gluNewTess(); gluTessCallback(tobj, GLU_TESS_VERTEX, (GLvoid (CALLBACK*) ()) &glVertex3dv); gluTessCallback(tobj, GLU_TESS_BEGIN, (GLvoid (CALLBACK*) ()) &beginCallback); gluTessCallback(tobj, GLU_TESS_END, (GLvoid (CALLBACK*) ()) &endCallback); gluTessCallback(tobj, GLU_TESS_ERROR, (GLvoid (CALLBACK*) ()) &errorCallback); glShadeModel(GL_FLAT); gluTessBeginPolygon(tobj, NULL); gluTessBeginContour(tobj); for(int u=0; u<num_pts; u++) gluTessVertex(tobj, pt_bottom[u], pt_bottom[u]); gluTessEndContour(tobj); gluTessEndPolygon(tobj); gluDeleteTess(tobj); tobj = gluNewTess(); gluTessCallback(tobj, GLU_TESS_VERTEX, (GLvoid (CALLBACK*) ()) &glVertex3dv); gluTessCallback(tobj, GLU_TESS_BEGIN, (GLvoid (CALLBACK*) ()) &beginCallback); gluTessCallback(tobj, GLU_TESS_END, (GLvoid (CALLBACK*) ()) &endCallback); gluTessCallback(tobj, GLU_TESS_ERROR, (GLvoid (CALLBACK*) ()) &errorCallback); glShadeModel(GL_FLAT); gluTessBeginPolygon(tobj, NULL); gluTessBeginContour(tobj); for(u=0; u<num_pts; u++) gluTessVertex(tobj, pt_top[u], pt_top[u]); gluTessEndContour(tobj); gluTessEndPolygon(tobj); gluDeleteTess(tobj);
for(int ee=0; ee<num_pts;ee++) { //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); int ee2 = ee+1; if(ee2 == num_pts) ee2 = 0; glColor4f(LLayer[i].color.r,LLayer[i].color.g,LLayer[i].color.b, LLayer[i].color.a); glBegin(GL_POLYGON); glVertex3f(pt_bottom[ee][0],pt_bottom[ee][1],pt_bottom[ee][2]); glVertex3f(pt_bottom[ee2][0],pt_bottom[ee2][1],pt_bottom[ee2][2]); glVertex3f(pt_top[ee2][0],pt_top[ee2][1],pt_top[ee2][2]); glVertex3f(pt_top[ee][0],pt_top[ee][1],pt_top[ee][2]); glEnd(); // ON DESSINE TOUTES LES ARRETES
glColor4f(0.0,0.0,0.0, 1.0); glBegin(GL_LINES);
glVertex3f(pt_bottom[ee][0],pt_bottom[ee][1],pt_bottom[ee][2]); glVertex3f(pt_bottom[ee2][0],pt_bottom[ee2][1],pt_bottom[ee2][2]);
glVertex3f(pt_bottom[ee2][0],pt_bottom[ee2][1],pt_bottom[ee2][2]); glVertex3f(pt_top[ee2][0],pt_top[ee2][1],pt_top[ee2][2]);
glVertex3f(pt_top[ee2][0],pt_top[ee2][1],pt_top[ee2][2]); glVertex3f(pt_top[ee][0],pt_top[ee][1],pt_top[ee][2]);
glVertex3f(pt_top[ee][0],pt_top[ee][1],pt_top[ee][2]); glVertex3f(pt_bottom[ee][0],pt_bottom[ee][1],pt_bottom[ee][2]);
glEnd(); } } } } } }
|
|
vendredi 17 novembre 2006 à 13:19:33 |
Re : Optimiser la vitesse d affichage

luhtor
|
Le plus efficace serait d'éviter les polygones concaves. Mais tu es
obligés d'appeler glu a chaque affichage, tu peux le faire une seul
fois ?
Pour le rendu, INTERDIT d'utiliser glBegin/End. Tu utilises une list ou un vbo, et ton rendu sera 100x plus rapide.
|
|
vendredi 17 novembre 2006 à 13:50:07 |
Re : Optimiser la vitesse d affichage

jojomillenium
|
je ne peux malheureusement pas faire autrement pour les polygones concaves! Par contre j'ai pas tout compris a ce que tu ma dis apres : a propos de l appel du glu a chaque affichage, et concernant le rendu "INTERDIT d'utiliser glBegin/End" ? comment utiliser une list ou vbo (c'est quoi ca? ) dans mon cas?
merci beaucoup pour ton aide!
|
|
vendredi 17 novembre 2006 à 15:33:24 |
Re : Optimiser la vitesse d affichage

Arnaud16022
|
l'utilisation de glBegin et glEnd est une facilité offerte par openGL ( et pas par DirectX, d'ailleurs ) pour afficher des polys de manière simple, mais lente. Les listes marchent bien. les vbos encore mieux, mais c'est récent et donc pas forcément supporté par toutes les cartes. _______________________ Omnia vincit labor improbus
|
|
vendredi 17 novembre 2006 à 15:51:31 |
Re : Optimiser la vitesse d affichage

jojomillenium
|
donc j'ai meilleur temps d'initialiser mes listes une fois et ensuite de les appeler dans mon DrawQuads()? genre comme ca: GLuint startList;
startList = glGenLists(10);
for(int i=0; i<11; i++) {
glNewList(startList + i, GL_COMPILE); for(int q=0; q<LLayer[i].num_quads; q++) {
glColor4f(LLayer[i].color.r,LLayer[i].color.g,LLayer[i].color.b, LLayer[i].color.a); int num_pts = LLayer[i].quad[q].num_pts; GLdouble pt_bottom[250][3]; for(int p=0; p<num_pts; p++) { pt_bottom[p][0]=LLayer[i].quad[q].bottom[p*2]; pt_bottom[p][1]=LLayer[i].zstart; pt_bottom[p][2]=LLayer[i].quad[q].bottom[p*2+1]; } // ON DESSINE LA FACE DU BAS GLdouble pt_top[250][3]; for(p=0; p<num_pts; p++) { pt_top[p][0]=LLayer[i].quad[q].bottom[p*2]; pt_top[p][1]=LLayer[i].zstart + LLayer[i].h; pt_top[p][2]=LLayer[i].quad[q].bottom[p*2+1]; }
GLUtesselator *tobj; tobj = gluNewTess(); gluTessCallback(tobj, GLU_TESS_VERTEX, (GLvoid (CALLBACK*) ()) &glVertex3dv); gluTessCallback(tobj, GLU_TESS_BEGIN, (GLvoid (CALLBACK*) ()) &beginCallback); gluTessCallback(tobj, GLU_TESS_END, (GLvoid (CALLBACK*) ()) &endCallback); gluTessCallback(tobj, GLU_TESS_ERROR, (GLvoid (CALLBACK*) ()) &errorCallback); glShadeModel(GL_FLAT); gluTessBeginPolygon(tobj, NULL); gluTessBeginContour(tobj); for(int u=0; u<num_pts; u++) gluTessVertex(tobj, pt_bottom[u], pt_bottom[u]); gluTessEndContour(tobj); gluTessEndPolygon(tobj); gluDeleteTess(tobj); tobj = gluNewTess(); gluTessCallback(tobj, GLU_TESS_VERTEX, (GLvoid (CALLBACK*) ()) &glVertex3dv); gluTessCallback(tobj, GLU_TESS_BEGIN, (GLvoid (CALLBACK*) ()) &beginCallback); gluTessCallback(tobj, GLU_TESS_END, (GLvoid (CALLBACK*) ()) &endCallback); gluTessCallback(tobj, GLU_TESS_ERROR, (GLvoid (CALLBACK*) ()) &errorCallback); glShadeModel(GL_FLAT); gluTessBeginPolygon(tobj, NULL); gluTessBeginContour(tobj); for(u=0; u<num_pts; u++) gluTessVertex(tobj, pt_top[u], pt_top[u]); gluTessEndContour(tobj); gluTessEndPolygon(tobj); gluDeleteTess(tobj);
for(int ee=0; ee<num_pts;ee++) { //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); int ee2 = ee+1; if(ee2 == num_pts) ee2 = 0; glColor4f(LLayer[i].color.r,LLayer[i].color.g,LLayer[i].color.b, LLayer[i].color.a); glBegin(GL_POLYGON); glVertex3f(pt_bottom[ee][0],pt_bottom[ee][1],pt_bottom[ee][2]); glVertex3f(pt_bottom[ee2][0],pt_bottom[ee2][1],pt_bottom[ee2][2]); glVertex3f(pt_top[ee2][0],pt_top[ee2][1],pt_top[ee2][2]); glVertex3f(pt_top[ee][0],pt_top[ee][1],pt_top[ee][2]); glEnd(); // ON DESSINE TOUTES LES ARRETES
glColor4f(0.0,0.0,0.0, 1.0); glBegin(GL_LINES);
glVertex3f(pt_bottom[ee][0],pt_bottom[ee][1],pt_bottom[ee][2]); glVertex3f(pt_bottom[ee2][0],pt_bottom[ee2][1],pt_bottom[ee2][2]);
glVertex3f(pt_bottom[ee2][0],pt_bottom[ee2][1],pt_bottom[ee2][2]); glVertex3f(pt_top[ee2][0],pt_top[ee2][1],pt_top[ee2][2]);
glVertex3f(pt_top[ee2][0],pt_top[ee2][1],pt_top[ee2][2]); glVertex3f(pt_top[ee][0],pt_top[ee][1],pt_top[ee][2]);
glVertex3f(pt_top[ee][0],pt_top[ee][1],pt_top[ee][2]); glVertex3f(pt_bottom[ee][0],pt_bottom[ee][1],pt_bottom[ee][2]);
glEnd(); } } glEndList(); }
Et apres dans mon DrawQuads()
je fais :
void DrawQuads() { nombrequads=0;
if(SaveLayers) { for(int i=0; i<11; i++) { if(LLayer[i].visible) glCallList(startList + i); }
}
}
Ca marcherai ca? J'oublie quelque chose?
|
|
vendredi 17 novembre 2006 à 19:19:38 |
Re : Optimiser la vitesse d affichage

Arnaud16022
|
heuu je me trompe ou ça se fait pas comme ça les listes ? théoriquement tu remplis un buffer avec toutes des données, et tu passes ce buffer à oGL. Enfin je peux me tromper, je n'ai plus fait ça depuis longtemps . _______________________ Omnia vincit labor improbus
|
|
vendredi 17 novembre 2006 à 19:24:14 |
Re : Optimiser la vitesse d affichage

luhtor
|
Il me semble que tu peux les faire comme ca. J'utilise jamais les
listes, mais tu auras les perfs maximales avec. Au lieu de faire 10
listes, tu aurais pu en faire une seule.
Pk tu demandes si ca marche ? test le d'abord.
|
|
vendredi 17 novembre 2006 à 20:28:58 |
Re : Optimiser la vitesse d affichage

jojomillenium
|
Merci, j'etait en train de regler un autre probleme en meme temps :P Je vais essayer maintenant ... je vous donnerai des nouvelles je pense demain pour dire si ca marche ou pas! Je doit faire 10 listes, car je dois pouvoir ne pas en afficher une ou meme plusieur d entre elle! Pour ceux que ca interesse (Arnaud16022 par exemple), [ Lien ] c'est pour la tesselation de polygone concave... et justement aussi la gestion des listes ogl des listes! Donc la facon que j'ai montré avant est normalement correcte... Plus d'info demain apres mes tests! Merci ++ Jojo
|
|
vendredi 17 novembre 2006 à 21:17:15 |
Re : Optimiser la vitesse d affichage

jojomillenium
|
Hello! Alors bah voila, ca marche! Par contre ca met un de ces temps a charger!!! une idée de comment accélérer ca? Cependant j'aurai deux questions a vous posez, la premiere, mon programme utilise beaucoup de ressource, vous avez des astuces ou des idées de ou je dois regarder pour essyer de faire en sorte que mon logiciel face moins rammer mon ordi? deuxieme question en OpenGL cette fois... De loin mes differentes couches se "supperposent" et les couleurs du dessous se melent au couleur du dessus... vous allez comprendre en regardant ces images ci dessous: la premiere est la vu de loin, et la deuxieme la vu de pret... vous remarquerez que le vert est en dessous du blanc, qui est lui meme en dessous du rouge, qui est en dessous du noir, pis en qui lui est en dessous du bleu... donc par exemple en bas, on devrai pas voir le vert dans les rectangle rouge! partout ou y a du blanc, on est pas sensé voir de vert par dessus! bref, une idée de ou ca peu venir! vu de loin:  2eme vu de loin ou l on voit bien que le blanc "deborde" sur les couche qui sont par dessus!  vu de pret :  Merci pour votre aide! Jojo
|
|
vendredi 17 novembre 2006 à 21:25:38 |
Re : Optimiser la vitesse d affichage

jojomillenium
|
aille en faite un un tit probleme avec les glLists... ca marche mais en fait comme vous le voyez sur mes images j'ai une fenetre de controles des couches, qui me permet de modifier la couleur et la transparence meme la hauteur de mes couches ... ca marchais tres bien avant... bah maintenant, si j'ai initialisé tous mes polygons dans une list et que je dessiner en appelant cette liste, je ne peux plus agir dessus?!? non? Vous connaissez une solutions a ce probleme?
merci encore
|
|
Cette discussion est classée dans : top, pt, bottom, tobj, ee
Répondre à ce message
Sujets en rapport avec ce message
VBOs dynamic... [ par jojomillenium ]
Bonjour,Je dois pouvoir dessiner plus de 300 000 polygons dont la pluspart son concave... J'utilise donc les gluTess, j'utilise actuellement les glLis
driver souris sous windows xp [ par frogeraie ]
bonjour!je voudrais reduire de facon important (facteur 100) le rapport entre le deplacement de la souris et celui du curseur. j'ai essaye ceci (avec
objet dans une fonction [ par jfrag ]
Bonjour,voila j'ai un gros problemeen fait j'ai un objet declarer dans une fonction le probleme est aue je veus recuperer une fonction de cette objet
Le suivi des messages c'est pas le top [ par The_Guardian ]
Je préfèrais autre evrsion, ça a beau peter à l'iris tout ce rénovation des murs de vos sites, mais sur le plan de la construction ben ca reste très l
Trier une liste chainée [ par ango973 ]
Bonjour,J'ai un probleme avec une fonction qui doit me trier une liste chainée selon le nom mais apres le passage dans ma fonction la liste reste iden
Couleur d'un Pixel et dessin [ par wxccxw ]
Bonjour,je suis en train de faire un colorimètre numérique, et lorsque que je recupere la couleur des pixels a la place de mon pointeur j'obtien toujo
classe en c++ [ par katdeath ]
bonsoir , je dois faire un exercice qui est le suivant : ecrivez une classe pile_entier permettant de gérer une pile d'entiers conservés dans un table
fgets et sscanf des informations + gestion des espaces [ par Yunchi ]
Bonjour,Voilà mon prblème :J'ai un fichier texte que je lis ligne par lignepar exemple j'ai une ligne qui fait : "aa bb cc dd ee ff gg"aa bb cc et dd
Probléme d'algorithme d'ordonnacement [ par salero ]
Bonjour, bon je travaille sur un mini projet qui consiste a gérer des processu par des algorithme d'ordonnacement ( fcfs,sjf....) et pour cela je cre
Intergiciels et C++.... [ par karistote ]
Bonjour !Je ne suis que débutant en C++, bien qu'ayant programmé un peu de C et beaucoup de PHP :pJe me tourne aujourd'hui vers ce language avec pour
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|