레이블이 Component Object Model인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Component Object Model인 게시물을 표시합니다. 모든 게시물 표시

2018년 1월 13일 토요일

COM and Direct3D

COM and Direct3D


이 글을 보기 전에 COM에 대한 다음 링크의 내용을 우선 읽어보기 바란다.


링크된 글에서 볼 수 있듯이 COM은 Component Object Model 의 약자이다. COM은 매우 발전된 잘 만들어진 오브젝트를 만드는 방법중 하나이다. 이는 마치 레고 블럭과 같다.


아시다시피 레고 블럭은 그 각각이 규격화 된 모양들로 이루어 지며 이러한 각각의 모양들을 서로 맞추어 다양한 커다란 구조를 만들어 낸다.
레고 블록의 각각 객체들은 서로 다른 부분에 대한 내부적인 내용을 신경 쓸 필요 없으며 단지 각각의 연결에 대한 규격만 맞추면 된다. 만약 어떤 조각을 바꾸고 싶다면 해당 조각을 빼내고 다른 조각을 연결하면 된다.
이런 조각들은 서로 호환이 가능하지만 그 스스로는 어떠한 일을 할 수 없기 때문에 서로 조립 되어야 한다.


COM 객체는 C++의 클래스 또는 이러한 클래스들을 체계적으로 그룹화하여 함수을 호출하는 방식으로 조립 될 수 있다. 어떠한 클래스도 서로 다른 클래스의 내부를 관여할 필요는 없으며 필요에 의하여 붙고 때어낼 수 있는 플러그인 구조를 제공하게 된다.


이러한 방식은 어떠한 기능을 개선하거나 교체할 필요가 있을때 해당 플러그인만 교체하면 전체적인 어플리케이션을 교체하지 않아도 업그레이드가 가능하다는 것이다.


Direct3D 프로그래밍을 하는데 있어서 COM의 내부 구조까지 깊숙히 알아야 할 필요는 없다. 그 구조는 매우 복잡할 수 있으며 이에 대한 자세한 내용을 알 필요는 없다.


Direct3D 는 DirectX 기술에 기인하며 이는 COM 기반으로 제공된다. Direct3D 의 내부는 또 다른 COM을 사용하는 COM 객체이다. 궁극적으로 여기에는 소프트웨어, 하드웨어, 또는 기타 어떤것이 됬든 2D 및 3D 그래픽을 실행하는데 필요한 모든 것이 포함되어 있다는 것이다.


device->CreateRenderTargetView()


device->Release()


위와 같은 코드를 살펴보자.
device 라는 객체는 Direct3D에서 생성된 객체로 이는 다수의 호출 가능한 멤버 함수들로 인터페이스를 구성하고 있다. 이러한 함수 내부에서 작동하는 코드는 매우 복잡하며 우리가 신경쓸 필요는 없다. 단지 이러한 함수들의 사용법에만 집중하면 된다.


COM이 내부적으로 동작하는 일은 매우 복잡하며 이들에 대하여 다 알 필요는 없으며 단지 다음과 같은 내용을 숙지하기 바란다.


  1. COM 객체는 인터페이스에 의해 제어되는 클래스 또는 클래스 집합이다. 인터페이스는 COM 객체를 제어하는 일련의 함수이며 위에 예제에서 “device”는 COM 객체이고 CreateRenderTargetView(), Release() 와 같은 함수를 호출하여 이를 제어할 수 있다는 것이다.
  2. 각 유형의 COM 객체는 고유한 ID를 갖는다. 예를 들어, Direct3D 객체는 고유한 ID를 가지며 DirectSound 객체는 이에 해당하는 고유 ID를 갖는다는 것이다. Direct3D 프로그래밍을 하다 보면 이러한 고유한 ID 를 사용해야 할 경우가 많이 있게 된다.
  3. COM 객체를 사용한 후에는 Release() 함수를 호출해 주어야 한다. 그러면 해당 객체는 메모리를 해제하고 해당 스레드를 닫을 것이다.
  4. COM 객체는 일반적으로 “ID3D10Device” 와 같이 “I” 라는 문자(i 의 대문자)로 시작하기 떄문에 쉽게 식별할 수 있다.

COM 의 이해

COM 의 이해


COM (Component Object Model)의 뜻에서도 알 수 있듯이 Component 규약을 따르는 Microsoft 사가 주체가 되어 만든 표준 모델이다.


Component 규약이란 컴파일러의 종류와 관계 없이 Component 규약에 따라 제작된 Component들은 어떤 컴파일러에서도 그 파일을 사용할 수 있도록 하는 규약이다.


이러한 Component 규약을 따르는 표준들에는 COM, CORBA, EJP, .NET 등이 있다.


이들중 COM 이 가장 많이 사용되고 있고, 닷넷은 Microsoft 사가 개발한 차세대 Component 기술이다.


COM은 Component규약을 지원하며 추가로 네트워크 통신을 지원하여 만든 표준이라고 보면 된다.


COM의 특징은 다음과 같다.


  1. 언어의 독립성
  2. 위치의 투명성
  3. 벤더 독립성
  4. 버전 문제 최소화


여기서 가장 중요한 것은 언어의 독립성과 위치의 투명성이다. 나머지 분야는 크게 신경쓰지 않아도 되는 내용이다.


Component 규약은 언어의 독립성을 위하여 Interface라는 기법을 정의해 준다.
이는 서버 프로그램 작성시 내부 구조와는 상관이 없고 Interface라는 방식으로 클라이언트가 접근하도록 하는 구성이다.
이러한 이유에 근거하여 COM을 지원하는 어떠한 언어로도 접근이 가능하도록 하는 것이다.


COM Server 프로그램을 제작하는 방식에는 DLL과 EXE가 있다.

DLL 형태로 제작하면 In-Process Server가 되고, EXE 형태로 제작하면 Out-Process Server가 된다.

대부분 In-Process Server 방식을 사용하나 Out-Process Server로 만드는 경우도 있다.

Client 프로그램의 위치와 상관 있는 것이 아니라 같은 PC에서 Server와 Client를 제작할 경우 In-Process Server의 경우 Client의 문제에 의해 Server에도 그 문제가 파급될 수가 있고
Out-Process Server의 경우 Client의 문제가 Server로 파급되지 않는다는 차이점만 있다.

만약 Client 프로그램이 다른 PC에 위치할 때 In-Process Server의 경우 dllhost.exe라는 대리 프로세스에 의해 지원이 되고, 이 경우 Client의 문제가 Server로 파급되지 않는다

ATL(Active Template Library)은 COM 프로그래밍을 쉽게 하기 위해 Visual C++에서 제공하는 라이브러리이다.

COM이 지원하는 Interface에는 Custom Interface와 Automation Interface가 있다.

일반적으로 지원하는 Custom Interface는 Visual Basic Script등 Script언어에서 지원이 불가능하고 컴파일 언어에서만 지원이 가능하다.

따라서 Script 언어에서 지원이 가능하도록 하는 Interface가 Automation Interface인데 대부분 이 두가지를 모두 지원하는 Dual Interface로 프로그램을 제작한다.


COM 기술에 Automation을 지원하고 GUI(Graphic User Interface)를 추가로 지원한 것이 ActiveX이다.

ActiveX를 작성하는 방식에는 MFC를 이용하는 방식과 ATL을 이용한 방식이 있다.
ATL을 이용하여 ActiveX Control을 제작하면 MFC를 이용하는 방식보다 다소 어렵기는 하나 작고 빠른 코드를 생산할 수 있는 장점이 있어 더 많이 사용되고 있다.

개인적 견해로는 컴퓨터와 네트워크의 발전으로 작고 빠른 코드를 생산할 수 있다는 장점은 크게 중요하다고 생각하지 않고, 그보다는 많은 사람들이 사용하는 방식이라는 점(소스 및 자료를 더 쉽게 구할 수 있다)이 더 큰 장점이라고 생각된다.

다음은 위키에서 말하는 COM 설명이다.

컴포넌트 오브젝트 모델(Component Object Model, COM)은 마이크로소프트가 개발한 소프트웨어 구성 요소들의 응용 프로그램 이진 인터페이스이다. 마이크로소프트가 1993년에 소개하였다. COM을 이용해 개발된 프로그램들은 프로세스간 통신과 동적 오브젝트 생성이 가능하다. 소프트웨어 개발에서는 COM이라는 용어를 종종 OLE, OLE 자동화, ActiveX, COM+, DCOM 기술을 포함하는 포괄적 개념으로 사용한다. COM이 소개된 건 1993년이지만, 마이크로소프트는 1997년이 되어서야 COM이라는 이름을 강조하기 시작했다.
다양한 플랫폼에서 COM이 구현되었지만, 주로 마이크로소프트 윈도에서 사용된다. COM은 닷넷 프레임워크와 같은 다른 기술로 대체되리라 전망된다.


Vertex , 정점 정보의 확장

Vertex , 정점 정보의 확장 그동안의 설명에 있어서 우리는 VERTEX 정보에 대하여 3 차원의 위치 정보만 사용하였다. struct VERTEX {float x,y,z;}; 이제 이를 확장하여 색상을...