2012-05-08 36 views
7

Tôi cảm thấy rằng hiệu suất bản vẽ của JavaFX 2 kém hơn so với hiệu suất của Swing. Tôi nghĩ một trong những lý do là cách bạn vẽ đồ vật, ví dụ: khi vẽ một Line, người ta phải tạo một đối tượng Line cho mỗi dòng và thêm nó vào một số container trong khi trong Swing một chỉ được Graphics2D một lần và sau đó không drawLine mà không tạo ra một đối tượng mới mỗi lần. Vì vậy, có cách nào có hiệu quả hơn để vẽ bằng JavaFX 2 hay không, ví dụ: nếu bạn phải vẽ khoảng 3000 vòng cung? "Bề mặt vẽ" tốt nhất là gì? Hiện tại tôi đang sử dụng Group. Cảm ơn mọi gợi ý!Hiệu suất vẽ JavaFX 2

Trả lời

14

cách tiếp cận hiện tại của bạn sử dụng một Group, có khả năng tốt, và có thể bạn sẽ thấy rằng việc thực hiện bản vẽ 3000 vòng cung trong Nhóm của bạn là hoàn toàn có thể chấp nhận cho người dùng ứng dụng của bạn. Một thay thế hiện tại để sử dụng một Nhóm sẽ là sử dụng các Khung bố trí có thể thêm một số chức năng tiện lợi, nhưng thêm một lớp bổ sung trên không cần thiết khi bạn có hàng ngàn đối tượng được đặt thủ công một cách dễ dàng.

Xem JavaFX mailing list archive để thảo luận về giao diện vẽ trực tiếp sắp tới (được gọi là Nút Canvas) cho JavaFX 2.2 và ý nghĩa của nó.

Mặc dù nó có vẻ kém hiệu quả hơn để gắn các đối tượng trong một thùng chứa, việc triển khai vùng chứa có thể, nếu muốn, tận dụng phần cứng dựng lại chế độ được tăng tốc được tích hợp vào gpus hiện đại. Cũng lưu ý rằng kiến ​​trúc JavaFX theo dõi nội bộ các vùng bẩn và lưu trữ các kết quả của các hoạt động dựng hình tốn kém để tăng hiệu suất. Vì vậy, việc sử dụng một container không, trong và của chính nó, ngụ ý hiệu suất chậm hơn so với một giao diện vẽ trực tiếp mà có thể dựa vào việc thực hiện chế độ ngay lập tức.

Chọn bề mặt vẽ sẽ tùy thuộc vào ứng dụng. Bề mặt tốt nhất cho hầu hết các ứng dụng JavaFX sẽ là một tập hợp các nút scenegraph chứ không phải là một nút canvas. Sử dụng nhiều nút trong một scenegraph hơn là một nút Canvas duy nhất sẽ (thường) được dễ dàng hơn để phát triển và hiệu suất sẽ được chấp nhận hoàn toàn. Cuối cùng, có khả năng là nhiều bài viết trên blog sẽ được viết để so sánh hiệu suất của Canvas so với nhiều đối tượng scenegraph và có lẽ chống lại các khung công tác khác như canvas html, java2d, swing, v.v. Vì vậy, trong thời gian, sẽ dễ dàng hơn để trả lời một câu hỏi như vậy.

liên quan

Osvaldo của JavaFX performance analysis, mặc dù cũ, cũng bao gồm một sâu thảo luận về một số vấn đề đặt ra trong câu hỏi của bạn.

Có phần đẹp trên Performance Tips and Tricks trong số openjfx wiki.

Có một số StackOverflow JavaFX câu hỏi hiệu suất liên quan:

+0

Cảm ơn bạn rất nhiều vì thông tin chi tiết đó! –

2

Trong JavaFX 2.2 một đối tượng tương tự như HTML5 Canvas dự kiến ​​được bổ sung mà lý tưởng sẽ phù hợp với bạn cần của vẽ rất nhiều primitev.

Xem tài liệu gắn liền với vấn đề tiếp theo để biết chi tiết: http://javafx-jira.kenai.com/browse/RT-17407

+0

Cảm ơn bạn đã liên kết, tôi tò mò nó sẽ hoạt động tốt như thế nào, khi nó được phát hành :-) –

1

Nhìn các bài Pixel Graphics thí nghiệm cho gợi ý. Có 2 cách tiếp cận trong đó, trong 1 số Group được sử dụng và ImageView trong một số khác. Mặc dù không tự mình thử tác giả nói rằng phương pháp ImageView nhanh hơn và có hình ảnh tốt hơn. Mặt khác, nó sử dụng phương pháp API không được chấp nhận.