2014년 9월 3일 수요일

JavaFX 아키텍처의 이해 (1)





1. Scene Graph

아키텍쳐 상의 최상위에 존재하는 JavaFX Scene Graph는 JavaFX 어플리케이션을 제작하기 위한 시작점이다. 이는 노드들의 계층적 트리로써, 각 노드들은 어플리케이션 UI의 모든 시각적 요소들을 표현한다.


Scene graph 내에 존재하는 싱글 엘리먼트를 node라 부른다. 각 노드는 ID, style class, bounding volume을 가진다. Scene graph의 루트 node를 제외하고, 모든 노드들은 하나의 부모 노드를 가지고, 0개 이상의 자식 노드들을 가진다.


각 노드들은 다음과 같은 설정을 가진다.

  • Blurs 및 shadows와 같은 효과
  • Opacity
  • Transforms
  • Event Handlers (mouse event or key event)
  • Application specific state

Swing과 AWT와는 달리, JavaFX Scene Graph는 rectangle과 text 같은 graphic primitive들을 포함한다.


대부분의 사용에 있어서, scene graph는 UI 작업을 단순화시키는데 특히 rich UI가 사용될 때 그러하다. Javafx.animation APIs를 사용하여 Scene graph 상의 다양한 그래픽들에 대한 애니메이션 작업이 빠르게 이루어질 수 있다.


javafx.scene API는 다음과 같은 컨텐츠 타입을 생성하고 정의할 수 있도록 해 준다.

  • Nodes : 2차원 또는 3차원의 도형, 이미지, 미디어, 임베디드 웹 브라우저, 텍스트, UI 컨트롤, 챠트, 그룹, 컨테이너
  • State : 노드들의 위치와 방향을 결정하는 transform, 시각적 효과, 시각적 상태
  • Effects : Scene graph의 node들의 외형을 변경하는 객체. (blurs, shadows, color adjustment) 

2. Java Public APIs for JavaFX Features

JavaFX 아키텍쳐의 최상위 계층은 rich client application 개발을 지원하기 위한 공용 API 집합을 제공한다. 이 API 들은 rich client application을 개발하는데 최상의 자유로움과 유연성을 제공한다.


JavaFX의 이러한 특징을 반영하는 새로운 API들은 다음과 같다.

  • generics, annotations, multithreading 지원
  • Web 개발자들이 Groovy, JavaScript와 같은 JVM 기반의 dynamic language를 이용하여 JavaFX를 쉽게 사용할 수 있도록 지원
  • Java 개발자들이 크고 복잡한 JavaFX application을 구현하기 위해 Groovy와 같은 또 다른 language를 이용할 수 있도록 지원
  • Binding 메커니즘 제공
    High performance lazy binding
    Binding expressions
    Bound sequence expressions
    Partial bind reevaluation
  • Java Collection 라이브러리를 확장하여 Observable list와 map을 지원함으로써, 어플리케이션들이 UI와 데이터모델을 효과적으로 연결할 수 있도록 함.

JavaFX의 API와 프로그래밍 모델은 JavaFX 1.x 제품라인의 연속선 상에 있다. 대부분의 JavaFX API들은 Java로 직접 포팅되었다. Layout과 Media와 같은 일부 API들은 JavaFX 1.x 버전 사용자들로부터의 피드백을 반영하여 더 개선되었다. JavaFX는 웹 표준에 대한 지원이 강화되었으며, UI 컨트롤의 스타일링을 위한 CSS와 접근 규격을 위한 ARIA 등을 예로 들 수 있다.


3. Graphics System

JavaFX Graphics System은 JavaFX Scene graph 계층 아래의 상세 구현 계층으로써, 2D와 3D scene graphic 모두를 지원하며, 그래픽장치가 하드웨어 가속 렌더링을 지원하기에 충분치 않은 경우 소프트웨어 렌더링을 제공한다.

두 가지의 그래픽 가속 파이프라인이 JavaFX 플랫폼 상에 구현되었다.

Prism
렌더링 작업을 처리하며, 3D 뿐만 아니라 하드웨어 렌더러와 소프트웨어 렌더러 모두를 지원한다. JavaFX Scene에 대한 렌더링과 래스터화 작업을 담당하며, 사용되는 장치에 따라 다음과 같이 다양한 렌더링 방법 중 하나가 선택된다.


  • DirectX 9 on Windows XP and Windows Vista
  • DirectX11 on Windows 7
  • OpenGL on Mac, Linux, Embedded
  • Software rendering - 하드웨어 가속이 불가능할 때

Quantum Toolkit
Prism과 Glass Windowing Toolkit을 함께 묶어서 JavaFX 계층에서 사용할 수 있도록 해준다. 또한 렌더링과 이벤트 핸들링에 관한 쓰레드 규칙을 관리한다.

4. Glass Windowing Toolkit

JavaFX 그래픽 계층에서 가장 낮은 레벨에 속한다. Glass Windowing Toolkit의 주 목적은 윈도우, 타이머, surface와 같은 native operating service들을 제공하기 위함이다. 따라서 이러한 서비스는 플랫폼 종속적인 형태로 제공되며, JavaFX와 OS를 연결해준다.
Glass toolkit은 이벤트큐에 대한 관리도 수행한다. 자신만의 전용 이벤트큐를 관리하는 Abstract Window Toolkit (AWT)과는 달리, Glass toolkit은 OS에서 제공하는 이벤트큐를 사용하며 JavaFX application과 같은 쓰레드에서 실행된다.


5. Threads

시스템은 어느 때이든 아래와 같은 쓰레드들 중 두 개 이상이 늘 동작한다.


JavaFX application thread
JavaFX application 개발자들에 의해 사용되는 주 쓰레드이다. 활성화된 Scene 즉 현재 윈도우의 일부인 Scene은 반드시 이 쓰레드로부터 접근되어야 한다. Scene graph는 백그라운드 쓰레드에 의해 생성되고 다루어질 수 있지만, scene graph의 root node가 활성화된 scene에 연결되었다면 그 scene graph는 JavaFX application 쓰레드로부터만 접근될 수 있다. 이러한 구조는 활성화된 scene 상에서 애니메이션이 부드럽고 빠르게 유지되는 동안, 백그라운드 쓰레드에 의해 복잡한 scene graph가 생성될 수 있도록 한다. JavaFX application thread는 Swing과 AWT의 Event Dispatch Thread와는 다르므로, JavaFX 코드를 Swing application에 임베딩시킬 때는 각별한 주의가 요구된다.


Prism render thread
이 쓰레드는 event dispatcher와는 독립적으로 렌더링을 처리하는 쓰레드로써, N+1 번째 프레임을 준비하는 동안 N 번째 프레임을 그릴 수 있도록 해준다. 이러한 동시 처리 능력은 멀티 프로세서를 장착한 요즘 시스템 상에서는 큰 장점이 된다. Prism render thread는 렌더링하는 동안 처리해야 할 off-load 작업을 돕기 위한 rasterization 쓰레드들을 여러 개 가질 수 있다.

 

Media thread
이 쓰레드는 백그라운드에서 동작하며, JavaFX application thread를 사용하여 scene의 프레임들을 동기화 시킨다.
 

6. Pulse

Pulse는 scene graph 상의 element 상태를 동기화할 시간이 되었다는 것을 나타내는 이벤트이다. 최대 60 frame per second (fps)까지 지원하며 애니메이션이 scene graph 상에서 동작할 때마다 발생한다. 애니메이션이 동작하지 않더라도 scene graph에서 무언가가 변경되었다면 pulse가 발생한다. 예를 들면, 버튼의 위치가 변경될 때 pulse가 발생한다.

Pulse가 발생할 때, scene graph 상의 element 상태가 렌더링 계층까지 동기화된다. Pulse는 어플리케이션 개발자들이 이벤트를 비동기적으로 처리할 수 있도록 해준다. 이러한 특징은 시스템이 pulse 상의 이벤트들을 일괄 처리할 수 있도록 허용한다.

Layout과 CSS도 pulse 이벤트와 관계가 있다. Scene graph에서의 많은 변화들은 지나친 layout 및 CSS 갱신을 유발할 수 있다. 이는 성능을 심각하게 떨어뜨릴 수 있다. 시스템은 이러한 성능저하를 막기 위해 pulse 당 한번씩만 처리한다.

Glass Windowing Toolkit은 pulse 이벤트들의 처리를 담당하며 이를 위해 high-resolution native timer를 사용한다.

  


댓글 없음:

댓글 쓰기