2009-09-17 7 views
9

Czytałem ostatnio najnowszy blog Larry'ego Ostermana o numerze debugging a flickering problem in the Windows Vista/7 volume control i nagle uświadomiłem sobie, że nie pamiętam, żeby widziałem migotanie aplikacji na moim laptopie OS X. Nawet aplikacje, które inaczej wydają się być słabo napisane, pozwalają uniknąć problemu migotania na moim doświadczeniu. Bez tego przejście w debatę Apple vs Windows (proszę), , dlaczego aplikacje OS X nie wydają się mieć ten sam problem z migotaniem?Dlaczego system OS X nie ma takich samych problemów z migotaniem, jak w systemie Windows?

Mam problemy z uwierzeniem, że programiści Apple są po prostu niesamowici przy programowaniu bez migotania GUI, podczas gdy programiści Windowsa ssają, więc jaki jest tego powód? Czy interfejs API systemu OS X wymaga wszystkich GUI do implementacji podwójnego buforowania? Podczas gdy niektóre aplikacje mają nieco powolne, dwukrotne buforowanie, wiele z nich nie działa i nadal unika migotania. Czy system odświeżania systemu OS X w jakiś sposób zasadniczo różni się od systemu Windows, unikając całkowicie problemu związanego z WM_ERASEBKGRND? Czy jest jakaś inna możliwość, której nie widzę?

Aktualizacja: Dziękujemy za odpowiedzi. Chciałbym móc wybrać odpowiedzi zarówno dla Ken i cb160, ponieważ są one pomocne.

Odpowiedz

9

Zarówno system Windows Vista/7, jak i OSX używają silników do kompilacji do rysowania rasteryzowanych bitmap na ekranie. Te mechanizmy kompozycyjne są odpowiedzialne za przetwarzanie danych wyjściowych ze wszystkich okien i rysowanie końcowego obrazu ekranu. Podejście kompozytorskie polega na tym, że OSX może wykorzystywać efekt dżinów podczas minimalizowania do stacji dokującej i sposobu, w jaki aero rysuje przezroczyste krawędzie. Zapobiegają one również migotaniu, tak jakby mapa bitowa wypełniająca określony obszar ekranu nie była dostępna, użyje obrazu, który już przygotował, zamiast rysować pusty obszar.

OSX ma silnik kompozycyjny od momentu jego pierwszego wysłania.W tamtych czasach wielu ludzi było szaloną propozycją, ponieważ wszystkie karty graficzne wysyłane w tym czasie były zoptymalizowane do rysowania map bitowych (tj. Przycisków i obramowań okien), a nie do złożonych obrazów. W późniejszych wersjach OSX kompozycja została odepchnięta na GPU (w Quartz Extreme), co spowodowało znaczne obciążenie procesora i spowodowało więcej efektów.

Ponieważ kompozytor systemu Windows został dodany tylko w systemie Windows Vista i tylko wtedy, gdy był dostępny procesor graficzny, a dysponowała odpowiednią wersją systemu operacyjnego, nie jest tak przenikliwy jak kompozytor kwarcowy w systemie OSX. Ponieważ kompozytor nie zawsze jest używany w systemie Windows, migotanie wystąpi, gdy region zostanie wygaszony, a aplikacja odpowiedzialna za rysowanie nie będzie w stanie wystarczająco przerysować regionu.

16

Mac OS X ma double buffered windows.

Nie musisz robić nic, aby to się stało. Jest za kulisami.

(prawie zawsze) nie rysujesz bezpośrednio okna w kakao, gdy coś się zmienia, unieważniasz region okna. Struktura później zejdzie z hierarchii widoków i narysuje brudne obszary okna w buforze wtórnym. Następnie zamienia bufory.

Możesz opcjonalnie składać obietnice, które pozwalają ramce na wykonywanie skrótów podczas przerysowywania, ale wszystkie one są włączone. Mają one wpływ tylko na wyraźne poglądy.

Jeśli twoja podklasa NSView implementuje metodę isOpaque w celu zwrócenia TAK, struktura nigdy nie usunie niczego poza twoim widokiem ani nie narysuje żadnego z widoków pod nim.

Implementacja preservesContentDuringLiveResize w celu zwrócenia TAK zapewnia dodatkowe obowiązki, ale może poprawić wydajność podczas zmiany rozmiaru okna.

10.6 dodano kolejne dwa nowe interfejsy API tego rodzaju, layerContentsRedrawPolicy i layerContentsPlacement.

Ostatnio niestandardowy rysunek jest mniej powszechny niż w systemie Windows. Większość widoków, które widzisz, jest dostarczana przez ramy i nie jest podklasowana. Framework-provided oznacza zoptymalizowane przez jabłko.

1

Tak, to wszystko jest podwójnie buforowane automagicznie. Oczywiście, jeśli używasz starszego kodu z mac os 9, lub kodu przeniesionego z windoze, oznacza to, że prawdopodobnie masz trzykrotne buforowanie, nie wiedząc o tym. Hej, cykle są tanie!