리소스 개요

Direct2D 리소스는 그리기에 사용되는 개체이며 ID2D1Geometry 또는 ID2D1RenderTarget과 같은 Direct2D 인터페이스로 표시됩니다. 이 항목에서는 Direct2D 리소스의 종류와 공유 방법에 대해 설명합니다.

이 항목에는 다음과 같은 섹션이 포함되어 있습니다.

Direct2D 리소스 정보

많은 하드웨어 가속 2D API는 CPU 중심 리소스 모델과 CPU에서 잘 작동하는 렌더링 작업 집합을 중심으로 설계되었습니다. 그런 다음 API의 일부가 하드웨어 가속입니다. 이러한 API를 구현하려면 CPU 리소스를 GPU의 리소스에 매핑하기 위한 리소스 관리자가 필요합니다. GPU 제한으로 인해 모든 상황에서 일부 작업이 가속화되지 않을 수 있습니다. 이러한 경우 리소스 관리자는 CPU 렌더링으로 전환할 수 있도록 CPU와 GPU(비용이 많이 드는) 간에 통신해야 합니다. 경우에 따라 렌더링이 CPU로 완전히 대체되도록 예기치 않게 강제 적용할 수 있습니다. 또한 단순하게 표시되는 렌더링 작업에는 API에 노출되지 않고 추가 GPU 리소스가 필요한 임시 중간 렌더링 단계가 필요할 수 있습니다.

Direct2D는 GPU를 최대한 활용하기 위한 보다 직접적인 매핑을 제공합니다. 디바이스 독립적 리소스와 디바이스 종속 리소스의 두 가지 범주를 제공합니다.

  • ID2D1Geometry와 같은 디바이스 독립적 리소스는 CPU에 유지됩니다.
  • ID2D1RenderTargetID2D1LinearGradientBrush와 같은 디바이스 종속 리소스는 GPU의 리소스에 직접 매핑됩니다(하드웨어 가속을 사용할 수 있는 경우). 렌더링 호출은 기하 도형의 꼭짓점 및 검사 정보를 디바이스 종속 리소스에서 생성된 텍스처 정보와 결합하여 수행됩니다.

디바이스 종속 리소스를 만들 때 디바이스를 만들 때 시스템 리소스(GPU, 사용 가능한 경우 또는 CPU)가 할당되고 한 렌더링 작업에서 다른 렌더링 작업으로 변경되지 않습니다. 이 경우 리소스 관리자가 필요하지 않습니다. 리소스 관리자를 제거하여 제공되는 일반적인 성능 향상 외에도 이 모델을 사용하면 중간 렌더링을 직접 제어할 수 있습니다.

Direct2D는 리소스에 대한 많은 제어를 제공하므로 다양한 종류의 리소스와 리소스를 함께 사용할 수 있는 시기를 이해해야 합니다.

Device-Independent 리소스

이전 섹션에서 설명한 대로 디바이스 독립적 리소스는 항상 CPU에 상주하며 하드웨어 렌더링 디바이스와 연결되지 않습니다. 다음은 디바이스 독립적 리소스입니다.

디바이스 독립적 리소스인 ID2D1Factory를 사용하여 디바이스 독립적 리소스를 만듭니다. (팩터리를 만들려면 CreateFactory 함수를 사용합니다.)

렌더링 대상을 제외하고 팩터리에서 만든 모든 리소스는 디바이스 독립적입니다. 렌더링 대상은 디바이스 종속 리소스입니다.

Device-Dependent 리소스

이전 목록에서 이름이 지정되지 않은 리소스는 디바이스 종속 리소스입니다. 디바이스 종속 리소스는 특정 렌더링 디바이스와 연결됩니다. 하드웨어 가속을 사용할 수 있는 경우 해당 디바이스는 GPU입니다. 다른 경우에는 CPU입니다.

대부분의 디바이스 종속 리소스를 만들려면 렌더링 대상을 사용합니다. 대부분의 경우 팩터리를 사용하여 렌더링 대상을 만듭니다.

다음은 디바이스 종속 리소스의 예입니다.

  • ID2D1Brush 및 ID2D1Brush 에서 상속되는 인터페이스입니다. 렌더링 대상을 사용하여 브러시를 만듭니다.
  • ID2D1Layer. 렌더링 대상을 사용하여 레이어를 만듭니다.
  • ID2D1RenderTarget 및 ID2D1 에서 상속되는 인터페이스입니다. 렌더링 대상을 만들려면 팩터리 또는 다른 렌더링 대상을 사용합니다.

참고

Windows 8 시작하여 디바이스 종속 리소스를 만드는 새 인터페이스가 있습니다. 디바이스 컨텍스트와 리소스가 동일한 ID2D1Device에서 만들어진 경우 ID2D1Device 및 ID2D1DeviceContext는 리소스를 공유할 수 있습니다.

 

연결된 렌더링 디바이스를 사용할 수 없게 되면 디바이스 종속 리소스를 사용할 수 없게 됩니다. 즉, 렌더링 대상에 대한 D2DERR_RECREATE_TARGET 오류가 발생하면 렌더링 대상 및 모든 리소스를 다시 만들어야 합니다.

팩터리 리소스 공유

팩터리에서 만든 모든 디바이스 독립적 리소스를 동일한 팩터리에서 만든 다른 모든 리소스(디바이스 독립적 또는 디바이스 종속)와 공유할 수 있습니다. 예를 들어 두 ID2D1RenderTarget 개체를 모두 동일한 팩터리에서 만든 경우 두 ID2D1RenderTarget 개체를 사용하여 동일한 ID2D1RectangleGeometry를 그릴 수 있습니다.

싱크 인터페이스(ID2D1SimplifiedGeometrySink, ID2D1GeometrySinkID2D1TessellationSink)는 모든 팩터리에서 만든 리소스와 공유할 수 있습니다. Direct2D의 다른 인터페이스와 달리 싱크 인터페이스의 구현을 사용할 수 있습니다. 예를 들어 ID2D1SimplifiedGeometrySink의 고유한 구현을 사용할 수 있습니다.

렌더링 대상 리소스 공유

렌더링 대상에서 만든 리소스를 공유하는 기능은 렌더링 대상의 종류에 따라 달라집니다. D2D1_RENDER_TARGET_TYPE_DEFAULT 형식의 렌더링 대상을 만들 때 렌더링 대상이 다음 섹션에 설명된 범주 중 하나에 맞지 않는 한 해당 렌더링 대상에서 만든 리소스를 해당 렌더링 대상에서만 사용할 수 있습니다. 이는 렌더링 대상이 어떤 디바이스를 사용할지 모르기 때문에 발생합니다. 로컬 하드웨어, 소프트웨어 또는 원격 클라이언트의 하드웨어로 렌더링될 수 있습니다. 예를 들어 원격으로 표시되거나 렌더링 대상의 크기가 렌더링 하드웨어에서 지원하는 최대 크기를 초과하여 크기가 증가할 때 작동이 중지되는 프로그램을 작성할 수 있습니다.

다음 섹션에서는 한 렌더링 대상에서 만든 리소스를 다른 렌더링 대상과 공유할 수 있는 상황을 설명합니다.

하드웨어 렌더링 대상

원격 모드가 호환되는 한 하드웨어를 명시적으로 사용하는 렌더링 대상 간에 리소스를 공유할 수 있습니다. 원격 모드는 두 렌더링 대상이 모두 D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTING 또는 D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE 사용 플래그를 사용하거나 플래그가 지정되지 않은 경우에만 호환되도록 보장됩니다. 이러한 설정은 리소스가 항상 동일한 컴퓨터에 배치되도록 보장합니다. 사용 모드를 지정하려면 하나 이상의 D2D1_RENDER_TARGET_USAGE 플래그를 사용하여 렌더링 대상을 만드는 데 사용한 D2D1_RENDER_TARGET_PROPERTIES 구조체의 사용 필드를 설정합니다.

하드웨어 렌더링을 명시적으로 사용하는 렌더링 대상을 만들려면 렌더링 대상을 만드는 데 사용한 D2D1_RENDER_TARGET_PROPERTIES 구조체의 형식 필드를 설정하여 D2D1_RENDER_TARGET_TYPE_HARDWARE.

DXGI Surface 렌더링 대상

DXGI 표면 렌더링 대상에서 만든 리소스를 동일한 기본 Direct3D 디바이스를 사용하는 다른 DXGI 표면 렌더링 대상과 공유할 수 있습니다.

호환되는 렌더링 대상 및 공유 비트맵

렌더링 대상과 해당 렌더링 대상에서 만든 호환되는 렌더링 대상 간에 리소스를 공유할 수 있습니다. 호환되는 렌더링 대상을 만들려면 ID2D1RenderTarget::CreateCompatibleRenderTarget 메서드를 사용합니다.

메서드가 성공하면 ID2D1RenderTarget::CreateSharedBitmap 메서드를 사용하여 메서드 호출에 지정된 두 렌더링 대상 간에 공유할 수 있는 ID2D1Bitmap 을 만들 수 있습니다. 이 메서드는 두 렌더링 대상이 렌더링에 동일한 기본 디바이스를 사용하는 한 성공합니다.