다음을 통해 공유


Direct2D 및 GDI 하드웨어 가속 비교

Direct2DGDI 는 즉시 모드 2D 렌더링 API이며 둘 다 어느 정도의 하드웨어 가속을 제공합니다. 이 항목에서는 두 API의 하드웨어 가속 기능에서 과거와 현재의 차이점을 포함하여 Direct2D와 GDI의 차이점을 살펴봅니다.

이 항목에는 다음과 같은 부분이 있습니다.

Direct2D와 GDI 간의 차이점

GDI 는 다각형, 줄임표 및 선과 같은 불투명하고 별칭이 지정된 기하 도형을 렌더링합니다. 별칭 및 ClearType 텍스트를 렌더링하고 AlphaBlend API를 통한 투명도 혼합을 지원할 수 있습니다. 그러나 투명도 처리가 일관되지 않으며 대부분의 GDI API는 알파 채널을 무시합니다. 몇 가지 GDI API는 작업 후에 알파 채널에 포함할 내용을 보장합니다. 더 중요한 것은 GDI의 렌더링은 3D 작업에 쉽게 매핑되지 않으며 최신 GPU는 렌더링 엔진의 3D 부분에서 가장 효율적으로 렌더링됩니다. 예를 들어 Direct2D의 별칭이 지정된 선은 단순히 GPU에서 렌더링된 두 개의 삼각형으로 구현되도록 디자인된 반면 GDI는 Bresenham의 선 그리기 알고리즘을 사용합니다.

Direct2D 는 불투명하고 투명하며 별칭이 지정된 앤티앨리어스 기본 형식을 렌더링합니다. 최신 UI는 종종 투명도와 애니메이션을 사용합니다. Direct2D를 사용하면 투명한 콘텐츠를 허용 및 렌더링하는 방법에 대한 엄격한 보장이 있고 모든 기본 형식이 하드웨어 가속을 사용하여 렌더링되므로 최신 UI를 더 쉽게 만들 수 있습니다. Direct2D는 GDI의 순수한 상위 집합이 아닙니다. GPU에서 구현할 때 비합리적으로 느렸을 기본 형식은 Direct2D에 없습니다. Direct2D는 3D 가속에 중점을 두고 빌드되므로 Direct3D에서도 쉽게 사용할 수 있습니다.

Windows NT 4부터 GDI는 커널 모드에서 실행됩니다. 애플리케이션은 GDI를 호출한 다음, 기본 형식을 자체 드라이버 모델에 전달하는 커널 모드 대응을 호출합니다. 그런 다음, 이 드라이버는 결과를 전역 커널 모드 표시 드라이버로 보냅니다.

Windows 2000부터 GDI 및 GDI 드라이버는 "세션 공간"이라는 커널의 독립적인 공간에서 실행됩니다. 세션 주소 공간은 각 로그온 세션에 대해 만들어지고 GDI의 각 instance 이 고유한 커널 모드 주소 공간에서 독립적으로 실행됩니다. 그러나 Direct2D는 사용자 모드에서 실행되고 사용자 모드 Direct3D 드라이버를 통해 그리기 명령을 커널 모드 드라이버에 전달합니다.

그림 1 - gdi에 비해 direct2d

GDI 및 Direct2D 하드웨어 가속

Direct2DGDI 하드웨어 가속의 가장 중요한 차이점은 이를 구동하는 기본 기술입니다. Direct2D는 최상위 Direct3D에 계층화되고 GDI에는 GDI 기본 형식에 해당하는 자체 드라이버 모델인 GDI DDI(디바이스 드라이버 인터페이스)가 있습니다. Direct3D 드라이버 모델은 GPU의 3D 렌더링 하드웨어가 렌더링하는 내용에 해당합니다. GDI DDI가 처음 정의되었을 때 대부분의 디스플레이 가속 하드웨어는 GDI 기본 형식을 대상으로 했습니다. 시간이 지남에 따라 3D 게임 가속에 점점 더 중점을 두었으며 애플리케이션 가속에는 더 적게 중점을 두게되었습니다. 결과적으로 BitBlt API는 하드웨어가 가속화되었고 대부분의 다른 GDI 작업은 그렇지 않았습니다.

이렇게 하면 GDI 가 디스플레이에 렌더링되는 방식에 대한 변경 시퀀스의 단계가 설정됩니다. 다음 그림에서는 GDI 디스플레이 렌더링이 Windows XP에서 Windows 7로 변경된 방법을 보여 줍니다.

그림 2 - gdi 디스플레이 렌더링의 진화

아래에 설명된 대로 GDI 드라이버 모델을 변경하는 여러 가지 추가 요인도 있었습니다.

디스플레이 드라이버의 복잡성 및 크기 증가

3D 드라이버는 시간이 지남에 따라 더 복잡해졌습니다. 더 복잡한 코드에는 더 많은 결함이 있는 경향이 있으므로 드라이버 버그로 인해 시스템 재부팅을 유발할 수 없는 사용자 모드에서 드라이버가 존재하는 것이 좋습니다. 위의 그림에서 볼 수 있듯이 디스플레이 드라이버는 복잡한 사용자 모드 구성 요소와 더 간단한 커널 모드 구성 요소로 나뉩니다.

세션 및 전역 커널 주소 공간 동기화의 어려움

Windows XP에서 디스플레이 드라이버는 세션 공간과 커널 공간이라는 두 개의 서로 다른 주소 공간에 있습니다. 드라이버의 일부는 전원 관리 이벤트와 같은 이벤트에 응답해야 합니다. 세션 주소 공간의 드라이버 상태와 동기화해야 합니다. 이는 어려운 작업이며 디스플레이 드라이버가 이러한 고유한 주소 공간을 처리하려고 할 때 결함이 발생할 수 있습니다.

복합 창 관리

Windows 7에 도입된 구성 창 관리자인 DWM(데스크톱 창 관리자)은 모든 창을 화면 화면으로 렌더링한 다음 화면에 표시되도록 함께 구성합니다. 이렇게 하려면 GDI 가 Surface에 렌더링할 수 있어야 하며, 그러면 Direct3D에서 렌더링하여 표시합니다. GDI와 Direct3D는 병렬 드라이버 스택이므로 XP 드라이버 모델에서 문제가 발생했습니다.

그 결과 Windows Vista에서 GDI DDI 디스플레이 드라이버는 Microsoft에서 제공하는 CDD(정식 디스플레이 드라이버)로 구현되었으며, GDI 콘텐츠를 화면에 구성하기 위해 시스템 메모리 비트맵에 렌더링했습니다.

Windows 7의 GDI 렌더링

Windows Vista에서 사용되는 드라이버 모델은 비디오 메모리 표면과 시스템 메모리 표면 모두에서 모든 GDI 창을 지원해야 했습니다. 이로 인해 시스템 메모리가 모든 GDI 창에 사용되었습니다.

이러한 이유로 GDI 는 Windows 7에서 다시 변경되었습니다. GDI는 시스템 메모리 표면에 렌더링하는 대신 조리개 메모리 세그먼트로 렌더링하도록 수정되었습니다. 창 내용을 포함하는 비디오 메모리 화면에서 조리개 메모리를 업데이트할 수 있습니다. GDI는 조리개 메모리로 다시 렌더링할 수 있으며 결과는 창 화면으로 다시 전송될 수 있습니다. GPU에서 조리개 메모리 세그먼트를 주소 지정 가능하므로 GPU는 이러한 업데이트를 비디오 메모리 화면으로 가속화할 수 있습니다. 예를 들어 이러한 경우 텍스트 렌더링, BitBlts, AlphaBlend, TransparentBlt 및 StretchBlt가 모두 가속화됩니다.

Windows 7의 Direct2D 및 GDI 가속 대비

Direct2DGDI 는 모두 2D 즉시 모드 렌더링 API이며 하드웨어가 가속화됩니다. 그러나 두 API에 남아 있는 여러 가지 차이점이 있습니다.

리소스 위치

GDI 는 기본적으로 시스템 메모리에서 리소스, 특히 비트맵을 유지 관리합니다. Direct2D 는 디스플레이 어댑터의 비디오 메모리에 리소스를 유지 관리합니다. GDI가 비디오 메모리를 업데이트해야 하는 경우 리소스가 이미 조리개 메모리 세그먼트에 있거나 작업을 직접 표현할 수 있는 경우 버스에서 이 작업을 수행해야 합니다. 반면, Direct2D는 리소스가 이미 비디오 메모리에 있기 때문에 해당 기본 형식을 Direct3D 기본 형식으로 변환할 수 있습니다.

렌더링 방법

호환성을 유지하기 위해 GDI 는 CPU를 사용하여 조리개 메모리에 렌더링의 상당 부분을 수행합니다. 반면 Direct2D 는 API 호출을 Direct3D 기본 형식 및 그리기 작업으로 변환합니다. 그런 다음 결과는 GPU에서 렌더링됩니다. 일부 GDI 렌더링은 조리개 메모리가 GDI 창을 나타내는 비디오 메모리 화면에 복사될 때 GPU에서 수행됩니다.

확장성

Direct2D의 렌더링 호출은 모두 GPU에 대한 독립적인 명령 스트림입니다. 각 Direct2D 팩터리는 다른 Direct3D 디바이스를 나타냅니다. GDI 는 시스템의 모든 애플리케이션에 대해 하나의 명령 스트림을 사용합니다. GDI의 메서드는 GPU 및 CPU 렌더링 컨텍스트 오버헤드를 빌드할 수 있습니다.

위치

Direct2D 는 Direct3D 런타임 및 사용자 모드 Direct3D 드라이버를 포함하여 전적으로 사용자 모드에서 작동합니다. 이렇게 하면 커널의 코드 결함으로 인한 시스템 충돌을 방지할 수 있습니다. 그러나 GDI는 커널 모드의 세션 공간에서 대부분의 기능을 가지고 있으며 API 표면은 사용자 모드입니다.

하드웨어 가속의 가용성

GDI 는 Windows XP에서 하드웨어 가속되며 데스크톱 창 관리자가 실행 중이고 WDDM 1.1 드라이버를 사용할 때 Windows 7에서 가속됩니다. Direct2D 는 거의 모든 WDDM 드라이버 및 DWM 사용 여부에 따라 하드웨어가 가속화됩니다. Vista에서 GDI는 항상 CPU에서 렌더링됩니다.

프레젠테이션 모델

Windows가 처음 디자인되었을 때 모든 창을 자체 비트맵에 저장할 수 있는 메모리가 부족했습니다. 따라서 GDI 는 애플리케이션이 창 외부에서 렌더링되지 않도록 다양한 클리핑 영역을 적용하여 항상 논리적으로 화면에 직접 렌더링됩니다. Direct2D 모델에서 애플리케이션은 백 버퍼로 렌더링되고 애플리케이션 그리기를 완료하면 결과가 표시됩니다. 이를 통해 Direct2D는 GDI보다 훨씬 더 유동적으로 애니메이션 시나리오를 처리할 수 있습니다.

결론

기존 GDI 코드는 Windows 7에서 계속 잘 작동합니다. 그러나 새 그래픽 렌더링 코드를 작성할 때 최신 GPU를 더 잘 활용하므로 Direct2D 를 고려해야 합니다.