2010-09-08 13 views
7

Pracuję nad grą w C# (albo 2,0 lub 3,5 havn't postanowił jeszcze). Gra zostanie odtworzona na mapie z sześciokątną siatką. Doceniam to, że interfejs użytkownika dla tej mapy powinien korzystać z podwójnego buforowania (wiele warstw, więc powolny rysunek). Wiem, że mogę włączyć podwójne buforowanie za pomocą stylu lub utworzyć własny bufor i obsłużyć go samodzielnie. Większość zaleceń, które znajduję w Internecie, należy traktować samodzielnie. Zastanawiam się, dlaczego? Oczywiście pozwala mi to uniknąć założeń, które są nieodłącznie związane z podwójnymi buforami kontrolnymi, ale nie wiem, jakie są te założenia.Dlaczego należy wykonywać ręczne podwójne buforowanie?

Ponownie, nie szukam kodu, aby wyjaśnić, jak podwoić bufor mojej kontroli, ale raczej, dlaczego sam bym to zbudował zamiast używania stylu podwójnego buforowania i pozwalającego klasie CLR/Control na obsłużenie go?

Odpowiedz

3

W WFA, podwójne buforowanie spowalnia działanie bez całkowitego wyeliminowania migotania w niestandardowych obszarów graficznych.W przypadku wbudowanych elementów GUI, tak jak w przypadku tworzenia gry zbudowanej z ImageButtons i Labels, wbudowany tryb podwójnego buforowania jest świetny w ukrywaniu przerysowania drzewa kontrolnego. Jednakże, istnieje kilka poważnych problemów z wykorzystaniem go na obszar niestandardowy rysunek:

  • Bufor losowanie tworzony po prostu skonfigurować aplikację do rysowania podwójnie buforowane służy do rysowania całe okno i wszystkich formantów podrzędnych , nie tylko Twój niestandardowy obszar rysowania, więc dodajesz narzut przerysowywania każdego elementu GUI z tylnego bufora przed przewracaniem strony.
  • Jeśli coś unieważni formant, zostanie wywołana metoda Paint. Możesz nie dokończyć rysowania, kiedy to się stanie, a więc dostaniesz niepełny obraz pokazany użytkownikowi (niezbyt dobry w grafice czasu rzeczywistego).

Dzięki zachowaniu podstawowego okna GUI jednokrotnie buforowanego, ale tworzącemu obszar, na którym kontrolowane jest buforowanie, oba te problemy są zminimalizowane.

Metody podwójnego buforowania mogą być tak proste, jak tworzenie obiektu Bitmap jako bufora wstecznego i rysowanie go do obszaru rysowania, gdy wszystko jest w porządku, lub konfigurowanie oddzielnego obiektu BufferedGraphicsContext w celu zarządzania buforowaniem niestandardowego losowania powierzchnia.

4

Od MSDN:

Dla graficznie aplikacji intensywnie takich jak animacja, można czasami zwiększyć wydajność za pomocą dedykowanego BufferedGraphicsContext zamiast BufferedGraphicsContext dostarczonych przez BufferedGraphicsManager. Umożliwia tworzyć i zarządzać grafikami bufory indywidualnie, bez ponoszenia narzut wydajności zarządzającej wszelkie inne buforowane grafiki związane z aplikacją , choć pamięć spożywane przez aplikację będzie większa.

EDIT: Znalazłem również this artykuł z Bobem Powell, które mogą być pomocne

Instrukcja podwójne buforowanie może być przydatna jeśli nie chcą system tak zrobić założeń dla ciebie taki jako, że tło jest nieprzezroczyste lub przezroczyste lub, jeśli chcesz, aby stworzyć bardziej złożony system buforowania . Istnieje kilka prostych zasad: , które należy wykonać, aby uzyskać właściwe podwójne buforowanie pod adresem .

Po pierwsze, nie twórz nowego bufora wstecznego w każdym cyklu losowania. Ulepsz bitmapę tylko wtedy, gdy zmienia się rozmiar klienta okna . Po drugie, tylko utworzy mapę bitową o wymaganym rozmiarze. Usuwanie pikseli wymaga czasu, więc jeśli ma więcej pikseli, niż potrzebujesz, po prostu marnujesz cykle procesora. Na koniec użyj najprostszej metody rysowania, aby skopiować bitmapę na ekran. DrawImageUnscaled jest tutaj, aby przejść tutaj.

EDIT: Innym powodem jest to, że może chcesz, aby aplikacja kontrolować buforowanie, a nie same kontrole.

Źródło: Pro .NET 2.0 Windows Forms and custom controls in C#

+0

Dzięki, ale już zrobiłem wyszukiwanie w sieci :-) –