Podwójna grafika buforowana
Migotanie jest typowym problemem podczas programowania grafiki. Operacje graficzne, które wymagają wielu złożonych operacji malowania, mogą spowodować, że renderowane obrazy wydają się migać lub mieć w inny sposób niedopuszczalny wygląd. Aby rozwiązać te problemy, program .NET Framework zapewnia dostęp do podwójnego buforowania.
Buforowanie podwójne używa buforu pamięci do rozwiązywania problemów z migotaniem skojarzonych z wieloma operacjami malowania. Po włączeniu podwójnego buforowania wszystkie operacje malowania są najpierw renderowane do buforu pamięci zamiast powierzchni rysunkowej na ekranie. Po zakończeniu wszystkich operacji malowania bufor pamięci jest kopiowany bezpośrednio do powierzchni rysunku skojarzonej z nią. Ponieważ na ekranie jest wykonywana tylko jedna operacja graficzna, usuwa się migotanie obrazu skojarzone ze złożonymi operacjami malowania.
Domyślne podwójne buforowanie
Najprostszym sposobem użycia podwójnego buforowania w aplikacjach jest użycie domyślnego podwójnego buforowania formularzy i kontrolek udostępnianych przez program .NET Framework. Możesz włączyć domyślne podwójne buforowanie dla formularzy systemu Windows i utworzonych kontrolek systemu Windows, ustawiając właściwość DoubleBuffered na true
lub przy użyciu metody SetStyle. Aby uzyskać więcej informacji, zobacz Jak ograniczyć migotanie grafiki za pomocą podwójnego buforowania dla formularzy i kontrolki.
Ręczne zarządzanie buforowaną grafiką
W przypadku bardziej zaawansowanych scenariuszy podwójnego buforowania, takich jak animacja lub zaawansowane zarządzanie pamięcią, można użyć klas programu .NET Framework do zaimplementowania własnej logiki podwójnego buforowania. Klasa odpowiedzialna za przydzielanie i zarządzanie poszczególnymi buforami graficznymi to klasa BufferedGraphicsContext. Każda domena aplikacji ma własną domyślną instancję BufferedGraphicsContext, która zarządza całym domyślnym podwójnym buforowaniem dla tej aplikacji. W większości przypadków będzie istnieć tylko jedna domena aplikacji na aplikację, więc zazwyczaj istnieje jedna domyślna BufferedGraphicsContext na aplikację. Domyślne wystąpienia BufferedGraphicsContext są zarządzane przez klasę BufferedGraphicsManager. Odwołanie do domyślnego wystąpienia BufferedGraphicsContext można pobrać, wywołując Current. Możesz również utworzyć dedykowane wystąpienie BufferedGraphicsContext, które może zwiększyć wydajność dla aplikacji wymagających intensywnego przetwarzania graficznego. Aby uzyskać informacje na temat tworzenia wystąpienia BufferedGraphicsContext, zobacz Instrukcje: Ręczne zarządzanie buforowaną grafiką.
Ręczne wyświetlanie buforowanej grafiki
Możesz użyć wystąpienia klasy BufferedGraphicsContext, aby utworzyć graficzne bufory, wywołując BufferedGraphicsContext.Allocate, która zwraca wystąpienie klasy BufferedGraphics. Obiekt BufferedGraphics zarządza buforem pamięci skojarzonym z powierzchnią renderowania, taką jak formularz lub kontrolka.
Po zainicjowaniu klasa BufferedGraphics odpowiada za renderowanie do buforu graficznego w pamięci. Grafiki można renderować do buforu pamięci za pośrednictwem Graphics, który uwidacznia obiekt Graphics, który bezpośrednio reprezentuje bufor pamięci. Możesz malować do tego obiektu Graphics tak samo, jak w przypadku obiektu Graphics, który reprezentuje powierzchnię rysunkową. Po narysowaniu całej grafiki do buforu można użyć BufferedGraphics.Render, aby skopiować zawartość buforu na powierzchnię rysunkową ekranu.
Aby uzyskać więcej informacji na temat używania klasy BufferedGraphics, zobacz Ręczne renderowanie buforowanej grafiki. Aby uzyskać więcej informacji na temat renderowania grafiki, zobacz Grafika i rysowanie w formularzach systemu Windows
Zobacz też
- BufferedGraphics
- BufferedGraphicsContext
- BufferedGraphicsManager
- Instrukcje: ręczne renderowanie buforowanej grafiki
- Instrukcje: zmniejszanie migotania grafiki za pomocą podwójnego buforowania formularzy i kontrolek
- Instrukcje: ręczne zarządzanie buforowaną grafiką
- grafika i rysowanie w formularzach Windows Forms
.NET Desktop feedback