2012-04-20 13 views
5

Mam aplikację rysującą wiele małych prostokątów (około 1 miliona) przy użyciu GDI + w języku C#, a wydajność jest ... nie tak dobra. Rozumiem, że skonstruowanie wielu obiektów Rectangle do przekazania ich do Graphis.FillRectangle zajmuje trochę czasu. Rozumiem również, że nie mogę tego uniknąć, jeśli zmienimy z ramki na klatkę, ponieważ Rectangle jest niezmienny. Moje pytanie brzmi zatem: czy jest jakaś możliwość poprawy wydajności tego połączenia rysunkowego, chyba że wszystkie Rectangle muszą zostać uznane za widoczne?Rysowanie wielu prostokątów w GDI +

Dzięki z góry, Christoph

+0

Tworzenie instancji prostokąta zajmuje prawie tyle samo czasu, co faktyczne wywołanie interfejsu API. W rzeczywistości Rectangle jest strukturą. – usr

+0

Masz na myśli 1 000 lub 1 milion? –

+0

Jest prawie na pewno lepszy sposób. Co reprezentują prostokąty? Co próbujesz narysować? –

Odpowiedz

9

Proponuję użyć wariantu tablicy zaproszenia Zamiast:

FillRectangles(Brush brush, Rectangle[] rects); 

Jeśli to nie działa dla ciebie, bo potrzebują różnych szczotek lub podobnych, ty powinien grupować prymitywy według stanu (pędzla) i narysować tablice za każdym razem. Szybki test wykazuje co najmniej trzykrotność wydajności, tj. 300K Prostokąty narysowane pojedynczo wydają się równie niepewne, co 1 M Prostokątów narysowanych za jednym razem.

+1

To jest naprawdę znacznie szybsze ... – Christoph

+0

FillRectangles jest bardzo wolny. Masz coś szybciej? nic dziwnego, że Android pchnął przyspieszenie 2d do systemu operacyjnego, ponieważ nie jest to zadanie deweloperów do przyspieszania wypełniania prostokątów .. w systemie Windows nie ma przyspieszenia, a ty masz słabo działającą aplikację. nie martw się, do 2050 roku myślę, że sprzęt komputerowy powinien być wystarczająco szybki dla funkcji FillRectangles. Będę czekał cierpliwie. – hamish

+0

za pomocą dotTrace Widzę wszystkie słabe funkcje wykonywania nawet przy użyciu sprzętu 2017 nadal nadal źle. Zawierają one: FillRectangles, DrawImageUnscaled (GDIPdrawImageI), DrawImage (GdipDrawImageRect) – hamish