2013-08-16 37 views
8

Câu hỏi của tôi là TẠI SAO là cùng một thói quen xoay-tùy chỉnh-sơn gần 16 lần nhanh hơn khi vẽ trên một JPanel so với trực tiếp trên JFrame? Nó chỉ là bộ đệm đôi? Nó không thể được, chắc chắn?Tại sao vẽ trên JFrame chậm hơn rất nhiều so với trên JPanel?

Thông tin cơ bản: Tôi đã gặp sự cố với tùy chỉnh vẽ không được làm mới khi JFrame không bị che khuất (đặc biệt là chỉ bị che khuất một phần). Sau khi tìm kiếm SO tôi quyết định cắn-the-bullet và tìm ra cách để nối một phân lớp của JPanel thành dạng biểu mẫu thiết kế dạng bluddy-NetBeans.

Đối với bất kỳ ai trong cùng một trường hợp: Trong NetBeans bạn cần tạo một lớp tiêu chuẩn mới (KHÔNG phải dạng JPanel) chỉ xảy ra để mở rộng JPanel và tự mã hóa mọi thứ trong đó (không có trình thiết kế GUI, như ole-days, thở dài). Sau đó, bạn thêm một JPanel chuẩn vào biểu mẫu của bạn, đặt kích thước của nó; sau đó nhấp chuột phải và chọn "Tùy chỉnh mã" và chọn "tạo tùy chỉnh" trong hộp tổ hợp ... nơi nó tạo ra một javax.swing.JPanel mới thay thế lớp con của bạn.

Vì vậy ... Điều này cho phép tôi "làm điều đó đúng" và vẽ trên một thành phần, thay vì trực tiếp trên biểu mẫu. Ngoài ra, các bảng-key-nghe một giải pháp nhiều chỗ hơn so với hi-jacking các khung key-event-dispatcher. Dù sao, bây giờ profiler nói rằng chính xác cùng một mã tùy chỉnh-sơn thực hiện nhanh hơn gần 16 lần trong paintComponent của JPanel() như sơn JFrame apposed() ... và tôi đã tự hỏi nếu có ai có thể vui lòng giải thích tại sao.

Cảm ơn bạn trước. Keith.


EDIT: Câu hỏi này được dựa trên hiểu sai số liệu. Trình lược tả không bao gồm/báo cáo phương thức paintComponent() của JPanel trong chuỗi AWT-EventQueue, trong đó-như cấu hình đường cơ sở của tôi không bao gồm lớp của JFrame(). Tôi nên cẩn thận hơn trước khi hỏi một câu hỏi ngớ ngẩn. Lỗi của tôi.

+0

Profiler, VisualVM iirc, nên cho bạn biết (các) phương pháp nào đang mất nhiều thời gian hơn. Đó sẽ là một khởi đầu tốt để tìm thấy những gì đang xảy ra. –

+0

@JonathanDrapeau: Bạn nói đúng! Cấu hình KHÔNG báo cáo paintComponent như một phần của chủ đề "AWT-Event-Queue" (trong khi đó JFrame paint là)! Vì vậy, đó là một sự khác biệt trong cách hai giải pháp được báo cáo. Lỗi của tôi! – corlettk

+0

đây là câu hỏi rất cụ thể, bởi vì paitning để AWT Components sẽ nhanh hơn (đồng nghiệp từ hệ điều hành gốc) cho các JComponents childs Swing của nó, nhưng chúng ta đã nói về tiền sử đồ họa cốt lõi, không có nơi nào đó speedee ot tối ưu hóa, bạn có thể so sánh với một lõi đồ họa mới được sử dụng trong Nimbus và giống nhau (AFAIK) với những thay đổi nhỏ làm cơ sở cho JavaFX – mKorbel

Trả lời

0

"Swing sử dụng API Java2D để vẽ và theo hướng dẫn khắc phục sự cố Java SE 7 này, Java2D sử dụng một tập hợp các đường ống dựng hình", có thể được định nghĩa gần như các cách khác nhau để hiển thị nguyên thủy ". Đường dẫn dựng hình Java2D dường như kết nối mã Java đa nền tảng với các thư viện đồ họa nguyên bản (OpenGL, X11, D3D, DirectDraw, GDI) có thể hỗ trợ tăng tốc phần cứng. đường ống đồ họa tăng tốc "dựa trên Direct3D đã được thêm vào Java2D cho Windows để cải thiện hiệu suất hiển thị trong các ứng dụng Swing và Java2D (được bật theo mặc định). khi Java2D được sử dụng trên một hệ thống Windows, cả đường dẫn Direct3D này và đường dẫn DirectDraw/GDI được kích hoạt theo mặc định (tôi cho rằng chúng được sử dụng cho các thứ khác nhau). "

đọc trên: First call to JFrame constructor takes a long time during Swing application startup (because of java.awt.Window())

+0

Xin lỗi, tôi không hiểu làm thế nào Direct3D có thể làm cho bức tranh trên JPanel nhanh hơn rất nhiều mà một JFrame ... và nó là rõ ràng nhanh hơn, do đó, nó chắc chắn không phải là "xấu hồ sơ" trên một phần của tôi. Tôi đoán rằng các thành phần có thể được sơn thông qua một đường ống tăng tốc, trong khi khung là "thô". Nó làm cho một số ý nghĩa cho rằng khung thường chỉ cung cấp một "nền tĩnh" cho các thành phần để làm cho tất cả các "nội dung dễ bay hơi" hơn ... Tôi chỉ prima-facie dự kiến ​​JFrame sử dụng "tốt nhất có sẵn" đồ họa đường ống, thậm chí chỉ để phù hợp với JComponent. Cảm ơn sự nhiệt tình của bạn. – corlettk

1

JFrame là một aw.Frame container cấp mở rộng đầu mà cần các nguồn lực tự nhiên để vẽ trong khi một JPanel là một thành phần xoay được đưa ra bởi các thread UI riêng của mình.

Các vấn đề liên quan