컴퍼지션 표면
메모
Windows 10 앱의 경우 DirectComposition 대신 Windows.UI.Composition API를 사용하는 것이 좋습니다. 자세한 내용은 시각적 계층 사용하여 데스크톱 앱 현대화참조하세요.
이 항목에서는 Microsoft DirectComposition에서 지원하는 표면 유형에 대해 설명합니다.
- directComposition 논리 표면
- 논리 표면 업데이트
- 논리 표면 대한 업데이트 일시 중단
- 논리 표면 대한 업데이트 다시
- 논리 표면 업데이트 종료
- 논리 표면 사용하는 예
- DirectComposition 가상 표면
- 관련 항목
DirectComposition 논리 표면
DirectComposition은 논리적 컴퍼지션 표면을 나타내기 위해 IDCompositionSurface 개체를 노출합니다. DirectComposition은 이러한 논리 표면을 만들고, 업데이트하고, 삭제하는 데 사용할 수 있는 API를 노출합니다. 각 표면은 하나 이상의 시각적 개체와 연결할 수 있습니다. 애플리케이션은 논리 표면의 수명을 관리합니다.
논리 표면 업데이트
애플리케이션은 BeginDraw 호출하고 앱이 업데이트하려는 논리 화면에서 사각형의 크기와 오프셋을 지정하여 논리 표면을 업데이트할 수 있습니다. DirectComposition은 지정된 크기의 사각형을 할당한 다음 애플리케이션이 그리거나 업데이트해야 하는 표면 및 해당 오프셋을 반환합니다. 업데이트 사각형의 제한은 표면 크기에 의해 바인딩됩니다. 예를 들어 40 x 100 픽셀 표면의 업데이트 사각형은 최대 (0,0,40,100)일 수 있습니다. 또한 업데이트 가능한 영역은 가드 사각형에 의해 적용됩니다. 한 번에 하나의 가드 사각형만 있을 수 있으므로 한 번에 하나의 논리 표면만 업데이트할 수 있습니다. BeginDrawEndDraw 또는 SuspendDrawBeginDraw대한 이전 호출 후에 호출되지 않은 경우 오류 코드를 반환합니다. 애플리케이션은 BeginDraw 일괄 처리에 커밋된 호출을 추가할 수 있지만 EndDraw 호출되고 커밋될 때까지 적용되지 않습니다.
논리 화면에 대한 업데이트 일시 중단
다른 표면을 업데이트해야 하는 애플리케이션은 현재 업데이트에서 SuspendDraw 호출한 다음 BeginDraw 호출하여 새 업데이트를 시작할 수 있습니다. Microsoft DirectComposition은 여러 업데이트를 허용하지만 한 번에 하나만 활성화할 수 있습니다. 즉, 한 화면에서 SuspendDraw 또는 EndDraw 호출한 후 다음 화면에서 BeginDraw 호출해야 합니다. EndDraw달리 커밋된 일괄 처리는 SuspendDraw 상태의 표면을 포함할 수 있지만 EndDraw 호출될 때까지 이러한 업데이트가 화면에 표시되지 않습니다.
논리 화면에 대한 업데이트 재개
애플리케이션은 ResumeDraw호출하여 SuspendDraw 상태인 화면에 대한 업데이트를 다시 시작할 수 있습니다. 이 메서드는 일시 중단된 화면에서만 호출할 수 있습니다.
논리 화면에 대한 업데이트 종료
EndDraw 및 커밋 호출하는 것은 화면에서 비트맵 업데이트 변경 내용을 볼 수 있는 유일한 방법입니다. EndDraw 대한 각 호출에는 가드 사각형을 제거하기 위해 BeginDraw해당 호출이 있어야 합니다. 논리 표면은 커밋 호출될 때까지 모든 업데이트를 유지합니다. EndDraw 암시적 이력서/종료이므로 SuspendDraw 상태인 화면에서 EndDraw 호출할 수도 있습니다. EndDraw호출하면 업데이트된 콘텐츠가 화면에 표시되고 삭제되므로 업데이트의 메모리를 이후 업데이트에 다시 사용할 수 있습니다.
논리 표면 사용 예제
다음 예제에서는 애플리케이션이 두 개의 시각적 개체로 구성된 시각적 트리를 만든 다음 시각적 개체와 연결된 두 논리 표면의 특정 영역을 업데이트하는 데 필요한 경우 수행하는 단계를 설명합니다.
- DirectComposition 디바이스를 만듭니다.
- 루트 노드와 시각적 개체 1 및 2로 구성된 시각적 트리를 만듭니다.
- 논리 표면 1과 2를 만듭니다.
- SetContent 호출하여 논리 화면을 시각적 개체 1 및 2와 연결합니다.
- 논리 표면 1의 하위 사각형에서 BeginDraw 호출합니다.
- DirectComposition에서 반환된 오프셋에서 표면을 업데이트합니다.
- 선택적 단계:
- 논리 표면 1에서 SuspendDraw 호출합니다.
- 논리 표면 2의 하위 사각형에서 BeginDraw 호출합니다.
- DirectComposition에서 반환된 오프셋에서 표면을 업데이트합니다.
- 논리 표면 2에서 EndDraw 호출합니다.
- 논리 표면 1에서 ResumeDraw 호출합니다.
- DirectComposition에서 반환된 오프셋에서 표면을 업데이트합니다.
- 논리 표면 1에서 EndDraw 호출합니다.
- 커밋호출합니다.
DirectComposition 가상 화면
DirectComposition은 고정된 크기의 타일이 있는 고정 그리드에 정렬된 논리 표면(타일)의 컬렉션인 가상 표면을 나타내기 위해 IDCompositionVirtualSurface 인터페이스를 노출합니다. 애플리케이션은 생성 시 가상 텍스처의 크기를 지정합니다. 크기는 가상 화면에 대한 경계를 설정합니다. 표면을 하나 이상의 시각적 개체와 연결할 수 있습니다.
가상 표면이 초기화되면 실제 할당에 의해 지원되지 않습니다. 즉, 비트가 없습니다. DirectComposition은 애플리케이션이 표면 업데이트를 시작한 후 타일(즉, 컴퍼지션 표면 개체)을 할당합니다. 애플리케이션은 BeginDraw 호출하고 가상 표면의 좌표와 관련하여 관심 영역을 지정하여 가상 표면을 업데이트합니다. 그런 다음 DirectComposition은 업데이트를 유지하는 데 필요한 타일을 할당하고 업데이트할 컴퍼지션 표면과 오프셋을 반환합니다.
논리 표면과 마찬가지로 가상 화면에서 BeginDraw, SuspendDraw, ResumeDraw 및 EndDraw 호출할 수 있습니다. 또한 DirectComposition은 기존 가상 표면의 크기를 조정하고 자르는 데 사용할 수 있는 메서드를 노출합니다.
가상 화면 크기 조정
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개의 타일(진한 회색)을 나타내는 논리 표면을 재활용하도록 선택할 수 있습니다.
가상 표면
관련 항목