2009-03-16 12 views
5

Co to jest renderowanie wielu bitmap do pojedynczej bitmapy. Mogą być setki obrazów, a renderowana bitmapa może mieć ponad 1000x1000 pikseli.Rendering do pojedynczego obiektu Bitmap z wielu wątków

Mam nadzieję przyspieszyć ten proces, używając wielu wątków, ale ponieważ obiekt Bitmap nie jest bezpieczny dla wątków, nie można go renderować bezpośrednio równolegle. Jeśli chodzi o dzielenie dużej bitmapy na sekcje na procesor, renderuj je osobno, a następnie połącz je na końcu. Jeszcze tego nie zrobiłem, ale faceci i dziewczęta mają lepsze sugestie.

Wszelkie pomysły? Dzięki

Odpowiedz

0

Możesz napisać każdy wątek do tablicy bajtów, a kiedy wszystko się zakończy, użyj pojedynczego wątku do utworzenia obiektu bitmapowego z tablic bajtowych. Jeśli wszystkie inne przetwarzanie zostało wykonane przed rozdaniem, powinno to być dość szybkie.

1

Lee, jeśli zamierzasz używać obiektu Image GDI +, możesz zakończyć wykonywanie całej pracy dwukrotnie. Sekcje, które generujesz w wielu wątkach, będą musiały zostać ponownie złożone na końcu twojego podziału i podbić podejście i czy nie byłoby to sprzeczne z celem dzielenia w pierwszej kolejności?

Ten problem można przezwyciężyć tylko wtedy, gdy robisz coś dość skomplikowanego w każdej z sekcji bitmapy, która byłaby znacznie dłuższym czasem przetwarzania niż po prostu przerysowywanie podstron obrazów w dużej bitmapie bez powodowania tych wszystkich problemów.

Nadzieję, że pomaga. Jakiego rodzaju renderowania obrazu planujesz?

+0

Tak, myślałem, że tuż po tym, jak napisałem, nie ma nic więcej poza ciągnięciem bitmaps do jednego dużego, prawie cały czas spędzony w metodzie DrawImage. Potrzebujesz nowego pomysłu. –

0

Zrobiłem coś podobnego iw moim przypadku miałem każdą blokadę wątku x (zależnie od rozmiaru obrazu i liczby wątków) wielu wierszy bitów na obrazku i robiłem ich zapis na tych bitach, że nic nie nakładało się na ich pisma.

4

Można używać funkcji LockBits i pracować nad poszczególnymi sekcjami obrazu.

Dla przykładu, jak to zrobić, możesz spojrzeć na kod źródłowy Paint.Net, szczególnie BackgroundEffectsRenderer (tak, to jest link do gałęzi mono, ale główny kod Paint.Net wydaje się być dostępny tylko w pliki zip).

0

Jedno podejście byłoby uczynić wszystkie małe bitmapy na na ersatz bitmapę, która będzie tylko dwuwymiarowy int array (który niby wszystko Bitmap naprawdę jest w każdym razie). Gdy wszystkie małe bitmapy są łączone w dużej tablicy, robisz jednorazową kopię z dużej tablicy do rzeczywistego Bitmap o tych samych wymiarach.

Używam tego podejścia (bez wielowątkowego aspektu) cały czas dla złożonej grafiki na urządzeniach z Windows Mobile, ponieważ pamięć dostępna do tworzenia "prawdziwych" bitmap GDI + jest mocno ograniczona.

Można również po prostu użyć Bitmap zgodnie z pierwotnym zamierzeniem. Bitmap nie ma gwarancji, że jest bezpieczny dla wątków, ale nie jestem pewien, czy byłby to problem, o ile mógłbyś zapewnić, że żadne dwa wątki nigdy nie nadpisują tej samej części bitmapy. Przynajmniej spróbuję.

Aktualizacja: Właśnie ponownie przeczytać pytanie, a ja sobie sprawę, że jesteś prawdopodobnie nie będzie zobaczyć wiele (jeśli w ogóle) Poprawa ogólnej szybkości tych operacji, dokonując ich wielowątkowe. To klasyczny problem dziewięciu kobiet, które nie mogą sprawić, by dziecko w jednym miesiącu.