Frage

Ich lese neuesten Blog-Post Larry Osterman über Debuggen ein flackerndes Problems in dem Windows Vista / 7 Lautstärkeregler , und ich wurde plötzlich klar, dass ich nicht eine Anwendung Flimmern jemals zu sehen auf meinem O X Laptop erinnern kann. Auch Anwendungen, die sonst zu sein scheinen schlecht geschrieben das Flackern Problem in meiner Erfahrung zu vermeiden. Ohne diese verwandelt sich in einen Apple vs Windows-Debatte (bitte), Warum scheinen OS X Anwendungen, die nicht die gleiche Flackern Problem haben?

Ich habe Schwierigkeiten zu glauben, dass Apple-Entwickler bei der Programmierung flimmerfreie GUIs einfach erstaunlich ist, während Windows-Programmierer saugen, so was ist der Grund? Hat das OS X-API alle GUIs erfordern Double-Buffering zu implementieren? Während einige Anwendungen, die leicht träge doppelt gepufferte Resize-Verhalten haben, tun viele nicht, und sie noch Flimmern vermeiden. Ist das OS X repaint Fluss irgendwie grundlegend verschieden von Windows die WM_ERASEBKGRND Problem zu vermeiden vollständig? Oder gibt es eine andere Möglichkeit, die ich nicht sehen?

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

War es hilfreich?

Lösung

Sowohl Windows Vista / 7 und OSX Verwendung Compositing Motoren gerasterten Bitmaps auf dem Bildschirm zu zeichnen. Diese Compositing-Motoren sind für die Verarbeitung von Ausgang aus allen Fenstern und das letzten Bildschirm Bild zeichnen. Dieser Compositing Ansatz ist, wie OSX ist in der Lage den Geist Effekt zu verwenden, wenn auf das Dock zu minimieren und wie aero zeichnet die durchscheinende Grenzen. Sie verhindern auch flackern, als ob das Bitmap einen bestimmten Bereich des Bildschirms zu füllen nicht verfügbar ist, wird das Bild zu verwenden, es hat schon eher als eine leere Region zu ziehen.

OSX hat einen Compositing-Motor hat, da sie zum ersten Mal geliefert. Zu der Zeit, viele Leute obwohl dies war ein verrücktes appraoch wie alle Grafikkarten zum Zeitpunkt Versand optimiert wer Bitmaps (dh Fenster Tasten und Grenzen) und nicht Compositing Bilder zu zeichnen. In späteren Versionen von OS X wurde das Compositing auf die GPU (in Quartz Extreme) geschoben und so nahm erhebliche Last von der CPU und machte mehr Effekte möglich.

Da das Windows nur in Zusammensetz Windows Vista hinzugefügt wurde und nur dann, wenn es eine GPU zur Verfügung steht und man hatte die richtige Version des OS, ist es nicht so pervassive als Quarz in OSX Zusammensetz. Da die Zusammensetzeinrichtung nicht immer in Windows verwendet wird, Flimmern tritt auf, wenn ein Bereich ausgeblendet wird und die Anwendung verantwortlich für das Zeichnen ist nicht in der Lage, die Region qucikly genug neu zu zeichnen.

Andere Tipps

Mac OS X hat doppelt gepufferten Fenster .

Sie müssen es nicht tun alles möglich zu machen. Es ist hinter den Kulissen.

Sie (fast immer) nicht explizit auf ein Fenster in Cocoa ziehen, wenn sich etwas ändert, ungültig machen Sie einen Bereich des Fensters. Der Rahmen wird die Hierarchie der Ansichten später absteigen und die schmutzigen Bereiche des Fensters in einen sekundären Puffer zeichnen. Dann tauscht er die Puffer.

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

Wenn Sie 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.

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

10,6 hinzugefügt noch zwei neue APIs dieser Art, layerContentsRedrawPolicy und layerContentsPlacement.

Letzte, benutzerdefinierte Zeichnung ist weniger verbreitet als unter Windows. Die Mehrheit der Ansichten, die Sie sehen, sind gerüst geliefert und nicht subclassed. Rahmen bereitgestellte Mittel optimieren-by-Apfel.

Yup, es ist alles doppelt automatisch gepuffert. wenn Sie natürlich laufen Legacy-Code von Mac OS 9 oder Code aus windoze portiert, dass Mittelwert der du bist wahrscheinlich Triple Buffering, ohne es zu wissen. Hey, Zyklen sind billig!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top