2009-09-11 17 views
25

Po utworzeniu nowej formy, zwykle wykonywać ten rytuał:Dlaczego funkcja DoubleBuffered jest domyślnie wyłączona?

  1. Zmień nazwę na coś sensownego;
  2. Wpisz Caption;
  3. Zmień właściwość position (DefaultPosOnly prawie nigdy nie jest zgodne z oczekiwaniami użytkowników);
  4. Ustaw ShowHint na true;
  5. Zestaw DoubleBuffered na true;

Zastanawiam się przez chwilę, dlaczego domyślną wartością jest "Fałsz". Dla mnie to wygląda na low-tech i bzdura, a na mojej nowej maszynie nie zauważam żadnej różnicy w wydajności.

Czy może wystąpić podwójne buforowanie na starszych komputerach, VNC, Remote Desktop lub w Virtual Machines?

Czy pozostawiasz go włączonym lub wyłączonym? Wszelkie zalecenia?

Odpowiedz

32

Jak zapewne wiesz, podwójny bufor zwykle wymaga utworzenia bufora pamięci poza ekranem o takim samym rozmiarze jak komponent wizualny. Zapisywanie/rysowanie odbywa się na tym buforze, a po zakończeniu cały bufor jest "zamieniany", tak że jest teraz malowany na komponencie wizualnym.

(Uwaga: „zamiana” może składać się po prostu zmieniając adres punktowy wskaźnik, lub może w rzeczywistości dotyczyć kopiowania kawałek pamięci, takich jak korzystanie BitBlt, memcpy etc)

Dlatego rozsądna ilość pamięci przydzielonej do obsługi tego procesu dla każdego komponentu, dla którego jest on włączony. Jeśli twoja aplikacja ma wiele okien i/lub komponentów, to przydzielana jest niewielka ilość pamięci. Jeśli nie potrzebujesz płynnych aktualizacji wizualnych/przewijania, po co marnować tę pamięć?

Oczywiście istnieje również argument, że dziś większość komputerów ma dużo pamięci do stracenia, więc po co się martwić. Jednak nadal nie widzę powodu, aby domyślnie włączyć Double Buffering, jeśli nie jest to potrzebne.

Jeśli ręczne ustawienie opcji DoubleBuffered na wartość true jest uciążliwe dla Ciebie, zawsze możesz utworzyć własny niestandardowy element sterujący/komponent, który dziedziczy z wbudowanego elementu sterującego, i ustawia DoubleBuffered (i inne właściwości) zgodnie z wymaganymi wartościami domyślnymi.

+1

+1 ładna odpowiedź. Nitpick: zamień "szybko skopiowany" na "zamieniony" lub coś innego, co nie daje wrażenia, że ​​faktycznie trwa bufor. Zwykle wymiany buforów to proste zamiany pointerowe. –

+0

Dobra uwaga, zaktualizowałem odpowiedź. Oczywiście w Windows Forms.NET istnieje również "udawanie" podwójne buforowanie, które w rzeczywistości jest tylko kopią pamięci. – Ash

+11

Gdy 'DoubleBuffered' ma wartość true, formant odpowiada na takie komunikaty malarskie: tworzy bitmapę, maluje do bitmapy, wywołuje' BitBlt', aby skopiować mapę bitową do okna, a następnie niszczy bitmapę. To nie jest zwykła zamiana kursora. –

12

W nowoczesnym systemie operacyjnym, w którym kompozycja pulpitu może być podwójnie buforowana, może faktycznie zmniejszyć wydajność. Rendering jest wykonywany w formie bitmapy poza ekranem, więc użycie podwójnego buforowania prowadzi do dodatkowego kopiowania bez żadnych korzyści w tych systemach. Tak więc, jeśli VCL nie jest wystarczająco inteligentny, aby zignorować podwójne buforowanie w tym przypadku (nie wiem, czy to konieczne, należy sprawdzić), może lepiej nie ustawiać go bezwarunkowo.

Edit:

Sprawdziłem, i zarówno w Delphi 2007 i Delphi 2009 metoda TWinControl.WMPaint nie używa podwójnego buforowania gdy DwmCompositionEnabled powraca True. Miły.

25

Należy unikać podwójnego buforowania podczas pracy z Pulpitem Zdalnym, ponieważ cała bitmapa sterowania/formularza musi zostać przesłana przez sieć, aby wykonać BitBlt. zobacz this blog post ...

+3

+1 Awesome. Tak oczywiste, jak tylko to wskażesz, ale nigdy nie przyszło mi do głowy, że tak właśnie będzie. To zmusi mnie do przemyślenia kilku moich programów .... dzięki za wskazanie tego! – robsoft

+0

+1 zgadzam się z powyższymi informacjami! – user271077

1

Można również utworzyć eksperta czasu projektowania, który automatycznie ustawi tę wartość dla każdej tworzonej formy/kontroli, zamiast wyprowadzać nowe kontrolki dla każdego istniejącego, co wymagałoby znacznie więcej pracy. Zobacz kod źródłowy na stronie GExperts.org, aby dowiedzieć się, jak to osiągnąć.

Powiązane problemy