Wednesday, May 25, 2011

Module's Common Interface

모듈은 function이 정의되어 있는 레고의 블록으로 정의할 수 있다.
이것이 의미하는 것은 레고에서 블록을 조합하여 하나의 시나리오를 갖는 큰 블록을 만들 수 있으며 큰 블록을 조합하여 하나의 완결된 스토리를 갖는 완성품을 쉽게 만들 수 있다는 것이다.

이를 위해 생각해야 할 것은 모듈의 "독립성"이다.
그러나 아이러니 하게도 독립적 모듈을 쉽게 조립/조합하기 위해선 하나의 공통된 자료구조가 정의되어 있어야 하고 이것에 의존해야 한다.
마치 레고의 모양은 형형색색 다르지만 접합하는 부분은 쉽게 끼우고 뺄 수 있도록 모든 블록이 통일된 것을 생각해 보면 쉽게 이해할 수 있다.

이러한 이해를 바탕으로 실제 모듈 통합을 염두에 둔 모듈 설계를 해 보면 하나의 궁극적 딜레마에 빠지게 된다. 그것은 바로 모듈 독립성의 범위와 모듈 인터페이스 및 Helper를 위한 공통 자료구조를 어디까지 정의할 것인가에 대한 것이다.

지난 오랜 시간의 경험을 통해 이 딜레마에서 가장 우선적으로 고려해야 할 것은 기능의 확장성과 유연성에 있음을 깨닫게 되었다. 이는 비단 본인의 경험뿐만 아니라 뭇 선현들에 의해서도 입증이 된 것인데, VXFramework에서는 이를 위해 모든 모듈의 interface를 완벽히 동일하게 정의하고 interface를 위한 자료구조를 타협할 수 있는 수준에서 추상화하는 방법을 선택하였다.

물론 "타협할 수 있는 수준"은 어디까지나 이를 설계하는 사람의 역량과 경험에 의해 결정되겠지만 지금 생각해 보면 Object과 Script화된 Parameter의 사용은 최상의 선택인 것 같다. 물론 이것이 추상화된 것만큼 모듈을 사용하는 component의 작업이 괴로워질 수 있으나 이 역시 합리적인 수준에서 마무리된 것으로 보인다.

VXFramework은 이 합리적인 수준을 위해

  • 모듈의 common interface로 모듈에 들어오는 추상화된 인자를 구체화하여 확인하는 interface
  • 최초/최후 모듈이 실행될 때 호출되는 interface
  • 임의로 모듈과 통신할 수 있는 interface
  • 모듈의 core 실행을 위한 interface
위의 interface 방식을 사용하였다.

다음은 VXFramework에서 정의한 Module's Common Interface 이다.

이렇게 추상화된 interface를 효과적으로 사용하기 위해선 플랫폼에 가까운 상위 interface에서 직관적이고 구체적으로 정의된 인자를 이에 맞게 변환하여 주는 똑똑한 Wrapper / Arbiter가 정의되야 한다.

여기선 '똑똑한' 정의를 다음으로 미루며 위와 같은 Module's Common Interface가 VXframework에서 정의되어 있다는 것까지 정리하도록 한다.

Tuesday, May 24, 2011

Add new Module

VXFramework에서 엔진 모듈은 모두 DLL 로 이루어져 있다. Native COM 구조에서는 Module Arbiter 라는 클래스가 VXFramework의 Native API 에서 지정되는 모듈을 관리한다.

Managed Frame 까지 포함될 경우 개발자 편의를 위해 설계한 VXSceneStory 및 VXFunctionScenario의 자료구조에 다음의 네 가지로 나눈 모듈에 따라
  • OTF Generator
  • Reconstructor
  • Renderer
  • VObject Generator
CLI-Layer 에서 정의된 Interoperation 단계에서 Native API 에 사용 모듈의 그룹과 함께 각종 Parameter를 넘겨 주도록 되어 있다.

먼저 DLL 솔루션으로 정의되는 모듈을 VXFramework 에 추가하기 위해, 다음의 단계를 따른다.
  1. Platform 에서 사용될 모듈을 지정하고 있는 text list(Platform을 build 할 때 binary로 추가됨)에 모듈 Name과 ID를 추가한다.
  2. Platform frame에서 모듈을 명시적으로 사용하기 위해 Managed 자료구조에 Module enumeration을 추가한다. (명시적으로 사용하지 않고 ID 로만 사용할 수도 있음.)
  3. 추가된 enumeration을 바탕으로 모듈의 행동을 검사하는 Engine Commander Center 의 코드를 추가한다. (해당 플랫폼에서 사용되지 않더라도 추가된 history가 있으면 언제든 사용 가능.)

VXFramework은 모듈 SDK로서의 기능과 플랫폼 SDK로서의 기능을 고려하여 만든 Library 이므로, 모든 Frame(Platform Frame, Engine Frame,  Module Frame)을 각각 독립적 솔루션으로 구성하였다.

하여, 위의 단계를 통해 추가된 모듈을 Platform 에서 사용하게 되었으면 모듈 개발을 위해 VXFramework을 SDK library로 활용하기 위한 프로젝트 세팅이 필요하다.

다음은 VS2010 에서의 프로젝트 생성 및 설정을 위한 방법이다.


  1. Native C/C++ 기반으로 빈 프로젝트를 만든다.
  2. VXFramework의 Native 자료구조 및 Helper를 사용하기 위한 Main Header를 include한다.
  3. DLL에 대한 function import를 위한 키워드로 vxstatic 을 정의하고 모든 엔진 모듈에서 정의된 Function을 선언한다.
  4. 프로젝트 설정을 통해, 모듈을 DLL로 설정하며 모듈에서 사용할 Static 및 Dynamic Library를 위한 Link 설정을 한다.
  5. DLL 프로젝트의 Entry Point 로서의 플랫폼을 설정하고, 기타 프로젝트 생성 파일에 대한 폴더를 지정한다.
  6. 이를 x86/64, Debug/Release에 대해 적절히 설정한다.

<프로젝트 설정>

현재 버젼은 Frame의 Math Helper로 DX9Math.lib을 사용하여 D3dx9.lib을 Link를 위한 Library로 추가하였지만 그 외의 DirectX 를 기본 자료구조로 삼고 있지 않으므로 DirectX SDK가 반드시 깔려 있을 필요는 없다. (이 경우 물론 D3dx9.lib 및 D3dx9math.h 는 있어야 한다.)
또한 특정 라이브러리 및 OS 플랫폼에 대한 종속성이 없으므로 CUDA 및 OpenGL, DirectX 등 여러 Library를 Static 이든 Dynamic 이든 프로젝트 설정에 적절히 추가하여 사용할 수 있다.

    Monday, May 23, 2011

    VXSceneStory and VXFunctoinScenario

    VXFramework에서 Platform의 직속 Component에 유저 컨트롤에 따른 Function Parameter를 효율적으로 전달하기 위해 무엇을 해야 하는가?
    VXFramework의 Managed Frame을 처음 설계할 때 머릿속을 늘 맴돌던 질문이었다.
    이 질문에 대한 답을 얻기 위해 그 동안의 경험을 바탕으로 내린 자료 구조는 다음을 만족해야 했다.
    • 계속되는 요청 사항 및 기능 개선에 대응하기 위해 확장 가능한 Parameter의 자료 구조
    • 잦은 Parameter 변동에서 야기되는 Function Interface의 재정의 방지를 위한 자료구조
    • 단일 모듈이 아닌 다양한 모듈의 조합을 위한 자료구조
    그리고 생각해 낸 것이 VXSceneStory 와 VXFunctionScenario 이다.

    사실 여러 CAD 프로그램을 보면, 삼차원 상에 여러 객체를 조작하기 위해 Main Stage(또는 Scene)을 정의하게 된다. VXFramework도 큰 범주로 보자면 이런 부류이므로 Main Scene과 Scene을 이루는 각종 객체가 계층적으로 정의되야 함은 자명한 사실이다.

    그렇다면 이 객체 간의 계층을 어떻게 구성해야 하며, 기왕이면 Volume Processing에 특화되면서 일반 CAD와의 호환성도 보장할 수 있는 구조는 어떻게 이루어져야 하는가 하는 질문에 도달하게 된다.

    이를 위해 VXFramework에서는, 단순히 보여 주는 것 외에도 각종 데이터를 처리하는 "동작"을 Scene과 이를 이루는 객체 정의의 핵심으로 두었다. 그리고 이것을 바탕으로, 고안해 낸 것이 바로 객체(들)의 동작을 정의하는 Scenario이며, 이것들의 구성을 통해 Scene의 동작을 정의하는 Story라는 개념을 도입하였다.

    이것이 바로 VXFunctionScenarioVXSceneStory 이다.

    VXFunctionScenario 은 동작 모듈 ID, 모듈 동작을 위한 Custom Parameter, 모듈에서 사용될Resource들의 ID로 정의된다. VXSceneStory 는 이러한 VXFunctionScenario 들을 List로 갖고 있는 자료구조이며 각각은 편한 코딩을 위해 Helper를 제공하도록 구현되었다.

    참 쉽죠잉~

    Sunday, May 22, 2011

    VXFramework Overview

    VXFramework은 다음의 세 가지 Frame으로 구성된다.

    1. Engine Frame

    • Engine API for platform developer
    • File Interface for importing and exporting data
    • Data Structures for module development and resource management
    • Module Arbiter and Resource Manager

    2. Module Frame

    • Base Interface Module Arbiter and Module
    3. Platform Frame

    • CLI wrapper to convert C++ based-API into C# interface
    • Global Header for Helper functions and Based Objects
    • Engine Center for native resource/module items (as symbol) and engine commander based on CLI wrapper
    • Common Controls for engine manipulation UI
    • Main Window for integration (G)UIs

    Engine Frame은 Engine Module 및 플랫폼 프로세싱의 대상이 되는 Resource를 관리하는 역할을 하며, Module Frame은 Engine Module을 정의한다.
    그리고 Platform Frame은 VXFramework 을 통해 구현하고자 하는 최종 Platform을 효율적으로 설계하기 위해 Native와 Managed Code의 Interoperation을 해 주고, 각종 사용자 컨트롤을 위한 Component로 구성되어 있다.

    VXFramework에서는 자유도 높은 Function의 확장성 뿐만 아니라, 주로 사용하게 되는 방대한 용량의 Resource를 효율적으로 관리하기 위해 C#의 TreeViewItem을 상속 받는 ObjectTreeViewItem 이라는 자료구조를 정의하고 이를 단위로 Resource를 컨트롤한다.

    이것은 WPF에서 제공하는 Object Browser인 TreeView 를 사용하여 현재 Resource 상황을 다음과 같이 확인할 수 있다.


    Tree Item의 상속관계는 Resource 를 Platform의 Contents로 어떻게 사용하느냐에 따라 다르게 설계될 수 있으며 Resource에 대한 ObjectTreeViewItem 설정 및 해제는 다음의 규칙을 따른다.

    • Item 추가 : Native에 존재하고 있는 Resource를 Item으로 추가하여 Tree View에서 Story에 적합한 상속 구조를 구성할 수 있으며 이 경우 Native Resource ID를 Item이 공유하게 된다.
    • Item 삭제 : 현재 노드 및 하위 노드의 모든 Item 을 recursive하게 삭제한다. Native Resource는 Reference Count 방식을 통해, 해당 Resource를 참조하고 있는 Item이 하나일 경우일 때만 삭제되어 최종적으로 메모리에서 제거된다.

    VXFramework 은 위대하다. -_-b

    Saturday, May 21, 2011

    Managed code VS Native code

    기존의 JAVA 를 선두로 익히 알려진 Managed 진영에 MS의 .net framework 이 발전하면서 Managed 언어는 프로그램의 양과 질, 두 마리 토끼를 모두 취할 수 있는 좋은 방법이 되었다. 특히 많은 개발자들이 (비)상용으로 수많은 관련 library를 공개함으로써 이것은 어느덧 대세가 되었다.

    그러나 굉장히 성능에 민감한 하위 레벨 엔진을 구현하는 본인로서는 Managed 보다 훨씬 가볍고 최적화가 유리한 Native C/C++ 코드를 메인 언어로 사용해 왔고, 이것에 대해 확신과 자부심을 갖고 있었다.

    그러나 엔진뿐만 아니라, 모듈의 통합 및 구성, 유저 시나리오를 포함하는 콘텐츠로 이루어진 "Platform"까지 만들어야 하는 상황으로 인해 시간과 노력이라는 한계에 봉착하고 말았다. 그러던 중 Native 와 Managed Code 간 Interoperation를 알게 되었고, 하위 레벨 엔진에서부터 상위 레벨 콘텐츠까지 지원할 수 있는 진정 OOP 다운 Library를 설계할 수 있게 되었다. (Thanks for Jun)

    Native Code 기반은 기존에 해왔던
    • 굉장히 성능에 민감한 엔진 : Rendering module, Volume Generating Module 등...
    • 엔진 모듈 관리
    • 현재 Managed 로 지원하지 않거나 최적화 시나리오가 난해한 Resource 관리
    부분을 주로 담당하게 하였으며, 이를 바탕으로 순수히 Native 로만 하나의 플랫폼을 완성할 수도 있도록 아래의 사항에 집중을 많이 했다.
    • Volume Processing에 특화된 자료 구조의 객체화
    • 모듈을 위한 Helper Functions
    • API의  직관적 구성 및 COM 구조화
    • 모듈 추가 및 수정을 독립적으로 할 수 있도록 DLL 로 솔루션 구성
    • 모듈의 OS 및 SDK 종속성에 대한 자유도 보장을 위한 기본 자료 구조 사용
    <Native & CLR Interface>

    Managed code 기반에서는, 플랫폼을 구성하는 콘텐츠로 End User와 모듈 엔진을 이어 주는 Component 가 주를 이루게 하여 다음을 구현하도록 하였다.
    • Native Engine API 와 연동되는 Managed Engine Command Center (ECC)
    • ECC 기반으로 GUI 를 통해 모듈 조작을 돕는 Common Control
    • ECC 및 Common Control을 정의하기 위한 Managed 자료구조
    • ECC 및 Common Control에 User Scenario를 더한 1차적 Custom Platform 인 View

    <Managed Data Structure & API>

    Managed 부분의 GUI 부분은 C++ 에서 MFC 에 해당하는 WPF 기반으로 구현되었으며, 이것은 Silver Light 의 슈퍼셋으로 약간의 수정을 통해 추후 Web 기반 플랫폼으로 전이가 용이하다는 점에 굉장히 매력적 옵션이다.

    이것을 생각하고 구현하는데 대략 1달이라는 시간이 소요되었으며, 이를 바탕으로 효율적인 Contents를 구성하기 위해 Managed 부분의 Function 자료구조를 생각하게 되었는데 이는 다음에 이야기하도록 하겠다.

    Once again Thx for Jun

    Friday, May 20, 2011

    4주 훈련 후

    4주간의 전문연구원 훈련을 논산에서 마치고 온지 어느덧 2일째.
    무한 인터넷 서핑을 하면서 드디어 현실로 복귀했구나 하는 생각이 든다.
    지금 생각해 보면 정말 일순간의 꿈처럼 논산에서의 4주 훈련이 스쳐 지나간다.
    참... 많은 것들이 생각이 나지만 훈련소 마지막날 아침 산 너머 보이던 일출의 광경은 평생 잊을 수 없을 것 같다.


    그리고 환복의 쓰라림... /-.- 추...웅 썽!