View Full Version : [C/C++ OpenGL] Problemi di prestazioni con Windows
Sto sviluppando un navigatore interattivo 3D multipiattaforma in C++ usando OpenGL, e sto riscontrando uno stranissimo problema. Sto sviluppando tale programma in ambiente Linux (Suse 10.2 - kernel 2.6.18.8 - compilatore g++ 4.1.2 - drivers scheda video ATI 8.36.5), e fin qui non ho avuto problemi prestazionali di sorta (il tutto va fluidissimo - addirittura con XGL/Beryl attivi - con tutte le textures e le luci di scena attivi).
Oggi ho deciso di compilare il programma su Windows XP (usando MS VisualStudio .NET 2003, ATI OmegaDrivers, libreria glut32.dll - da installare a parte, visto che non viene fornita dai produttori della scheda video né da MS - scaricata da qui:
http://www.xmission.com/~nate/glut.html
)
e francamente mi aspettavo delle prestazioni per lo meno identiche se non superiori, visto che tra l'altro con Windows XP non c'è desktop 3D...
E invece, il programma va parecchio a scatti, con la stessa scena (quindi stessi oggetti, textures e luci - insomma lo stesso file di scena in input).
Ho provato anche su un altro PC con i Catalyst "lisci" ma è lo stesso.
Ho individuato il "problema" nelle textures, visto non assegnando textures agli oggetti il tutto va fluido, ed anche se carico le textures, appena attivo la modalità wireframe va fluidissimo.
Provando, ho visto che caricando più di 2 textures (1 textures per oggetto, quindi due oggetti con textures e tutti gli altri solo con il materiale attivo) inizia a scattare.
Il codice compilato sotto Windows è identico a quello compilato e usato con Linux (visto che il programma è multipiattaforma appunto...).
Qualcuno ha qualche idea? Magari c'è qualcosa nel caricamento delle textures che a Win da fastidio e a Linux no? Oppure la dimensione delle textures? (Per quanto la texture più grossa per il momento è di 384Kb).
Ringrazio anticipatamente chiunque possa essermi di aiuto :)
chiedo in base alla mia ridottissima esperienza di OpenGL: le dimensioni delle textures sono potenze di due?
se poi non risolvi usando potenze di due per le dimensioni delle textures sarebbe interessante vedere con un profiler su quali chiamate GL si incarta il programma.
chiedo in base alla mia ridottissima esperienza di OpenGL: le dimensioni delle textures sono potenze di due?
Tutte tranne una (che è 200x200): poi ce n'è una da 512x256, ma è comunque sempre potenza di 2, anche se non è quadrata.
Ho provato anche a disattivare solo quella 512x256 (che è anche la più grossa) ma niente...
se poi non risolvi usando potenze di due per le dimensioni delle textures sarebbe interessante vedere con un profiler su quali chiamate GL si incarta il programma.
Eh ora ho sottomano KCachegrind (integrato in KDevelop) su Linux, ma lì non ho problemi (tra l'altro ho già fatto la profilatura su linux, e visti i risultati mi aspettavo buone prestazioni anche su Win).
E' un qualche problema di OpenGL su Win...
Mi consiglieresti un programma di profilatura per Win scaricabile (shareware/freeware)?
EDIT: cmq ora la rifaccio sotto linux, vediamo un po' cosa esce.
EDIT 2: nel frattempo ho controllato anche con valgrind per perdite di memoria/memory leaks e simili, ma mi dà 0 errori e nessun memory leak possibile.
Tutte tranne una (che è 200x200): poi ce n'è una da 512x256, ma è comunque sempre potenza di 2, anche se non è quadrata.
Ho provato anche a disattivare solo quella 512x256 (che è anche la più grossa) ma niente... e disattivando solo quella da 200x200?
Eh ora ho sottomano KCachegrind (integrato in KDevelop) su Linux, ma lì non ho problemi (tra l'altro ho già fatto la profilatura su linux, e visti i risultati mi aspettavo buone prestazioni anche su Win).
E' un qualche problema di OpenGL su Win...
Mi consiglieresti un programma di profilatura per Win scaricabile (shareware/freeware)? non ne conosco ^___________________^
non ho mai usato profilers perché non ho mai avuto la necessità di creare programmi in cui la performance fosse importante
EDIT 2: nel frattempo ho controllato anche con valgrind per perdite di memoria/memory leaks e simili, ma mi dà 0 errori e nessun memory leak possibile. elamaronna :| complimenti :D
programmare senza provocare almeno uno o due leak non è cosa da poco anche per chi ha occhio per i leak: nonostante i miei sforzi certe volte ne faccio pure io.
elamaronna :| complimenti :D
programmare senza provocare almeno uno o due leak non è cosa da poco anche per chi ha occhio per i leak: nonostante i miei sforzi certe volte ne faccio pure io.
Grazie :D
Devo dire che dopo 1 mese di lavoro a tempo pieno, penso di aver sviluppato una buona infrastuttura di classi C++ per gestire le funzioni OpenGL, quindi il peggio che posso fare è dimenticare di fare una delete su un oggetto creato nel main/nel parser del file di scena (perchè i distruttori delle classi che ho fatto sembrano andare bene), Comunque non ho ancora finito..... Devo prima di tutto implementare il bump mapping sui solidi.
Intanto ho profilato con KCachegrind e, come prevedibile, l'istruzione più "fetchata" è gluBuild2DMipmaps. E' un problema di mipmapping su Win, ma non cpaisco perchè la differenza è così sostanziale rispetto a Linux (che tra l'altro, non gode di ottimi drivers ATI, anche se a quanto pare ora che si sono "fusi" con AMD sono migliorati - e devo dire che ci credeo a questo punto...)
e disattivando solo quella da 200x200?
Ecco una prova che devo fare.
Ora sono su Linux come al solito, intanto raccolgo suggerimenti e poi riavvio e li provo tutti :)
Aggiornamento: In effetti, disattivando l'unica texture non potenza di 2, e sosituendola con una potenza di 2, le prestazioni su WIndows sono notevolmente migliorate :D
Poi ho pure letto meglio la documentazione di glTexImage2D:
width Specifies the width of the texture image.
Must be 2n+2(border) for some integer n. All
implementations support texture images that
are at least 64 texels wide.
height Specifies the height of the texture image.
Must be 2m+2(border) for some integer m. All
implementations support texture images that
are at least 64 texels high.
:muro:
Però sotto linux evidentemente veniva fatto una "autoaggiustamento"... Vabbè, a questo punto forzo questo aggiustamento via codice (costringere ad usare una texture 2^n sarebbe un po' riduttivo, nel caso nel file di scena è specificata una texture non 2^n la taglio).
Comunque, le prestazioni rimangono più elevate sotto Linux (per quanto, ora, quelle sotto Win sono più che accettabili, anzi ora calcolo gli fps e vediamo).
Grazie per la dritta :) Altre idee per migliorare ulteriormente?
Aggiornamento: In effetti, disattivando l'unica texture non potenza di 2, e sosituendola con una potenza di 2, le prestazioni su WIndows sono notevolmente migliorate :D
Poi ho pure letto meglio la documentazione di glTexImage2D:
width Specifies the width of the texture image.
Must be 2n+2(border) for some integer n. All
implementations support texture images that
are at least 64 texels wide.
height Specifies the height of the texture image.
Must be 2m+2(border) for some integer m. All
implementations support texture images that
are at least 64 texels high.
:muro:
Però sotto linux evidentemente veniva fatto una "autoaggiustamento"... Vabbè, a questo punto forzo questo aggiustamento via codice (costringere ad usare una texture 2^n sarebbe un po' riduttivo, nel caso nel file di scena è specificata una texture non 2^n la taglio).
Comunque, le prestazioni rimangono più elevate sotto Linux (per quanto, ora, quelle sotto Win sono più che accettabili, anzi ora calcolo gli fps e vediamo).
Grazie per la dritta :) Altre idee per migliorare ulteriormente?
informati un attimo... ma credo un anno fà dall'avvento di xp pare che proprio su sistemi microsoft le opengl girino al 50% su detti sistemi... io ne avevo già postato qualcosa all'epoca in particolare, su windows le opengl > ver 1.1 girano al 50% delle proprie performance in mode fullscreen mentre in "Finestra al 100%"!!
Informati... perchè lasciai poi questo argomento in quanto uso directx.
... chissà se sei incappato in questa "gasba" proprio tu!!
ciao fidel
Intanto ho implementato un semplice calcolo degli fps: con la stessa scena,
Linux media di 69 fps, Win media di 36 fps.
Su win poi, ho provato su un oggetto a sostiture una texture di 350kb con ua delle stesse dimensioni widthxheight ma di 180 kb, e i fps sono balzati ad una media di 50................ Ancora meno di Linux, ma mi va già bene.
A questo punto, è chiaro che sotto Win ci sono delle "limitazioni" più stringenti sull'uso delle textures. Se qualcuno può illuminarmi...
informati un attimo... ma credo un anno fà dall'avvento di xp pare che proprio su sistemi microsoft le opengl girino al 50% su detti sistemi... io ne avevo già postato qualcosa all'epoca in particolare, su windows le opengl > ver 1.1 girano al 50% delle proprie performance in mode fullscreen mentre in "Finestra al 100%"!!
Informati... perchè lasciai poi questo argomento in quanto uso directx.
... chissà se sei incappato in questa "gasba" proprio tu!!
ciao fidel
Il bello è che sto lavorando in finestra: nel file di scena viene specificata la dimensione iniziale della finestra desiderata, che ovviamente può poi essere ridimensionata (l'aspect rimane costante). Magari poi provo a settare il fullscreen via codice e vediamo, ma per il momento la proprietà fullscreen non è prevista (più comodo usare l'app in finestra, non essendo un videogioco).
Tra l'altro, ho provato ad usare le call lists e, prevedibilmente, le prestazioni aumentano notevolmente (nell'ordine dei 20 fps, anche di più in base al numero di oggetti sulla scena), peccato che non posso usarle perchè gli oggetti possono essere modificati dall'utente a runtime... (cosa ad esempio non prevista con i videogiochi OpenGL, in cui se ne fa un uso massiccio).
Caz ora inizio a capire perchè su Win quasi tutti programmano in directx: perchè il porting OpenGL per Win fa schifo!!!!!!!! :muro:
Esiste qualche ottimizzazione per le textures, oppure sotto Win sono costretto ad usare textures di dimensione massima 256x256 (a 24 bit RGB si intende) ???
(Forse scalare a mano l'immagine per il mipmap invece di usare gluBuild2DMipmaps?)
Caz ora inizio a capire perchè su Win quasi tutti programmano in directx: perchè il porting OpenGL per Win fa schifo!!!!!!!! :muro:
Esiste qualche ottimizzazione per le textures, oppure sotto Win sono costretto ad usare textures di dimensione massima 256x256 (a 24 bit RGB si intende) ???
(Forse scalare a mano l'immagine per il mipmap invece di usare gluBuild2DMipmaps?)
Hai scritto che in wireframe oppure senza texture ti và tutt ok.
Forse dovresti dare altri dettagli:
genericamente i problemi possono essere:
- Controlla nel loop di rendering se è tutto ok nel code. Non sono bravo con le opengl ma credo che sia simile a directx grosso modo.
- Sotto windows la scheda grafica potrebbe aver bisogno di aggiornamento dei driver e cmq non tutte le schede potrebbero supportare ogl nelle ultime versioni. Voglio dire che forse hai problemi con la scheda grafica con le opengl.
- Non sò di cosa si tratta ma la butto lì: stai usando code per pixel shader 2.0/3.0 ma non è supportato dalla scheda...?
secondo me 65% controlla il loop di rendering 35% i driver della scheda grafica
Hai scritto che in wireframe oppure senza texture ti và tutt ok.
Forse dovresti dare altri dettagli:
genericamente i problemi possono essere:
- Controlla nel loop di rendering se è tutto ok nel code. Non sono bravo con le opengl ma credo che sia simile a directx grosso modo.
- Sotto windows la scheda grafica potrebbe aver bisogno di aggiornamento dei driver e cmq non tutte le schede potrebbero supportare ogl nelle ultime versioni. Voglio dire che forse hai problemi con la scheda grafica con le opengl.
- Non sò di cosa si tratta ma la butto lì: stai usando code per pixel shader 2.0/3.0 ma non è supportato dalla scheda...?
secondo me 65% controlla il loop di rendering 35% i driver della scheda grafica
Ho risolto!!! :D :D
La cosa era molto più banale, anche se non mi spiego perchè sotto linux l'impatto sulle performance non era evidente come su Win (però lo spreco c'era, me ne sono accorto con il profiler, come detto prima).
Visto che, usando il profiler su Linux, l'istruzione più fetchata (65% del totale) era gluBuild2DMipmaps(...), ho visto che il punto critico era quello (molto critico per Win, evidentemente l'implementazione è peggiore da questo punto di vista), allora ho pensato di usare i texture objects (non so perchè non l'ho fatto prima, forse per la fretta di avere risultati :muro: ) : in questo modo, le textures (e le relative mipmaps e tutti i parametri) vengono caricate (e soprattutto le mipmaps calcolate) una sola volta per ogni oggetto presente sulla scena.
Risultato: fetch di gluBuild2DMipmaps(...) crollato al 12% e fps in media a 120 (senza call lists) su tutti e due i sistemi :D
Grazie a tutti per le dritte :)
Ah una domanda stupida: ma come faccio su Windows a sapere la versione di OpenGL installata (visto che viene fornita con i drivers della scheda video)?
Ah una domanda stupida: ma come faccio su Windows a sapere la versione di OpenGL installata (visto che viene fornita con i drivers della scheda video)?
prova a lanciare il config della scheda video io per esempio ho nvidia ti dovrebbe dire la ver delle ogl installate
prova a lanciare il config della scheda video io per esempio ho nvidia ti dovrebbe dire la ver delle ogl installate
Con ati niente da fare. Per lo meno, io non ho il Catalist Control Center intallato, ma quello classico (il CCC è pesantissimo...).
Ho visto nelle DLL, ma la versione è della dll, non di OGL.
Ho spulciato anche con ATI Tray tools ma ancora nulla. Magari spuclio meglio con questo strumento.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.