Domanda

Sto lavorando su un / applicazione Qt-based MacOS X audio di misurazione, che contiene i widget audio-metering (potenzialmente un sacco di loro), ognuno dei quali dovrebbe essere aggiornato ogni 50 ms (vale a dire a 20 Hz).

Il programma funziona, ma quando un sacco di metri vengono aggiornate in una sola volta, utilizza fino un sacco di tempo di CPU e può impantanare (spinny-color-wheel, oh no!).

La cosa strana è questa: In origine questa applicazione sarebbe basta chiamare update () sul widget di metri ogni volta che il valore del contatore è cambiato, e quindi l'intero metri widget di sarebbe essere ridisegnato ogni 50ms. Tuttavia, ho pensato di essere intelligente e calcola solo l'area del contatore che deve effettivamente essere ridisegnata, e ridisegnare solo quella porzione del widget (es aggiornamento (x, y, w, h), dove y ed h sono calcolato sulla base dei vecchi e nuovi valori del contatore). Tuttavia, quando ho implementato che, in realtà ha fatto l'utilizzo della CPU quattro volte superiore (!) ... anche se l'applicazione è stata disegnando 50% in meno pixel al secondo.

Qualcuno può spiegare perché questa ottimizzazione in realtà si rivela essere un pessimization? Ho postato un esempio di applicazione banale che dimostra l'effetto, qui:

http://www.lcscanada.com/jaf/meter_test.zip

Quando compilo (qmake; fare) l'applicazione di cui sopra e correre in questo modo:

$ ./meter.app/Contents/MacOS/meter 72 
Meter:  Using numMeters=72 (partial updates ENABLED)

... in alto mostra il processo che utilizza circa il 50% della CPU.

Quando ho disattivare la logica intelligente-parziali-aggiornamenti, eseguendo in questo modo:

$ ./meter.app/Contents/MacOS/meter 72 disable_partial_updates
Meter:  Using numMeters=72 (partial updates DISABLED)

... in alto mostra il processo utilizzando solo ~ 12% della CPU. Eh? Non dovrebbe questo caso prendere più CPU, non di meno?

Ho provato profiling l'applicazione utilizzando squalo, ma i risultati non significava molto per me. FWIW, sto con Snow Leopard su un 8-core Xeon Mac Pro.

È stato utile?

Soluzione

disegno GPU è un molto più veloce poi lasciare caclulate CPU da parte di ridisegnare (almeno per OpenGL questo prende in considerazione, ho ottenuto il superbible Libro OpenGL, e si afferma che OpenGL è costruire per ridisegnare non, per disegnare Delta come questo è potenzialmente un molto più lavoro da fare). Anche se si utilizza software di rendering, le librerie sono altamente optimzed a fare il loro lavoro correttamente e veloce . Quindi, solo ridisegno è lo stato dell'arte.

Altri suggerimenti

FWIW top sulla mia macchina Linux mostra ~ 10-11% senza aggiornamenti parziali e 12% utilizzando gli aggiornamenti parziali. Ho dovuto chiedere a 400 metri per ottenere che l'utilizzo della CPU però.

Forse è solo che il sovraccarico di Qt la creazione di una regione di vernice in realtà supera di gran lunga il tempo di vernice? Dopo tutto la tua pittura è molto semplice, è solo due riempimenti rettangolari.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top