Nie sądzę, że to zadanie jest dobrym kandydatem do implementacji przy użyciu QSGGeometryNode
, znacznie łatwiej byłoby go wdrożyć przy użyciu rysunku opartego na QPainter
i QQuickPaintedItem
. Nadal będziesz czerpał korzyści z OpenGL, ponieważ QPainter
obsługuje również rysowanie GL i wciąż jest szybsze niż oprogramowanie. Możesz użyć zapasów QPen
z deseniami przerywanymi lub przerywanymi, lub zrób własne z prostym QVector
.
Zamiast tego można zastosować niestandardowe podejście do rysowania GL zamiast klas dostarczonych przez Qt, które są dość ograniczone, jeśli chodzi o reprezentowanie zaawansowanej geometrii złożonej. Możesz nawet użyć instancji (jeśli jest dostępna), aby jeszcze bardziej poprawić wydajność i po prostu ustawić kreski lub geometrię punktów wzdłuż krzywej ścieżki.
Wreszcie można użyć elementu Canvas QML, który obsługuje prawie takie same operacje, jak QPainter
i prawdopodobnie oferuje taką samą wydajność.
EDYCJA: Jak sugeruje twoja aktualizacja, przegapiłeś część, w której powiedziałem, że QPainter
może narysować zarówno oprogramowanie, jak i GL, przy czym rysunek GL jest często znacznie szybszy. Ponadto, rysując do kontekstu GL, nie musisz przenosić bufora ramki z CPU do pamięci GPU, jest on przechowywany w pamięci GPU. Więc nie ma narzutów. Jeśli chodzi o animacje i inne rzeczy, z pewnością nie jest to możliwe z QPainter
jesteś ograniczony do tego, co zapewnia QPen
- różne połączenia, czapki i tak dalej mogą być użyte do modyfikacji kształtu w pewnym stopniu, ale bez cudów ... Wygrało W przypadku shaderów nie będzie to możliwe, będzie to możliwe tylko w przypadku niestandardowej geometrii. A jeśli użyjesz obiektu opartego na QObject
dla każdego elementu myślnik/kropka, aby je niezależnie ożywić, skończy się to całkiem kosztownie, QObject
jest bardzo ciężki i nie powinien być używany z tak lekką ręką. Więc niestandardowe renderowanie GL do FBO jest prawie do zrobienia, jeśli chcesz tego rodzaju elastyczność, ale będziesz musiał całkowicie przenieść się z API QtQuick i do lądowania GL.
W każdym razie, linijka przerywana nie powinna być tak skomplikowana, właściwie kolorujemy fragment na podstawie odległości od krzywej i "kropki" na całej długości. Znalazłem this example, nie próbowałem go samodzielnie.Możesz animować progi, a nawet korzystać z funkcji sinusoidalnej, aby uzyskać stylowy wygląd.
Jeśli chodzi o "czystą" implementację QtQuick, interfejs API tak naprawdę nie został zaprojektowany do obsługi tego rodzaju zadań rysunkowych, dlatego element Canvas został wprowadzony w celu wypełnienia luki i uzyskania zaawansowanej funkcji malowania z poziomu QML/JS. Płótno jest w rzeczywistości opakowaniem o numerze QPainter
, które jest wczytywane do pliku FBO.
Ostatecznie nie sprowadza się do tego, co jest możliwe/niemożliwe, ale które podejście jest najbardziej sensowne i najskuteczniejsze w wykonaniu pracy. Wypróbuj najpierw podejście QQuickPaintedItem
, ponieważ jest to najłatwiejsze, jeśli nie jesteś zadowolony z wydajności, możesz zaimplementować inne, bardziej złożone rozwiązanie i profil względem pierwszego. Wszakże dlatego wprowadzono po prostu QQuickPaintedItem
- aby obsłużyć stare malarstwo, które nie jest wygodne dla klasy QQuickItem
.
I t jest względnie trywialne, aby zmienić przykład krzywej Beziera w celu wygenerowania geometrii dla każdego z podsegmentów w zależności od potrzeb w wybranym stylu linii. –