https://docs.microsoft.com/en-us/windows/win32/direct2d/resources-and-resource-domains
Direct2D 리소스는 그리기에 사용되는 개체이며 ID2D1Geometry 또는 ID2D1RenderTarget과 같은 Direct2D 인터페이스로 표시됩니다 .
이 항목에서는 Direct2D 리소스의 종류와 공유 방법에 대해 설명합니다.
About Direct2D Resources
많은 하드웨어 가속 2D API들은 CPU-focused resource model이다.
그래서 CPU에서 렌더링이 잘 작동한다.
그리하여 몇 가지 하드웨어 가속 API는 CPU 리소스와 GPU 리소스를 매핑해주는 리소스 매니저가 필요하다.
GPU의 한계로 인해 이러한 동작은 모든 상황에서 가속될 수 없다.
이러한 경우 리소스 매니저는 CPU와 GPU간 커뮤니케이션을 시켜줘 CPU 렌더링으로 전환해주는 역할을 한다.
어떤 경우에는 렌더링이 CPU로 완전히 돌아가도록 예기치 않게 강제 할 수 있다.
또한 단순해 보이는 렌더링 작업에서 API를 통해 노출되지 않고 GPU리소스가 필요한 임시 중간 렌더링 단계가 필요할 수 도 있다.
Direct2D는 GPU를 최대한 활용하기 위해 보다 직접적인 매핑을 제공한다.
Direct2D는 장치 독립적 또는 장치 종속 두 가지 종류의 리소스를 제공한다.
- 장치 독립적인 리소스는 CPU에서 유지
- 장치 종속적인 리소스는 하드웨어 가속이 가능할 때 GPU 리소스에 직접적으로 매핑된다.
렌더링 호출은 지오메트리의 정점 및 커버리지 정보를 장치 종속 리소스에서 생성된 텍스처링 정보와 결합하여 수행된다.
장치 종속 리소스를 생성하면 장치가 생성될 때 시스템 리소스 (사용 가능한 경우 GPU 또는 CPU)가 할당되며 렌더링 작업간에 변경되지 않는다.
이 상황에서는 리소스 관리자가 필요하지 않다.
리소스 관리자 제거로 일반적인 성능이 향상되는 것 외에도 장치 종속 리소스를 사용하면 중간 렌더링을 직접 제어할 수도 있다.
Direct2D는 리소스에대한 많은 제어를 제공하기 때문에 다양한 종류의 리소스와 함께 사용할 수 있는 시기를 이해해야한다.
Device-Independent Resources
장치 독립적인 리소스는 항상 CPU에 상주하며 하드웨어 렌더링 장치와 연결되지 않는다.
- ID2D1DrawingStateBlock
- ID2D1Factory
- ID2D1Geometry 및 여기서 상속되는 인터페이스
- ID2D1GeometrySink 및 ID2D1SimplifiedGeometrySink
- ID2D1StrokeStyle
장치 독립적인 리소스인 ID2D1Factory를 사용하여 장치 독립적인 리소스를 만든다.
렌더 타깃을 제외하고 Factory에서 생성된 모든 리소스는 장치 독립적이다. (렌더 타깃은 장치 종속적인 리소스)
Device-Dependent Resources
장치 종속 리소스는 특정 렌더링 장치와 연결된다.
하드웨어 가속을 사용할 수 있는 Device는 GPU이고 그렇지 않다면 CPU이다.
대부분의 장치 종속적 리소스를 생성할 때 렌더 타깃을 사용한다.
렌더 타깃을 생성하기 위해서는 factory를 사용한다.
장치 종속 리소스의 예
- ID2D1Brush : 렌더타깃을 이용해 생성
- ID2D1Layer : 렌더타깃을 이용해 생성
- ID2D1RenderTarget : 렌더 타깃을 생성하기 위해서 factory를 사용하거나 다른 렌더 타깃을 사용한다.
장치 종속 리소스는 연결된 렌더링 디바이스가 사용할 수 없게 될 때 쓸모없어지게 된다.
이는 당신이 렌더타깃에 대해 D2DERR_RECREATE_TARGET 에러를 수신할 경우 렌더타깃과 모든 리소스를 다시 생성해야 한다는 것을 의미한다.
Sharing Factory Resources
factory에서 생성한 장치 독립적 리소스는 같은 factory가 생성한 모든 다른 리소스(디바이스 독립, 종속 모두)와 공유할 수 있다.
예를 들어 만약 같은 factory에서 생성된 것이라면 이 2개의 ID2D1RenderTarget을 사용하여 같은 ID2D1RectangleGeometry에 그릴 수 있다.
싱크 인터페이스 ( ID2D1SimplifiedGeometrySink , ID2D1GeometrySink 및 ID2D1TessellationSink)는 모든 factory에서 만든 리소스와 공유 할 수 있다.
Direct2D의 다른 인터페이스와 달리 싱크 인터페이스의 모든 구현을 사용할 수 있다.
Sharing Render Target Resources
렌더 타깃에서 만든 리소스를 공유하는 기능은 렌더타깃의 종류에 따라 다르다.
D2D1_RENDER_TARGET_TYPE_DEFAULT 유형의 렌더타깃을 만들 때 해당 렌더타깃에서 만든 리소스는 해당 렌더타깃에서만 사용할 수 있다.
이는 렌더타깃이 사용하게 될 장치를 모르기 때문에 발생한다.
다음 섹션에서는 하나의 렌더 타깃에서 만든 리소스를 다른 렌더 타깃과 공유할 수 있는 상황에 대해 설명한다.
Hardware Render Targets
원격 모드가 호환된다면 모든 하드웨어를 사용하는 렌더타깃 사이에서 리소스를 공유할 수 있다.
원격 모드는 오직 렌더타깃이 둘 모두 D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTING 또는 D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE usage flag를 사용할 때
또는 둘 다 flag를 지정하지 않았을 때만 서로 호환되는 것을 보장해준다.
이러한 설정은 리소스가 항상 같은 컴퓨터에 위치할 것을 보장해준다.
사용 모드를 지정하려면 렌더타깃을 생성하는데 사용하는 D2D1_RENDER_TARGET_PROPERTIES 구조체의 usage filed를 하나 이상의 D2D1_RENDER_TARGET_USAGE flags를 지정해야 한다.
DXGI Surface Render Targets
DXGI surface render target에 의해 만들어진 리소스는 동일한 기본 Direct3D device를 사용하는 또 다른 DXGI surface render target과 공유할 수 있다.
Compatible Render Targets and Shared Bitmaps
렌더타깃과 해당 렌더타깃에 의해 생성된 호환 가능한 렌더타깃 간에 리소스를 공유할 수 있다.
호환되는 렌더타깃을 만들려면 ID2D1RenderTarget :: CreateCompatibleRenderTarget 메서드를 사용한다.
ID2D1Bitmap을 생성하기 위해 ID2D1RenderTarget::CreateSharedBitmap 메서드를 사용할 수 있고 메서드가 성공하면 메서드 호출에 지정된 두 렌더타겟 사이에서 ID2D1Bitmap이 공유될 수 있다.
이 메서드는 두 렌더타깃이 렌더링이 동일한 기본 device를 사용한다면 정상적으로 수행된다.
'DirectX > Direct2D,DirectWrite' 카테고리의 다른 글
Direct2D and Direct3D Interoperability Overview (0) | 2021.05.03 |
---|---|
Text Rendering with Direct2D and DirectWrite (0) | 2021.04.30 |
Tutorial: Getting Started with DirectWrite (0) | 2021.04.23 |
Direct2D Hello World Sample (0) | 2021.04.22 |
Creating a Simple Direct2D Application (0) | 2021.04.22 |