BitBlt a SetPixelV w WinApi

0

Cześć,

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.

Pozdrawiam i dzięki z góry.

0

nie wsciekaj sie, ale wiekszosc odpowiedzi na Twoje pytaine jest

tu: SetPixelV -> http://msdn.microsoft.com/en-us/library/dd145079(v=vs.85).aspx
i tu: BitBlt -> http://msdn.microsoft.com/en-us/library/dd183370(v=vs.85).aspx

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1