rysunek mam zaprojektowany program, który, w zasadzie, wycina kształt geometryczny na wiele małych trójkątów (w „lewo płótnie”), stosuje się pewne proste przekształcenie matematyczne do grona trójkątów i odświeża je w ich nowa konfiguracja. Zobacz zrzut ekranu poniżej.Qt/C++: skutecznie
W celu wyciągnięcia tych trójkątów, używam QPainter::drawPolygon
. Każdy trójkąt po prawej stronie odpowiada trójkątowi po lewej, więc wiem, jakiego koloru chcę użyć, by go narysować.
Jak na razie dobrze. Nawet jeśli narysuję o wiele więcej trójkątów niż to (kiedy używam dużo mniejszych trójkątów do wycinania kształtu), jest to wystarczająco szybkie.
Dodałem funkcję do mojego programu: Mogę narysować trójkąty wyodrębnione z obrazu zamiast prostych trójkątów: patrz poniższy zrzut ekranu.
Problemem jest to, że sposób to zrobić jest zbyt powolny. Oto jak to zrobić:
- biegnę przez wszystkich trójkątów
- Dla każdego trójkąta, ja obliczyć współrzędne każdego piksela, który zostanie wyświetlony.
- Dla każdego z tych pikseli, ja obliczyć współrzędne odpowiedniego piksela na zdjęciu (To jest proste działanie matematyczne) i odzyskać kolor, który piksela.
- używam
QPainter::setPen(QColor)
iQPainter::drawPoint(QPoint)
rysować piksel.
Jestem nowy w programowaniu w Qt i nie wiem nic o grafice, więc to mogę wymyślić. Problem polega na tym, że jest on "niedopuszczalnie" zbyt wolny (paintEvent
każdego płótna zajmuje około 0,15 s, w porównaniu z 0,01 w przypadku trójkątów prostych).
Pobiegłem profilera aby spróbować zrozumieć, co się dzieje, zauważyłem, że w poświęca widget płótno na paintEvent
,
- 58% czasu spędza w
QPainter::drawPoint
- 27% czasu w
QPainter::setPen
wydaje się, że QPainter::drawPoint
jest zbyt skomplikowany i powolny: chcę po prostu go wydrukować piksel danego koloru, to jest to.
może znalazłem rozwiązania mojego problemu: przechowywać QImage
(jako zmienna członkiem mojego widget płótnie), która reprezentuje całość Chcę moje płótno do wyświetlania i zdefiniować go całkowicie w moim paintEvent
piksel po pikselu, a następnie narysuj go od razu na końcu mojego . Mam wskazówkę, że będzie to znacznie szybsze. Ale zanim ponownie napiszę mój kod, chciałbym się dowiedzieć, czy to naprawdę jest to, co chcę zrobić.
Mam nadzieję, że nie urodziła można zrobić śmierć! Z góry dziękuję za wasze spostrzeżenia.
rysujesz piksel po pikselu ?? (zomg !!) – UmNyobe