[2023 02 25] 목소리 더빙, 보이스 도와주는 프로그램 개발 연습 일지 (15) - 싱글톤 클래스 제거 및 시점 구현 - Whitmem
[2023 02 25] 목소리 더빙, 보이스 도와주는 프로그램 개발 연습 일지 (15) - 싱글톤 클래스 제거 및 시점 구현
Develop History
2023-02-25 05:40 게시 d6242347b73fcd7e1b26

0
0
84
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
렌더러의 의존성 최소화
기존에는 렌더러를 싱글톤으로 구현하여 getInstance 를 통해 호출하도록 하였으나 new 키워드를 통해 클래스를 인스턴스로 새로 생성할 수 있도록 하였다. 이렇게 수정함으로써 추후 메인 렌더 화면뿐 아니라, 다른 화면 또는 다른 렌더러에서도 동일하게 컴포넌트 렌더러, 기타 렌더러를 사용할 수 있게 되었다.
ComponentRenderer
ComponentRenderer은 외부 어디에서나 사용할 수 있는 렌더러의 집합이다. 특정 공간에 한정하지 않고 필요한 상황에 따라 렌더에 활용할 수 있다. 예를 들어 BitmapTextureRenderer은 이미지를 화면상에 띄울 수 있도록 도와주는 렌더러, FontTextureRenderer은 글자를 화면상에 띄울 수 있도록 도와주는 렌더러, HorizontalGradientBoxRenderer은 그림자를 출력하거나 그라데이션 색상을 출력할 수 있도록 도와주는 클래스로 구현하였다. SystemComponentRendererMousePerspectiveUpdater은 기본적인 시점 관리를 도와주는 렌더러로, 마우스를 통한 시점이동이 필요한 클라이언트에 사용할 수 있다. 특히 화면 좌표 이동에 대한 메모리 정보는 GraphicMemory에 담기는데, 이 그래픽 메모리 또한 직접 생성한 것을 담을 수 있도록 함으로써 특정 환경과의 의존성을 최소화하였다.
상기 GraphicMemory를 보면 기존 SingleTon 패턴이 제거되고 클래스를 직접 생성할 수 있도록 구현되어 있음을 알 수 있다.
예를 들어, 상기 MousePerspectiveUpdater는 마우스가 움직인 거리에 따라 화면 시점을 이동해주는 역할을 하고 있다. 그래픽 시점에 마우스가 이동한 정보를 반영하기 위해서는 이동한 거리 데이터가 그래픽 렌더러와 공유되어야 한다. 그러한 이동 거리 데이터를 GraphicMemory에 담고 있고, GraphicMemory에 접근함으로써 실시간으로 이동 거리를 반영할 수 있다. 초기 메인 화면만 존재하는 상황에서는 시점 정보를 담고 있는 GraphicMemory가 하나만 있더라도 getInstance()를 통해 접근해도 되지만, 창이 늘어나거나 뷰포트가 늘어나는 경우 다수 개의 GraphicMemory를 관리해야 한다. 뷰포트마다 GraphicMemory가 필요하며, 새로운 창을 개발할 떄 마다 GraphicMemory를 일일이 만들고 각 클래스의 GraphicMemory를 분기점으로 두어 일일이 작성할 수는 없는 노릇이다. 따라서 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와 연동하기
댓글 0개
댓글은 일회용 패스워드가 발급되며 사이트 이용 약관에 동의로 간주됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.