2012-05-08 20 views
7

Uważam, że wydajność rysowania JavaFX 2 jest gorsza niż w przypadku Swing. Myślę, że jednym z powodów jest to, jak rysujesz rzeczy, np. podczas rysowania linii, należy utworzyć obiekt Line dla każdej linii i dodać go do jakiegoś kontenera, podczas gdy w Swingu jeden dostaje Graphics2D raz, a następnie robi drawLine bez tworzenia nowego obiektu za każdym razem. Czy istnieje zatem bardziej wydajny sposób rysowania przy użyciu JavaFX 2, np. jeśli musisz narysować około 3000 łuków? Jaka jest najlepsza "powierzchnia do rysowania"? Obecnie używam Group. Dzięki za podpowiedź!Wydajność rysowania JavaFX 2

Odpowiedz

14

Twoje obecne podejście do używania grupy jest prawdopodobnie w porządku, a prawdopodobnie osiągniesz wydajność 3000 łuków w grupie, która jest całkowicie akceptowalna dla użytkowników aplikacji.

Obecną alternatywą dla używania grupy byłoby użycie paneli układu, które dodałyby wygodną funkcjonalność, ale dodałyby dodatkową warstwę narzutową, co jest niepotrzebne, gdy mamy tysiące łatwych do ręcznego ułożenia obiektów.

Zobacz dyskusję na temat nadchodzącego interfejsu bezpośredniego rysowania (zwanego węzłem Canvas) dla języka JavaFX 2.2 i jego konsekwencji w wersji JavaFX mailing list archive.

Chociaż może wydawać się mniej wydajnym przyklejeniem obiektów do kontenera, implementacja kontenera może, jeśli chce, skorzystać z przyspieszonego trybu zachowującego sprzęt renderujący wbudowanego w nowoczesne procesor graficzny. Należy również pamiętać, że architektura JavaFX wewnętrznie śledzi brudne obszary i zapisuje wyniki kosztownych operacji renderowania w celu zwiększenia wydajności. Dlatego korzystanie z kontenera samo w sobie nie oznacza wolniejszej wydajności niż interfejs bezpośredniego rysowania, który może polegać na implementacji w trybie natychmiastowym.

Wybór powierzchni rysunkowej zależy od aplikacji. Najlepszą powierzchnią dla większości aplikacji JavaFX będzie zbiór węzłów scenegraph zamiast węzła canvas. Używanie wielu węzłów w scenariuszu zamiast pojedynczego węzła Canvas (zazwyczaj) jest łatwiejsze do opracowania, a wydajność będzie całkowicie akceptowalna.

W końcu, prawdopodobnie wiele artykułów na blogu zostanie napisanych w celu porównania wydajności płótna z wieloma obiektami scenograficznymi i być może z innymi strukturami, takimi jak płótno html, java2d, swing itp. Więc z czasem będzie łatwiej odpowiedzieć na takie pytanie.

pokrewne

Osvaldo na JavaFX performance analysis, choć stary, znajduje się również w głębi omówienie niektórych kwestii poruszonych w swoim pytaniu.

Istnieje ładny rozdział na temat Performance Tips and Tricks w openjfx wiki.

Istnieją pewne związane StackOverflow JavaFX pytania wydajności:

+0

Dziękuję bardzo za te szczegółowe informacje! –

2

W JavaFX 2.2 obiektu podobnego do HTML5 Canvas planowane jest dodana, która idealnie pasuje ci przedmioty od rysowanie wielu primitevów.

Zobacz dokumenty załączone do następnego wydania na szczegóły: http://javafx-jira.kenai.com/browse/RT-17407

+0

Dzięki za link, ciekawi mnie, jak dobrze będzie działać, kiedy zostanie wydany :-) –

1

wyglądają słupek Pixel Graphics eksperymentu dla nutą. Istnieją dwa podejścia, w których w pierwszej zastosowano Group i ImageView w innym. Chociaż sam tego nie próbował, autor mówi, że podejście jest szybsze i ma lepszą wizualizację. Z drugiej strony używa przestarzałej metody API.