2009-09-17 5 views
9

Stavo leggendo l'ultimo post sul blog di Larry Osterman su debugging a flickering problem in the Windows Vista/7 volume control e all'improvviso mi sono reso conto che non ricordo di aver mai visto uno sfarfallio di applicazioni sul mio laptop OS X. Anche le applicazioni che altrimenti sembrano scritte male evitano il problema del flicker nella mia esperienza. Senza che ciò si trasformi in un dibattito Apple vs Windows (per favore), perché le applicazioni OS X non sembrano avere lo stesso problema di sfarfallio?Perché OS X non ha gli stessi problemi di sfarfallio di Windows?

Ho difficoltà a credere che gli sviluppatori Apple siano semplicemente fantastici nella programmazione di GUI prive di sfarfallio, mentre i programmatori di Windows fanno schifo, quindi qual è la ragione? L'API OS X richiede che tutte le GUI implementino il doppio buffering? Mentre alcune app hanno il comportamento di ridimensionamento a doppio buffer leggermente pigro, molte non lo fanno, e comunque evitano lo sfarfallio. Il ridisegno del sistema operativo OS X è in qualche modo fondamentalmente diverso da Windows, evitando completamente il problema WM_ERASEBKGRND? O c'è qualche altra possibilità che non vedo?

Aggiornamento: Grazie per le vostre risposte. Vorrei poter selezionare entrambe le risposte di ken e cb160, perché sono entrambe utili.

risposta

9

Sia Windows Vista/7 che OSX utilizzano i motori di compositing per disegnare bitmap rasterizzati sullo schermo. Questi motori di compositing sono responsabili dell'elaborazione dell'output da tutte le finestre e del disegno dell'immagine finale dello schermo. Questo approccio di compositing è il modo in cui OSX è in grado di utilizzare l'effetto genie quando si riduce al minimo il dock e il modo in cui disegna i bordi traslucidi. Inoltre impediscono lo sfarfallio come se la bitmap per riempire un'area particolare dello schermo non fosse disponibile, userà l'immagine che ha già piuttosto che disegnare una regione vuota.

OSX ha un motore di compositing sin dalla sua prima spedizione.A quel tempo, molte persone erano un'appassionata pazza perché tutte le schede video in quel momento erano state ottimizzate per disegnare bitmap (cioè, i pulsanti e i bordi di Windows) e non le immagini composte. Nelle versioni successive di OSX, il compositing è stato spinto fuori dalla GPU (in Quartz Extreme) e così ha preso un carico significativo dalla CPU e reso possibili più effetti.

Poiché il compositore di Windows è stato aggiunto solo in Windows Vista e solo quando era disponibile una GPU e si disponeva della versione corretta del sistema operativo, non è così pervasivo come il Quartz Compositer in OSX. Poiché il compositore non viene sempre utilizzato in Windows, lo sfarfallio si verificherà quando una regione viene oscurata e l'applicazione responsabile del disegno non è in grado di ridisegnare l'area in modo abbastanza preciso.

16

Mac OS X ha double buffered windows.

Non devi fare nulla per farlo accadere. È dietro le quinte.

Si (quasi sempre) non si disegna esplicitamente su una finestra in Cocoa quando qualcosa cambia, si invalida una regione della finestra. Il framework discuterà successivamente la gerarchia delle viste e disegnerà le regioni sporche della finestra in un buffer secondario. Quindi scambia i buffer.

Puoi opzionalmente fare alcune promesse che consentono al framework di prendere scorciatoie durante il ridisegno, ma sono tutte attivabili. Sono interessate solo le visualizzazioni di esperti.

Se la sottoclasse di NSView implementa il metodo isOpaque per restituire SÌ, il framework non cancellerà mai nulla dietro la vista o non disegnerà alcuna vista sotto di esso.

Implementazione di preservesContentDuringLiveResize restituire SÌ offre alcune responsabilità aggiuntive, ma può migliorare le prestazioni durante il ridimensionamento della finestra.

10.6 aggiunto altre due nuove API di questo tipo, layerContentsRedrawPolicy e layerContentsPlacement.

Ultimo disegno personalizzato è meno comune che su Windows. La maggior parte delle visualizzazioni che vedete sono fornite da framework e non da sottoclassi. Mezzi forniti dal framework ottimizzati da apple.

1

Sì, è tutto con doppio buffering automatico. Ovviamente, se si utilizza il codice precedente da mac os 9 o il codice trasferito da windoze, significa che si è probabilmente con triplo buffering senza saperlo. Ehi, i cicli sono economici!