다음을 통해 공유


ID2D1CommandList 인터페이스(d2d1_1.h)

기록 및 재생할 수 있는 명령 시퀀스를 나타냅니다.

상속

ID2D1CommandList 인터페이스는 ID2D1Image에서 상속됩니다. ID2D1CommandList 에는 다음과 같은 유형의 멤버도 있습니다.

메서드

ID2D1CommandList 인터페이스에는 이러한 메서드가 있습니다.

 
ID2D1CommandList::Close

명령 목록에 명령 수락을 중지하여 효과에 대한 입력 또는 ID2D1DeviceContext::D rawImage 호출에 사용할 수 있도록 합니다.
ID2D1CommandList::Stream

명령 목록의 내용을 지정된 명령 싱크로 스트리밍합니다.

설명

명령 목록에는 기록된 명령 집합이 있는 리소스의 정적 복사본이 포함되지 않습니다. 모든 비트맵, 효과 및 기하 도형은 실제 리소스에 대한 참조로 저장되고 모든 브러시는 값으로 저장됩니다. 모든 리소스 만들기 및 소멸은 명령 목록 외부에서 발생합니다. 다음 표에는 리소스 및 명령 목록 내에서 리소스를 처리하는 방법이 나열되어 있습니다.

리소스 명령 목록에서 처리하는 방법
단색 브러시 값으로 전달됩니다.
비트맵 브러시 브러시는 값으로 전달되지만 브러시를 만드는 데 사용되는 비트맵은 실제로 참조됩니다.
그라데이션 브러시 - 선형 및 방사형 그라데이션 모두 브러시는 값으로 전달되지만 그라데이션 중지 컬렉션 자체가 참조됩니다. 그라데이션 중지 컬렉션 개체는 변경할 수 없습니다.
비트맵 참조로 전달됩니다.
그리기 상태 블록 디바이스 컨텍스트의 실제 상태는 set transform과 같은 set 함수로 변환되고 값으로 전달됩니다.
geometry 값으로 전달되는 변경할 수 없는 개체입니다.
스트로크 스타일 값으로 전달되는 변경할 수 없는 개체입니다.
메시 값으로 전달되는 변경할 수 없는 개체입니다.
 

CommandList를 대상으로 사용

다음 의사 코드는 대상이 명령 목록 또는 비트맵으로 설정된 다양한 사례를 보여 줍니다.
//create a D2D device from an already created DXGI device 
ID2D1Device *pD2D1Device;
pD2D1Factory->CreateDevice(pDxgiDevice, &pD2D1Device);

//create a D2D device context from the D2D device
ID2D1DeviceContext *pD2D1DeviceContext;
pD2D1Device->CreateD2D1DeviceContext(&pD2D1DeviceContext);

//create command list
ID2D1CommandList *pCommandList1;
pD2D1DeviceContext->CreateCommandList(&pCommandList1);

//CreateBitmap
ID2D1Bitmap *pBitmap1;
ID2D1Bitmap *pBitmap2;
pD2D1DeviceContext->CreateBitmap(…, &pBitmap1);
pD2D1DeviceContext->CreateBitmap(…, &pBitmap2);

//Set the bitmap as the target
pD2D1DeviceContext->SetTarget(pBitmap1);
pD2D1DeviceContext->BeginDraw();
RenderMyVectorContent(pD2D1DeviceContext);
pD2D1DeviceContext->EndDraw();

//Set the command list as the target
pD2D1DeviceContext->SetTarget(pCommandList1);
pD2D1DeviceContext->BeginDraw();
RenderMyVectorContent(pD2D1DeviceContext);
pD2D1DeviceContext->EndDraw();

//Drawing a command list to a bitmap target
pD2D1DeviceContext->SetTarget(pBitmap2);
pD2D1DeviceContext->BeginDraw();
pD2D1DeviceContext->DrawImage(pCommandList1);
pD2D1DeviceContext->EndDraw();
  • 비트맵을 대상으로 설정합니다.이 경우 비트맵에 렌더링된 모든 콘텐츠가 래스터화됩니다. 이 비트맵이 다른 곳에서 사용되는 경우 해상도는 독립적이 아니며 고품질 눈금 과 같은 변환을 사용하는 경우 충실도를 유지하지 않습니다.
  • 명령 목록을 대상으로 설정합니다.이 경우 장면이 래스터화되는 대신 모든 명령이 기록됩니다. 명령 목록이 나중에 ID2D1DeviceContext::D rawImage 를 사용하여 화면 그리기에 사용되거나 XPS 인쇄 컨트롤에 전달되면 벡터 콘텐츠는 충실도를 잃지 않고 재생됩니다.
  • 명령 목록을 비트맵 대상에 그리기:이 경우 대상은 비트맵이므로 명령 목록이 비트맵에 그려지고 더 이상 해상도가 독립적이 아닙니다.
이후 재생을 위해 전체 충실도로 벡터 콘텐츠를 유지하는 유일한 방법은 대상 형식을 명령 목록으로 설정하는 것입니다. 비트맵이 대상으로 설정되면 해당 대상에 대한 모든 그리기는 래스터화됩니다.

CommandList를 사용하여 브러시 만들기

명령 목록은 재생에서 충실도를 유지할 수 있으므로 패턴 브러시를 지원하는 좋은 방법입니다. 원하는 패턴은 이미지 브러시를 만드는 데 사용할 수 있는 명령 목록으로 저장할 수 있습니다. 그런 다음 이 브러시를 사용하여 경로를 그릴 수 있습니다.

명령 목록으로 경로를 채우는 것을 지원하는 브러시 유형을 이미지 브러시라고 합니다.

다음 psuedocode는 이미지 브러시와 함께 명령 목록을 사용하는 프로세스를 보여 줍니다.

//Draw the pattern to the command list
ID2D1CommandList *pCommandList;
pD2D1DeviceContext->SetTarget(pCommandList);
pD2D1DeviceContext->BeginDraw();
DrawMyPattern(pD2D1DeviceContext);
pD2D1DeviceContext->EndDraw();

//Create the image brush from the command list
ID2D1ImageBrush *pImageBrush;
pD2D1DeviceContext->CreateImageBrush(
	pCommandList, 
	pImageBrushProperties,
	pBrushProperties,
	&pImageBrush);

//Fill the ellipse with the pattern brush
pD2D1DeviceContext->SetTarget(pTargetBitmap);
pD2D1DeviceContext->BeginDraw();
pD2D1DeviceContext->FillEllipse(pEllipse, pImageBrush);
pD2D1DeviceContext->EndDraw();

브러시는 이미지를 허용하므로 다음과 같은 다른 이점도 있습니다.

  • 효과 그래프의 출력은 이미지이므로 이 이미지를 사용하여 효과를 채우기로 사용하는 기능을 효과적으로 제공하는 이미지 브러시를 만들 수 있습니다.
  • 명령 목록은 이미지 형식이므로 효과 그래프에 벡터 콘텐츠를 삽입할 수 있으며 타일 또는 작동할 수도 있습니다. 예를 들어 가상화된 이미지가 있는 그래프 위에 큰 저작권 알림을 삽입한 다음 인코딩할 수 있습니다.

호환되는 렌더링 대상에 대한 대체로 CommandList 사용

호환되는 렌더링 대상은 나중에 실제 장면과 합성되는 중간 비트맵에 대한 오프스크립 렌더링에 매우 자주 사용됩니다. 특히 인쇄의 경우 호환되는 렌더링 대상을 사용하면 실제 기본 형식을 유지하는 대신 모든 항목이 래스터화되어 XPS로 전송되기 때문에 메모리 공간이 증가합니다. 이 시나리오에서 개발자는 호환되는 렌더링 대상을 중간 명령 목록으로 바꾸는 것이 좋습니다. 다음 의사 코드는 이 점을 보여 줍니다.
pD2D1Device->CreateDeviceContext(&pD2D1DeviceContext);
pRenderTarget->CreateCompatibleRenderTarget(…, &pCompatibleRenderTarget);

//render to the compatible render target
pCompatibleRenderTarget->BeginDraw();
RenderMyScene1(pCompatibleRenderTarget);
pCompatibleRenderTarget->EndDraw();

//get the bitmap from the compatible render target
pCompatibleRenderTarget->GetBitmap(pCompatBitmap);

//draw this bitmap on the device context
pD2D1DeviceContext->SetTarget(pTargetBitmap)
pD2D1DeviceContext->BeginDraw();
pD2D1DeviceContext->DrawBitmap(pCompatBitmap);
pD2D1DeviceContext->EndDraw();

//draw something else on the compatible render target
pCompatibleRenderTarget->BeginDraw();
pCompatibleRenderTarget->Clear();
pCompatibleRenderTarget>RenderScene2();
pCompatibleRenderTarget->EndDraw();

//get the bitmap from the compatible render target
pCompatibleRenderTarget->GetBitmap(pCompatBitmap);

//draw this bitmap on the device context
pD2D1DeviceContext->SetTarget(pTargetBitmap)
pD2D1DeviceContext->BeginDraw();
pD2D1DeviceContext->DrawBitmap(pCompatBitmap);
pD2D1DeviceContext->EndDraw();


//Use a command list instead for better quality and performance 

//store the original target
pOriginalTarget = pD2D1DeviceContext->GetTarget();

pD2D1DeviceContext->CreateCommandList(pCommandList1);

//draw to command list 1
pD2D1DeviceContext->SetTarget(pCommandList1);
pD2D1DeviceContext->BeginDraw();
RenderMyScene1(pD2D1DeviceContext);
pD2D1DeviceContext->EndDraw();

//draw the command list to the original target
pD2D1DeviceContext->SetTarget(pOriginalTarget);
pD2D1DeviceContext->BeginDraw();
pD2D1DeviceContext->DrawImage(pCommandList1);
pD2D1DeviceContext->EndDraw();

pD2D1DeviceContext->CreateCommandList(pCommandList2);

//draw something else to a new command list
pD2D1DeviceContext->SetTarget(pCommandList2);
pD2D1DeviceContext->BeginDraw();
pD2D1DeviceContext->RenderScene2();
pD2D1DeviceContext->EndDraw();

//draw the new command list on the old command list
pD2D1DeviceContext->SetTarget(pCommandList1);
pD2D1DeviceContext->BeginDraw();
pD2D1DeviceContext->DrawImage(pCommandList2);
pD2D1DeviceContext->EndDraw();

기타 API 작업

Direct2D는 GDI 및 Direct3D/DXGI API와 상호 운용할 때 간단한 모델을 사용합니다. 명령 목록에는 이러한 명령이 기록되지 않습니다. 대신 콘텐츠를 제자리에 래스터화하고 ID2D1Bitmap으로 저장합니다. 콘텐츠가 래스터화되므로 이러한 interop 지점은 높은 충실도를 유지하지 않습니다.

Gdi: 명령 싱크 인터페이스는 Get/ReleaseDC() 호출을 지원하지 않습니다. ID2D1GdiInteropRenderTarget::ReleaseDC를 호출하면 Direct2D는 업데이트된 지역의 콘텐츠를 D2D1Bitmap으로 렌더링합니다. 복사 복합 모드를 사용하여 별칭이 지정된 DrawBitmap 호출로 재생됩니다. 올바른 DPI에서 비트맵을 래스터화하기 위해 명령 재생 시 SetDPI() 함수를 사용하여 설정된 DPI 값이 사용됩니다. 싱크가 SetDPI() 호출을 준수하는 유일한 경우입니다.

Dx: Direct3D는 명령 목록에 직접 렌더링할 수 없습니다. 이 경우 Direct3D 콘텐츠를 렌더링하기 위해 애플리케이션은 Direct3D 표면에서 지원되는 ID2D1Bitmap을 사용하여 DrawBitmap을 호출할 수 있습니다.

요구 사항

   
지원되는 최소 클라이언트 Windows 7용 Windows 8 및 플랫폼 업데이트 [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2012 및 Windows Server 2008 R2용 플랫폼 업데이트 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 d2d1_1.h

추가 정보

명령 목록

ID2D1Bitmap

ID2D1Image

인쇄 및 명령 목록