Direct2D 및 GDI 하드웨어 가속 비교
Direct2D 및 GDI 즉시 모드 2D 렌더링 API이며 둘 다 어느 정도의 하드웨어 가속을 제공합니다. 이 항목에서는 두 API의 하드웨어 가속 기능에서 과거와 현재의 차이점을 포함하여 Direct2D와 GDI의 차이점을 살펴봅니다.
이 항목에는 다음과 같은 부분이 있습니다.
- Direct2D와 GDI 간의 차이점
- GDI 및 Direct2D 하드웨어 가속
- Windows 7 GDI 렌더링
- Windows 7에서 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의 각 인스턴스는 이 고유한 커널 모드 주소 공간에서 독립적으로 실행됩니다. 그러나 Direct2D는 사용자 모드에서 실행되고 사용자 모드 Direct3D 드라이버를 통해 그리기 명령을 커널 모드 드라이버에 전달합니다.
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로 변경된 방법을 보여 줍니다.
또한 아래에 설명된 대로 GDI 드라이버 모델을 변경하는 여러 가지 추가 요인이 있었습니다.
디스플레이 드라이버의 복잡성 및 크기 증가
3D 드라이버는 시간이 지남에 따라 더 복잡해졌습니다. 더 복잡한 코드는 더 많은 결함이 있는 경향이 있으므로 드라이버 버그로 인해 시스템을 다시 부팅할 수 없는 사용자 모드에서 드라이버가 존재하는 것이 좋습니다. 위의 그림에서 볼 수 있듯이 디스플레이 드라이버는 복잡한 사용자 모드 구성 요소와 더 간단한 커널 모드 구성 요소로 나뉩니다.
세션 및 전역 커널 주소 공간 동기화의 어려움
Windows XP에서 디스플레이 드라이버는 세션 공간과 커널 공간이라는 두 개의 서로 다른 주소 공간에 존재합니다. 드라이버의 일부는 전원 관리 이벤트와 같은 이벤트에 응답해야 합니다. 세션 주소 공간의 드라이버 상태와 동기화해야 합니다. 이는 어려운 작업이며 디스플레이 드라이버가 이러한 고유한 주소 공간을 처리하려고 할 때 결함이 발생할 수 있습니다.
복합 창 관리
Windows 7에서 도입된 창 구성 관리자인 바탕 화면 창 관리자(DWM)는 모든 창을 스크린 밖의 표면으로 렌더링한 후, 화면에 표시되도록 함께 구성합니다. 이렇게 하려면 GDI가 표면에 렌더링할 수 있어야 하고, 그런 다음 Direct3D가 이를 렌더링하여 표시해야 합니다. GDI와 Direct3D는 병렬 드라이버 스택이므로 XP 드라이버 모델에서 문제가 발생했습니다.
그 결과 Windows Vista에서 GDI DDI 디스플레이 드라이버는 GDI 콘텐츠를 화면에 작성할 시스템 메모리 비트맵으로 렌더링하는 Microsoft 제공 CDD(정식 디스플레이 드라이버)로 구현되었습니다.
Windows 7의 GDI 렌더링
Windows Vista에서 사용되는 드라이버 모델을 사용하려면 모든 GDI 창이 비디오 메모리 표면과 시스템 메모리 표면 모두에서 지원되어야 했습니다. 이로 인해 모든 GDI 창에 시스템 메모리가 사용되었습니다.
이러한 이유로 GDI Windows 7에서 다시 변경되었습니다. GDI는 시스템 메모리 화면에 렌더링하는 대신 조리개 메모리 세그먼트로 렌더링하도록 수정되었습니다. 창 내용을 포함하는 비디오 메모리 화면에서 조리개 메모리를 업데이트할 수 있습니다. GDI는 조리개 메모리로 다시 렌더링할 수 있으며 결과를 창 화면으로 다시 보낼 수 있습니다. 조리개 메모리 세그먼트는 GPU에서 주소를 지정할 수 있으므로 GPU는 이러한 업데이트를 비디오 메모리 화면으로 가속화할 수 있습니다. 예를 들어 이러한 경우 텍스트 렌더링, BitBlts, AlphaBlend, TransparentBlt 및 StretchBlt이 모두 가속화됩니다.
Windows 7에서 Direct2D와 GDI 가속의 비교
Direct2D 및 GDI 모두 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 고려해야 합니다.