그래픽스 디바이스 인터페이스
Graphics Device Interface
그래픽스 디바이스 인터페이스(GDI)는 Microsoft Windows의 레거시 컴포넌트로, 그래픽 오브젝트를 표시해 모니터나 프린터등의 출력 디바이스에 송신합니다.Windows 앱은 Windows API를 사용하여 선 및 곡선 그리기, 글꼴 렌더링, 팔레트 처리 등의 작업을 위해 GDI와 상호 작용합니다.Windows USER 서브시스템은 GDI를 사용하여 창 프레임 및 메뉴와 같은 UI 요소를 렌더링합니다.다른 시스템에는 GDI와 유사한 구성 요소가 있습니다. 예를 들어 macOS에는 Quartz가 있고 Linux에는 X Window System과 Wayland(디스플레이 서버 프로토콜)가 있습니다.
하드웨어에 직접 액세스하는 방법보다 GDI의 가장 큰 장점은 아마도 확장 기능과 타깃 디바이스의 추상적인 표현일 것입니다.GDI 를 사용하면, 화면이나 프린터등의 복수의 디바이스로 그림을 그릴 수 있어 각각의 케이스에 적절한 재현을 기대할 수 있습니다.이 기능은, Microsoft Windows 용 대부분의 「보이는 것은 얻는 것」애플리케이션의 중심에 있습니다.
고속 그래픽 렌더링을 필요로 하는 심플한 게임에서는 GDI를 사용할 수 있지만, GDI는 고도의 애니메이션에서는 사용하기 어렵고, 비디오 카드 내의 비디오 프레임과 동기화하는 개념이 결여되어 있으며, 3D용 하드웨어 래스터라이제이션이 결여되어 있습니다.최신 게임에서는 DirectX, Vulkan 또는 OpenGL을 대신 사용합니다.
기술적 세부사항
GDI에서 디바이스 컨텍스트(DC)는 출력 디바이스(예를 들어 화면 또는 프린터)의 텍스트 및 화상의 속성을 정의합니다.GDI는 실제 컨텍스트를 유지합니다.출력을 생성하려면 Device Context(HDC; 디바이스 컨텍스트)에 대한 핸들이 필요합니다.출력 생성 후 핸들을 놓을 수 있습니다.
GDI는 브레센햄의 선 그리기 알고리즘을 사용하여 별칭 선을 [1]그립니다.
버전 이력
초기 버전
GDI는 Windows의 초기 릴리스에 포함되어 있었습니다.지금까지 MS-DOS 프로그램은 소프트웨어 인터럽트(경우에 따라서는 비디오 BIOS를 통해)와 비디오 메모리를 직접 조작하여 그래픽 하드웨어를 조작해 왔습니다.이렇게 작성된 코드는 Windows와 같은 멀티태스킹 환경에서는 사용할 수 없었던 비디오 메모리의 유일한 사용자로 간주됩니다.1983년 12월, BITE 매거진은, 향후의 Windows [2]의 첫 릴리스에서, 같은 코드로 프린터와 모니터에 그래픽을 출력하는 시스템의 계획에 대해 논의했습니다.
윈도 XP
Windows XP의 도입으로 GDI+는 GDI를 보완하였으며, GDI+는 C++로 작성되었습니다.안티에이리어스 2D 그래픽스, 부동소수점 좌표, 그라데이션 쉐이딩, 보다 복잡한 경로 관리, JPEG 및 PNG와 같은 최신 그래픽 파일 형식에 대한 내구성 및 2D 뷰 파이프라인에서의 아핀 변환 합성 지원이 추가되었습니다.GDI+는 RGBA 값을 사용하여 색상을 나타냅니다.이러한 기능은 Microsoft 페인트, Windows Picture and Fax Viewer, Photo Printing Wizard, My Pictures 슬라이드 쇼 스크린세이버 등의 Windows XP 컴포넌트에서 사용할 수 있습니다.기본 그래픽 계층에 존재하기 때문에 Adobe Flash 또는 SVG와 같은 벡터 그래픽 시스템의 구현이 크게 간소화됩니다.게다가.NET Framework는 GDI+의 관리 인터페이스를System.Drawing
네임스페이스.
GDI+는 Windows XP 이후에 포함되어 있습니다만, GDI+ 다이내믹 라이브러리는 애플리케이션과 함께 출하되어 이전 버전의 Windows에서도 [3]사용할 수 있습니다.
GDI+에는 텍스트 처리 및 해상도 독립 기능이 추가되어 있기 때문에 CPU는 텍스트 [4]렌더링을 수행합니다.그 결과 하드웨어 가속 [5]GDI보다 크기가 훨씬 느립니다. Chris Jackson은 자신이 작성한 텍스트 렌더링 코드 조각이 GDI에서 초당 99,000 글리프를 렌더링할 수 있음을 나타내는 몇 가지 테스트를 발표했지만, GDI+를 사용한 동일한 코드는 초당 16,600 글리프를 렌더링했습니다.
GDI+는 (목적과 구조 면에서) 애플의 QuickDraw GX 서브시스템, 오픈 소스 libart 및 카이로 라이브러리와 유사합니다.
윈도 비스타
Windows Vista 에서는, GDI 와 GDI+ 애플리케이션을 포함한 모든 Windows 애플리케이션은, 하드웨어 가속의 새로운 컴포지팅 엔진인 데스크탑 윈도우 매니저(DWM)로 동작합니다.따라서 GDI 자체는 하드웨어 [6][7][8]액셀러레이션이 되지 않습니다.구성 작업의 특성으로 인해 기본 콘텐츠를 응용 [7]프로그램에서 다시 렌더링할 필요가 없기 때문에 창 이동 속도가 빨라지거나 응답성이 향상될 수 있습니다.
윈도 7
Windows 7 에는, Windows Display Driver Model v1.1 의 조작을 저지하기 위한 GDI 하드웨어 액셀러레이션이 포함되어 있습니다.이것에 의해, GDI 퍼포먼스가 향상해, DWM이 로컬 비디오 메모리를 사용해 컴포지트를 실시할 수 있게 되어, 시스템 메모리의 풋 프린트가 삭감되어 그래픽 처리의 퍼포먼스가 향상됩니다.Direct2D와 달리 대부분의 기본 GDI 작업은 여전히 하드웨어 가속되지 않습니다.GDI+는 Windows [9]7의 소프트웨어 렌더링에 계속 의존하고 있습니다.
GDI 프린터
GDI 프린터 또는 Winprinter(Winmodem과 유사)는, Windows 를 실행하고 있는 호스트 컴퓨터의 출력을 받아들이도록 설계된 프린터입니다.호스트 컴퓨터가 모든 인쇄 처리를 실시합니다.GDI 는, 페이지를 비트맵으로서 렌더링 해, 프린터 드라이버가 수신, 처리, 관련하는 프린터로 [10][11]송신합니다.GDI 와 드라이버의 편성은 쌍방향입니다.프린터로부터 인쇄 준비가 되었는지, 용지가 부족했는지 등의 정보를 수신합니다.
GDI에 의존하지 않는 프린터는 페이지 렌더링에 하드웨어, 펌웨어 및 메모리가 필요한 반면 GDI 프린터는 호스트 컴퓨터를 사용합니다.다만, 독자적인 제어 언어를 가지는 프린터는, 적절한 드라이버를 가지는 디바이스로부터의 입력을 받아 들일 수 있는 반면, GDI 프린터는 Windows 를 실행하고 있는 PC 가 필요합니다.GDI 프린터는, Windows 가 가동하고 있는 컴퓨터상에서 공유 프린터로서 접속되어 있는 경우, 네트워크상의 컴퓨터로 사용할 수 있습니다.일반적인 GDI 드라이버에는 다음과 같은 것이 있습니다.pnm2ppa
GDI 프린터가 FreeBSD 등 Windows 이외의 운영체제와의 호환성을 목표로 하고 있습니다만,[10] 모든 프린터를 서포트하는 것은 아닙니다.
Winprinters 용 드라이버를 간단하게 작성할 수 있도록 Microsoft Universal Printer Driver 가 작성되었습니다.이것에 의해, 프린터 벤더는 범용 프린터 기술(GPD)의 「미니드리버」를 작성할 수 있습니다.이 「미니드리버」는, 커널 모드 드라이버의 개발을 실시할 필요가 없습니다.
Microsoft는 Open XML Paper Specification을 통해 이 인쇄 모델에서 벗어났습니다.
제한 사항
각 창은 GDI 개체를 소비합니다.창의 복잡성이 증가하고 버튼이나 이미지 등의 기능이 추가되면서 GDI 오브젝트 사용률도 높아집니다.너무 많은 개체를 사용하면 Windows에서 GDI 개체를 더 이상 그릴 수 없게 되어 소프트웨어가 제대로 작동하지 않고 프로그램 [12]작동이 중지되거나 응답하지 않습니다.또한 많은 응용 프로그램이 잘못 코딩되어 사용 후 GDI 개체를 해제하지 못해 문제가 [13]더욱 가중됩니다.사용 가능한 총 GDI 개체는 Windows 버전에 따라 다릅니다.Windows 9x 에서는 총 오브젝트 수가 1,200개, Windows 2000 에서는 16,384개, Windows XP 이후에서는 프로세스당 10,000개(단,[14][15] 이론적으로는 세션 전체에서 최대 65,536개)로 설정 가능한 제한이 있습니다.Windows 8 이후에는 사용자 로그온 세션별로 GDI 개체 제한을 65,536개로 늘립니다.
Windows 3.1이나 Windows 98등의 이전 버전의 Windows 에는, 사용중의 시스템 GDI 자원의 총량을 감시할 수 있는 자원 미터 프로그램이 포함되어 있습니다.이 리소스 미터는 GDI 개체 자체를 사용했습니다.Windows 2000 및 Windows XP 등의 최신 버전은 태스크 매니저의 각 프로그램의 GDI 개체 사용량을 보고할 수 있지만 사용 가능한 총 GDI 용량을 사용자에게 알려줄 수는 없습니다.
GDI 용량이 넘쳐나면 Windows 자체에 영향을 미쳐 새 창이 열리지 않고 메뉴가 표시되지 않으며 경고 상자가 표시되지 않을 수 있습니다.코어 시스템 프로그램의 동작을 방해하기 때문에, 이 상황을 해소하기 어렵고, 시스템의 강제 리셋이 필요한 경우가 있습니다.Windows 8 및 8.1에서는 재부팅 대신 GDI 용량 오버플로로 인해 강제 로그오프가 발생합니다.
후계자
Direct2D는 GDI와 GDI+의 후속 모델입니다.Uniscribe의 형제인 DirectWrite가 Uniscribe를 대체합니다.Windows 7 및 Windows Server 2008 R2와 함께 출하되었으며 Windows Vista 및 Windows Server 2008(플랫폼 업데이트 설치)에서 사용할 수 있습니다.나중에 마이크로소프트는 자유 오픈 소스 GDI와 같은 클래스 라이브러리인 Win2D를 개발했습니다.Win2D의 타깃은 C++, C# 및 Visual Basic을 사용하는 개발자입니다.NET은 범용 Windows 플랫폼 앱을 [16]개발합니다.
「 」를 참조해 주세요.
주 및 참고 자료
- ^ Steven, White; David, Coulter; Mike, Jacobs (31 May 2018). "Comparing Direct2D and GDI Hardware Acceleration". Windows Developer. Microsoft.
- ^ Butler, John (December 1983). "Device-Independent Graphics Output for Microsoft Windows". BYTE. p. 49. Retrieved 20 October 2013.
- ^ GDI+
- ^ "2D Drawing APIs in Windows -". DirectX Developer Blog. MSDN Blogs. May 12, 2009. Retrieved July 19, 2012.
- ^ Jackson, Chris. "GDI vs. GDI+ Text Rendering Performance". Chris Jackson's Semantic Consonance. Microsoft.
- ^ MSDN: Direct2D와 GDI 하드웨어 액셀러레이션 비교
- ^ a b Windows Vista에서 GDI는 하드웨어 액셀러레이션되지 않습니다.
- ^ 레이어드 창...SW가 HW보다 빠를 수 있습니다.MSDN 블로그에 있는 Avalite.
- ^ Thomas Olsen (October 29, 2008). "Introducing the Microsoft Direct2D API".
- ^ a b "Generic GDI Printer". Open Printing. The Linux Foundation. Retrieved 21 July 2021.
{{cite web}}
: CS1 maint :url-status (링크) - ^ "Windows-only printers". Linux Documentation Project. Retrieved October 29, 2019.
- ^ Microsoft Knowledge Base(문서번호)838283) "Windows XP 또는 Windows 2000에서 프로세스가 GDI 오브젝트 쿼터를 초과하면 데스크톱 애플리케이션 메뉴가 올바르게 표시되지 않음" http://support.microsoft.com/kb/838283
- ^ Microsoft Developer Network Blog - GDI leak in Outlook 2007 causes problems when GDI usage reaches 10,000 objects http://blogs.msdn.com/rgregg/archive/2007/09/03/outlook-2007-gdi-leak-hotfix.aspx
- ^ Microsoft Developer Network - GDI 오브젝트
- ^ Microsoft Knowledge Base(문서번호 894500) -새로운 NT 운영체제 상에서 설계된 NET 프로그램은 GDI 사용제한이 낮아 오래된 Win 95/Win 98/Win Me에서 오작동할 수 있습니다.http://support.microsoft.com/kb/894500
- ^ "Win2D". microsoft/Win2D repo. Microsoft. Retrieved 21 July 2021 – via GitHub.com.
{{cite web}}
: CS1 maint :url-status (링크)