컴퍼지션 표면

참고

Windows 10 앱의 경우 DirectComposition 대신 Windows.UI.Composition API를 사용하는 것이 좋습니다. 자세한 내용은 시각적 계층을 사용하여 데스크톱 앱 현대화를 참조하세요.

이 항목에서는 Microsoft DirectComposition에서 지원하는 표면 유형에 대해 설명합니다.

DirectComposition 논리 표면

DirectComposition은 논리적 컴퍼지션 표면을 나타내기 위해 IDCompositionSurface 개체를 노출합니다. DirectComposition은 이러한 논리적 표면을 만들고 업데이트하고 삭제하는 데 사용할 수 있는 API를 노출합니다. 각 표면은 하나 이상의 시각적 개체와 연결할 수 있습니다. 애플리케이션은 논리 표면의 수명을 관리합니다.

논리 표면 업데이트

애플리케이션은 BeginDraw 를 호출하고 앱이 업데이트하려는 논리 표면에서 사각형의 크기와 오프셋을 지정하여 논리 표면을 업데이트할 수 있습니다. DirectComposition은 지정된 크기의 사각형을 할당한 다음, 애플리케이션이 그리거나 업데이트해야 하는 표면 및 해당 오프셋을 반환합니다. 업데이트 사각형의 제한은 표면 크기에 의해 바인딩됩니다. 예를 들어 40x100 픽셀 표면의 업데이트 사각형은 최대 (0,0,40,100)일 수 있습니다. 또한 업다이트 가능 지역은 가드 사각형에 의해 적용됩니다. 한 번에 하나의 가드 사각형만 있을 수 있으므로 한 번에 하나의 논리 표면만 업데이트할 수 있습니다. BeginDrawBeginDraw에 대한 이전 호출 후에 EndDraw 또는 SuspendDraw가 호출되지 않은 경우 오류 코드를 반환합니다. 애플리케이션은 BeginDraw 에 대한 커밋된 호출을 일괄 처리에 추가할 수 있지만 EndDraw 가 호출되고 커밋될 때까지 적용되지 않습니다.

논리 화면에 대한 업데이트 일시 중단

다른 표면을 업데이트해야 하는 애플리케이션은 현재 업데이트에서 SuspendDraw 를 호출한 다음 BeginDraw 를 호출하여 새 업데이트를 시작할 수 있습니다. Microsoft DirectComposition은 여러 업데이트를 허용하지만 한 번에 하나만 활성화할 수 있습니다. 즉, 다음 화면에서 BeginDraw를 호출하기 전에 한 화면에서 SuspendDraw 또는 EndDraw를 호출해야 합니다. EndDraw와 달리 커밋된 일괄 처리에는 SuspendDraw 상태의 표면이 포함될 수 있지만 EndDraw가 호출될 때까지 이러한 업데이트가 화면에 표시되지 않습니다.

논리 화면에 대한 업데이트 다시 실행

애플리케이션은 ResumeDraw를 호출하여 SuspendDraw 상태에 있는 표면에 대한 업데이트를 다시 시작할 수 있습니다. 이 메서드는 일시 중단된 표면에서만 호출할 수 있습니다.

논리 화면에 대한 업데이트 종료

EndDrawCommit을 호출하는 것은 화면에서 비트맵 업데이트 변경 내용을 볼 수 있는 유일한 방법입니다. EndDraw에 대한 각 호출에는 Guard 사각형을 제거하려면 BeginDraw에 대한 해당 호출이 있어야 합니다. 논리 표면은 커밋 이 호출될 때까지 모든 업데이트를 유지합니다. EndDraw는 암시적 다시 시작/종료이므로 SuspendDraw 상태인 표면에서 EndDraw를 호출할 수도 있습니다. EndDraw를 호출하면 업데이트된 콘텐츠가 화면에 표시되고 삭제되므로 업데이트용 메모리를 이후 업데이트에 다시 사용할 수 있습니다.

논리 표면 사용 예제

다음 예제에서는 애플리케이션이 두 개의 시각적 개체로 구성된 시각적 트리를 만든 다음 시각적 개체와 연결된 두 논리 표면의 특정 영역을 업데이트해야 하는 경우 수행하는 단계를 설명합니다.

  1. DirectComposition 디바이스를 만듭니다.
  2. 루트 노드와 시각적 개체 1 및 2로 구성된 시각적 트리를 만듭니다.
  3. 논리 표면 1과 2를 만듭니다.
  4. SetContent를 호출하여 논리 표면을 시각적 개체 1 및 2와 연결합니다.
  5. 논리 표면 1의 하위 사각형에서 BeginDraw 를 호출합니다.
  6. DirectComposition에서 반환된 오프셋에서 표면을 업데이트합니다.
  7. 선택적 단계:
    1. 논리 표면 1에서 SuspendDraw 를 호출합니다.
    2. 논리 표면 2의 하위 사각형에서 BeginDraw 를 호출합니다.
    3. DirectComposition에서 반환된 오프셋에서 표면을 업데이트합니다.
    4. 논리 표면 2에서 EndDraw 를 호출합니다.
    5. 논리 표면 1에서 ResumeDraw 를 호출합니다.
  8. DirectComposition에서 반환된 오프셋에서 표면을 업데이트합니다.
  9. 논리 표면 1에서 EndDraw 를 호출합니다.
  10. 커밋을 호출합니다.

DirectComposition 가상 표면

DirectComposition은 고정 크기의 타일이 있는 고정 그리드에 정렬된 논리 표면(타일)의 컬렉션인 가상 표면을 나타내기 위해 IDCompositionVirtualSurface 인터페이스를 노출합니다. 애플리케이션은 생성 시 가상 텍스처의 크기를 지정합니다. 크기는 가상 표면의 경계를 설정합니다. 표면은 하나 이상의 시각적 개체와 연결할 수 있습니다.

가상 표면이 초기화되면 실제 할당으로 뒷받침되지 않습니다. 즉, 비트가 없습니다. DirectComposition은 애플리케이션이 표면 업데이트를 시작한 후 타일(즉, 컴퍼지션 표면 개체)을 할당합니다. 애플리케이션은 BeginDraw 를 호출하고 가상 표면의 좌표와 관련하여 관심 영역을 지정하여 가상 표면을 업데이트합니다. 그런 다음, DirectComposition은 업데이트를 유지하는 데 필요한 타일을 할당하고 업데이트할 컴퍼지션 표면과 오프셋을 반환합니다.

논리 표면과 마찬가지로 가상 화면에서 BeginDraw, SuspendDraw, ResumeDraw 및 EndDraw 호출할 수 있습니다. 또한 DirectComposition은 기존 가상 표면의 크기를 조정하고 자르는 데 사용할 수 있는 메서드를 노출합니다.

가상 표면 크기 조정

Resize 메서드는 가상 화면의 경계를 변경합니다. 즉, 새 업데이트 또는 할당이 새 크기로 설정된 경계에 있어야 합니다. 애플리케이션은 Resize를 사용하여 가상 표면의 특정 영역이 더 이상 필요하지 않으며 회수할 수 있음을 DirectComposition에 알립니다. 크기 조정으로 가상 화면이 축소되면 애플리케이션은 더 이상 새 경계 외부의 영역을 업데이트할 수 없습니다.

다음 그림에서는 2-by-2로 크기가 조정된 3-by-3 가상 표면을 보여 줍니다. 빨간색 영역은 크기 조정 작업의 일부로 삭제되고 메모리가 DirectComposition에 의해 회수되는 타일을 나타냅니다. 크기 조정 후 애플리케이션은 가상 표면의 크기를 다시 조정하지 않고는 빨간색 영역을 업데이트할 수 없습니다.

가상 표면 크기 조정

크기 조정 작업은 즉시 적용됩니다. DirectComposition은 애플리케이션이 커밋 을 호출하여 크기 조정 업데이트를 할 때까지 기다리지 않습니다. 예를 들어 애플리케이션이 다음 일련의 호출을 수행한다고 가정합니다.

pVirtualSurface->Resize(0, 0);
pVirtualSurface->Resize(INT_MAX, INT_MAX);
pDevice->Commit();

이 예제에서 애플리케이션은 첫 번째 크기 조정의 모든 콘텐츠를 손실합니다. 두 번째 크기 조정은 커밋 전에 호출된 경우에도 영향을 주지 않습니다. 이 경우 화면에 아무 것도 표시되지 않습니다.

가상 표면 트리밍

Trim 메서드는 애플리케이션에 필요한 가상 표면의 영역을 식별합니다. 가상 표면의 경계 크기를 조정하지는 않지만 DirectComposition에 현재 할당해야 하는 논리 표면을 알려줍니다.

다음 그림에서 녹색 사각형은 애플리케이션의 뷰포트입니다. 애플리케이션은 처음에 뷰포트에 있는 가상 표면(연한 회색)의 처음 6개 타일(파란색)에 렌더링됩니다. 가상 표면으로 표시되는 페이지가 스크롤되므로 애플리케이션은 마지막 6개의 타일을 렌더링해야 합니다. 애플리케이션은 Trim 을 호출하여 마지막 6개의 타일로 정의된 지역이 콘텐츠가 있는 위치이며 나머지는 현재 필요하지 않음을 나타냅니다. 그런 다음 DirectComposition은 원래 처음 6개의 타일(진한 회색)을 나타내는 논리적 표면을 재활용하도록 선택할 수 있습니다.

가상 표면 트리밍

DirectComposition 개념