2009-09-17 11 views
9

Ich las Larry Osterman's neuesten Blog-Post über debugging a flickering problem in the Windows Vista/7 volume control, und ich erkannte plötzlich, dass ich mich nicht erinnern kann, jemals ein Anwendungsflackern auf meinem OS X Laptop gesehen zu haben. Selbst Anwendungen, die sonst schlecht geschrieben zu sein scheinen, vermeiden das Flimmerproblem meiner Erfahrung nach. Ohne dass dies in eine Apple vs Windows Debatte umschlägt (bitte), Warum scheinen OS X Anwendungen nicht das gleiche flackernde Problem zu haben?Warum hat OS X nicht dieselben Flimmerprobleme wie Windows?

ich Schwierigkeiten haben, zu glauben, dass Apple-Entwickler bei der Programmierung flimmerfreie GUIs einfach erstaunlich sind, während Windows-Programmierer saugen, so was ist der Grund? Erfordert die OS X-API, dass alle GUIs Double-Buffering implementieren? Während einige Apps das etwas träge doppelt gepufferte Größenänderungsverhalten haben, tun dies viele nicht und sie vermeiden immer noch das Flimmern. Ist der OS X-Repaint-Fluss irgendwie grundlegend anders als bei Windows und vermeidet das WM_ERASEBKGRND Problem vollständig? Oder gibt es eine andere Möglichkeit, die ich nicht sehe?

Update: Vielen Dank für Ihre Antworten. Ich wünschte, ich könnte die Antworten von ken und cb160 auswählen, weil sie beide hilfreich sind.

Antwort

9

Sowohl Windows Vista/7 und OSX Verwendung Compositing Motoren gerasterten Bitmaps auf dem Bildschirm zu zeichnen. Diese Compositing-Engines sind verantwortlich für die Verarbeitung der Ausgabe von allen Fenstern und das Zeichnen des endgültigen Bildschirmbildes. Mit diesem Compositing-Ansatz kann OSX den Genie-Effekt beim Minimieren des Docks und beim Zeichnen der transluzenten Ränder durch Aero nutzen. Sie verhindern außerdem das Flackern, als ob die Bitmap, die einen bestimmten Bereich des Bildschirms ausfüllt, nicht verfügbar ist. Sie verwendet das bereits vorhandene Bild, anstatt eine leere Region zu zeichnen.

OSX hat seit seiner Auslieferung eine Compositing-Engine.Zu der Zeit, viele Leute, obwohl dies eine verrückte appraoch wie alle Grafikkarten versandten zu der Zeit waren optimiert, um Bitmaps (dh Windows Tasten und Grenzen) zu zeichnen und nicht zusammengesetzte Bilder. In späteren Versionen von OSX wurde das Compositing auf die GPU übertragen (in Quartz Extreme) und somit die CPU erheblich entlastet und weitere Effekte möglich gemacht.

Da der Windows-Compositeer nur in Windows Vista hinzugefügt wurde und nur dann, wenn eine GPU verfügbar war und Sie die richtige Version des Betriebssystems hatten, ist es nicht so pervasiv wie der Quartz Composite in OSX. Da der Compositor in Windows nicht immer verwendet wird, tritt ein Flimmern auf, wenn eine Region ausgeblendet wird und die für das Zeichnen zuständige Anwendung die Region nicht ausreichend neu zeichnen kann.

16

Mac OS X hat double buffered windows.

Sie müssen nichts tun, damit es passiert. Es ist hinter den Kulissen.

Sie (fast immer) tun, um ein Fenster in Cocoa nicht explizit ziehen, wenn sich etwas ändert, können Sie einen Bereich des Fensters ungültig machen. Das Framework wird später die Hierarchie der Ansichten absenken und die schmutzigen Bereiche des Fensters in einen sekundären Puffer zeichnen. Dann tauscht es die Puffer.

Optional können Sie einige Versprechungen machen, die den Rahmen erlauben, Abkürzungen zu nehmen, wenn neu zu zeichnen, aber sie sind alle Opt-in. Nur schlaue Ansichten sind betroffen.

Wenn Ihre Unterklasse von NSView die isOpaque Methode implementiert JA zurück, dann wird der Rahmen nicht klar etwas hinter Ihrer Sicht oder eine der Ansichten unter ihm zu ziehen.

preservesContentDuringLiveResize Implementierung JA zurückzukehren gibt Ihnen einige zusätzliche Verantwortung, sondern kann die Performance bei Änderungen der Fenstergröße verbessern.

10.6 hinzugefügt zwei weitere neue APIs dieser Art, layerContentsRedrawPolicy und layerContentsPlacement.

Zuletzt ist benutzerdefinierte Zeichnung weniger üblich als unter Windows. Die meisten Ansichten, die Sie sehen, sind Framework-bereitgestellt und nicht unterklassifiziert. Von Frameworks bereitgestellt bedeutet "Optimiert nach Apfel".

1

Yup, es ist alles doppelt automatisch gepuffert. Natürlich, wenn Sie Legacy-Code von Mac OS 9 laufen, oder Code von Windows portiert, das heißt, Sie sind wahrscheinlich dreifache Pufferung, ohne es zu wissen. Hey, Fahrräder sind billig!