렌더러의 의존성 최소화
기존에는 렌더러를 싱글톤으로 구현하여 getInstance 를 통해 호출하도록 하였으나 new 키워드를 통해 클래스를 인스턴스로 새로 생성할 수 있도록 하였다. 이렇게 수정함으로써 추후 메인 렌더 화면뿐 아니라, 다른 화면 또는 다른 렌더러에서도 동일하게 컴포넌트 렌더러, 기타 렌더러를 사용할 수 있게 되었다.
ComponentRenderer
ComponentRenderer은 외부 어디에서나 사용할 수 있는 렌더러의 집합이다. 특정 공간에 한정하지 않고 필요한 상황에 따라 렌더에 활용할 수 있다. 예를 들어 BitmapTextureRenderer은 이미지를 화면상에 띄울 수 있도록 도와주는 렌더러, FontTextureRenderer은 글자를 화면상에 띄울 수 있도록 도와주는 렌더러, HorizontalGradientBoxRenderer은 그림자를 출력하거나 그라데이션 색상을 출력할 수 있도록 도와주는 클래스로 구현하였다. SystemComponentRenderer의 MousePerspectiveUpdater은 기본적인 시점 관리를 도와주는 렌더러로, 마우스를 통한 시점이동이 필요한 클라이언트에 사용할 수 있다. 특히 화면 좌표 이동에 대한 메모리 정보는 GraphicMemory에 담기는데, 이 그래픽 메모리 또한 직접 생성한 것을 담을 수 있도록 함으로써 특정 환경과의 의존성을 최소화하였다.
화면 정보의 공유
마우스 좌표를 처리하고 계산하기 위해서는 현재 마우스 좌표를 가져와 뷰포트의 어느 공간 및 좌표에 존재하는지 계산할 필요가 있었다. 하지만 화면을 렌더링하는 클래스는 따로 분류되어 있기 때문에 UI에서 화면의 크기, 화면의 위치 정보를 가져오기는 불가능했다. 정 가져오기 위해서는 싱글톤이나 화면 크기 정보를 렌더러 매개변수로 넘기는 방법을 사용할 수 있지만, 유지보수성에 용이하지 않거나 비효율적인 방법이다. 따라서 Delegator을 통해서 GraphicMemory를 생성하고 등록할 때 ControlPositionDelegator 을 통해서 UI 의 대리자를 넘길 수 있도록 하였다. 예를 들어 Renderer 안에서 마우스 좌표나 클릭 정보가 필요할 때 Memory 내에 있는 ControlPositionDelegator 을 통해 요청하면, UI에 GraphicMemory을 생성할 때 등록해둔 Delegator을 통해서 데이터가 반환된다. 즉 Renderer 클래스에서 직접 UI 클래스에 접근할 필요 없이, 메모리 클래스안에 대리자를 넣음으로써 추후 getter 메소드를 수정하더라도 정적인 메모리 클래스를 건드는 것이 아닌 UI에 등록할 때의 대리자(인터페이스)를 구현한 클래스를 수정하면 된다.
RendererLayerConfiguration
다수의 정적 렌더러가 있으면 이 렌더러들을 호출하는 부분이 필요하다. 예를 들어 배경을 출력하고, 선을 출력하고, 시간을 출력하는 작업이 필요하다. Class가 늘어남에 따라서 메인 Renderer에서는 다수 개의 클래스를 선언하고 렌더 때 마다 호출 해 줘야하는데, 속 렌더러 클래스가 만들어질 때 마다 인스턴스를 만들어서 render()을 호출 해 주기에는 너무 비 효율적이라고 생각되어 동적으로 클래스를 추가하고 제거할 수 있도록 하였다. 그리고 렌더시에는 List에 쌓인 클래스를 순차적으로 render() 함으로써 순서대로 요청을 보낼 수 있도록 하였다. 특히 이 작업은 추후 메인 클래스뿐만 아니라 새로운 보조 (다른 뷰포트)렌더러에서도 활용할 수 있도록 상속 관계로 만들어 두었고, 렌더러 클래스를 등록하고 관리하는 작업은 RendererLayerConfiguration 클래스에서 담당하도록 하였다.
다음 목표
트랙 바 및 오브젝트 출력 렌더러 구현 및 실제 PD Layer와 연동하기