Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
mam pytanie takie bardziej z ciekawości. Ostatnio pisałem program prezentujący różne rzeczy do przetwarzania obrazów, a więc i musiałem jakoś wyświetlać bitmapę. Naszło mnie pytanie dlaczego jest tak wielka różnica w wydajności między BitBlt a SetPixelV? Czy tu chodzi o to (moje domysły), że BitBlt może sobie cały obszar z pikselami skopiować i po prostu po kolei wyświetlać piksele, a SetPixelV odczytuje jeden piksel, wyświetla, odczytuje kolejny, wyświetla i tak do końca? To przez te odczytywanie jest taka różnica?
//edit
Czy można jakoś sobie podejrzeć kod BitBlt? Próbowałem w Visualu ale tylko jakieś deklaracje mi pokazuje.
SetPixelV jedynie ustawia pixel na dana wartosc, kropka.
BitBlt jest zas funkcja istniejaca chyba juz od czasow windows 1.0, sluzaca do przewalania prostokatnych regionow z jednego "hdc" na drugie i posiadajaca "unikatowa" opcje dwRop ktora pozwala Ci w locie wykonac pewne calkiem sensowne podstawowe operacje na tym bloku.
W wielkim skrocie, BitBlt to zoptymalizowany kombajn, a SetPixelV to ustawiacz per pixel. Jesli chcesz przepisac blok 1000x1000 pikseli, przy BitBlt odpalisz raz jedna funkcje, a jeslibys chcial uzyc SetVectorV - musialbys jesli sie nie myle, odpalic ja "raptem" milion razy. Moze kompilator ja wy-optymalizuje, moze nie, nie wiem. Ale chyba strzelalbym ze jednak BitBlt bedzie szybszy. A i nie zdziwilbym sie gdyby BitBlt potrafil oddelegowywac przerzucanie blokow do samego GPU.. ale to juz strzelam, nie mam pojecia.
edit: a co do kodu BitBlt, to raczej poszukaj na google artykulu na temat tego jak tworzyli BitBlt i czemu sa z niej dumni. Kiedys to przegladalem, jest tam kilka niespodziewanych ficzerow jak np. mikrokompilator operacji rastrowych.. podobno. nie sprawdzalem. Kod w assemblerze zawsze mozesz wyswietlic wybierajac view->disassembly i robiac "step-into" danej funkcji, zakladajac ze nie masz jakiegos auto-step-over wlaczonego. Kod w C hmm.. mozesz sprawdzic w zrodlach ReactOS, oni zwykle maja implementacje dosc podobne do oryginalnych