2013-08-16 3 views
8

제 질문은 JFrame에서 직접 비교 한 것보다 JPanel에서 드로잉 할 때 거의 동일한 스윙 맞춤형 페인팅 루틴이 약 16 배 더 빠릅니까? 그냥 이중 버퍼링인가요? 틀림없이 그럴 수 있니?JPanel보다 JFrame에서 그리는 속도가 왜 느리지?

배경 : JFrame이 손상되지 않았을 때 (특히 부분적으로 만 보이지 않는 경우) 사용자 정의 그림이 새로 고쳐지지 않는 문제가있었습니다. 검색 후, JPanel의 하위 클래스를 bluddy-NetBeans-form-designer 형식으로 연결하는 방법을 결정하기로 결심했습니다.

동일한 상황에있는 사람들에게 : NetBeans에서는 JPanel을 확장하는 새로운 표준 클래스 (JPanel 형식이 아님)를 만들고 수동으로 모든 항목을 직접 코딩해야합니다 (GUI 디자이너가 없어도, 에일 - 일, 한숨). 그런 다음 표준 JPanel을 양식에 추가하고 크기를 설정합니다. 마우스 오른쪽 버튼을 클릭하고 "코드 사용자 정의"를 선택하고 콤보 상자에서 "사용자 정의 작성"을 선택하십시오. 새 javax.swing.JPanel을 작성하여 서브 클래스를 대체하십시오.

그래서 ... "제대로 할"수 있고 양식에 직접적으로 구성 요소를 칠하는 것이 가능했습니다. 또한 패널 - 키 리스너는 프레임 키 이벤트 디스패처를 고킹하는 것보다 훨씬 깔끔한 솔루션을 제공합니다.

어쨌든 프로파일 러는 JPanel의 paintComponent()에서 appotated JFrame의 paint()처럼 정확히 동일한 맞춤형 페인팅 코드가 거의 16 번 실행된다고 말합니다. 그 이유를 설명해 줄 수 있는지 궁금합니다.

미리 감사드립니다. 키이스.


편집 :이 질문을 잘못 해석 메트릭을 기반으로합니다. 프로파일 러는 AWT-EventQueue 스레드에서 JPanel의 paintComponent() 메소드를 포함 /보고하지 않습니다. 여기서 기본 프로파일에는 JFrame의 paint()가 포함되어 있습니다. 어리석은 질문을하기 전에 나는 더 조심스럽게보아야했다. 내 잘못이야.

+0

Profiler VisualVM iirc는 어떤 메소드가 더 많은 시간을 들여야하는지 알려줍니다. 그것은 무슨 일이 일어나고 있는지를 알기위한 좋은 출발이 될 것입니다. –

+0

@JonathanDrapeau : 네 말이 맞아! 프로필은 "AWT-Event-Queue"스레드의 일부로 paintComponent를보고하지 않습니다 (반면 JFrame 페인트는). 따라서 두 솔루션이 어떻게보고되는지는 차이가 있습니다. 내 잘못이야! – corlettk

+0

AWT 구성 요소를 테스트하는 것이 자손 Swing JComponents와 같이 더 빨라졌지만 (선입 선출원에 대한 이야기는 이미 있었으므로), 선사 시대에 대해 이미 이야기했기 때문에 이것은 매우 구체적인 질문입니다. 그래픽 코어, 속도가 최적화 될 수있는 곳이 없습니다. Nimbus에서 사용 된 새로운 그래픽 코어 및 JavaFX – mKorbel

답변

0

"Swing은 드로잉에 Java2D API를 사용하며,이 Java SE 7 문제 해결 가이드에 따르면 Java2D는"프리미티브 렌더링의 다른 방법으로 대략 정의 할 수있는 "렌더링 파이프 라인 집합을 사용합니다. Java2D 렌더링 파이프 라인은 하드웨어 가속을 지원할 수있는 네이티브 그래픽 라이브러리 (OpenGL, X11, D3D, DirectDraw, GDI)에 플랫폼 간 Java 코드를 연결하는 것처럼 보입니다

Java 1.6.0_10 (일명 6u10)에서 " 가속화 된 그래픽 파이프 라인 "이 Windows 용 Java2D에 추가되어 Swing 및 Java2D 응용 프로그램에서 렌더링 성능을 향상 시켰습니다 (기본적으로 사용 가능).

기본적으로, Java2D가 Windows 시스템에서 사용될 때이 Direct3D 파이프 라인과 DirectDraw/GDI 파이프 라인은 기본적으로 활성화되어 있습니다 (각기 다른 용도로 사용된다고 가정합니다). "

읽어 JFrame의이 JPanel을 그리는 반면 고유 리소스를 필요로하는 최상위 컨테이너이다 연장 aw.Frame First call to JFrame constructor takes a long time during Swing application startup (because of java.awt.Window())

+0

미안하지만, Direct3D가 JPanel에서 JFrame보다 더 빨리 그림을 그릴 수있는 방법을 이해하지 못했습니다. 그리고 눈에 띄게 빨라서, 제 부분에서 확실히 "나쁜 프로파일 링"이 아닙니다. 프레임이 "원시"인 동안 구성 요소는 가속기 파이프 라인을 통해 그릴 수 있다고 생각합니다. 프레임은 일반적으로 모든 "휘발성 컨텐트"를 렌더링하기 위해 구성 요소에 "정적 배경"을 제공한다는 점을 감안할 때 약간의 의미가 있습니다. 단지 JFrame이 JFrame이 "최상의 그래픽"파이프 라인을 사용할 것으로 기대했습니다. JComponent와 일관성이 있습니다. 관심을 가져 주셔서 감사합니다. – corlettk

1

는 UI 실 자체에 의해 렌더링되는 요동 성분이다.

관련 문제