Интерфейс графических устройств ( GDI ) — устаревший компонент Microsoft Windows, отвечающий за представление графических объектов и передачу их на устройства вывода, такие как мониторы и принтеры . Он был заменен API DirectDraw , а позднее — API Direct2D . [ требуется ссылка ] Приложения Windows используют API Windows для взаимодействия с GDI для таких задач, как рисование линий и кривых, рендеринг шрифтов и обработка палитр . Подсистема Windows USER использует GDI для рендеринга таких элементов пользовательского интерфейса, как оконные рамы и меню. Другие системы имеют компоненты, похожие на GDI; например: в Mac OS есть QuickDraw , а в Linux и Unix есть протокол ядра X Window System .
Наиболее существенными преимуществами GDI по сравнению с более прямыми методами доступа к оборудованию, пожалуй, являются его возможности масштабирования и абстрактное представление целевых устройств. Используя GDI, можно рисовать на нескольких устройствах, таких как экран и принтер, и ожидать правильного воспроизведения в каждом случае. Эта возможность лежит в основе большинства приложений " What You See Is What You Get " для Microsoft Windows.
Простые игры, не требующие быстрого рендеринга графики, могут использовать GDI. Однако GDI относительно сложно использовать для продвинутой анимации, в нем отсутствует понятие синхронизации с отдельными видеокадрами в видеокарте и отсутствует аппаратная растеризация для 3D. Современные игры обычно используют DirectX , Vulkan или OpenGL .
В GDI контекст устройства (DC) определяет атрибуты текста и изображений для устройства вывода, например, экрана или принтера. GDI поддерживает фактический контекст. Для генерации вывода требуется дескриптор контекста устройства (HDC). После генерации вывода дескриптор может быть освобожден.
GDI использует алгоритм рисования линий Брезенхэма для рисования алиасинговых линий. [1]
GDI присутствовал в первоначальном выпуске Windows. Программы MS-DOS манипулировали графическим оборудованием, используя программные прерывания (иногда через Video BIOS ) и напрямую манипулируя видеопамятью . Код, написанный таким образом, ожидает, что он является единственным пользователем видеопамяти, что было недопустимо в многозадачной среде , такой как Windows. Журнал BYTE в декабре 1983 года обсуждал планы Microsoft по созданию системы вывода графики как на принтеры, так и на мониторы с помощью одного и того же кода в предстоящем первом выпуске Windows. [2]
В Windows 3.1x и Windows 9x GDI может использовать функции Bit Blit для 2D-ускорения, если установлен подходящий драйвер видеокарты . [3]
С появлением Windows XP GDI + дополнил GDI. GDI+ был написан на C++. Он добавляет сглаженную 2D-графику, координаты с плавающей точкой, градиентное затенение, более сложное управление путями, встроенную поддержку современных форматов графических файлов, таких как JPEG и PNG , и поддержку композиции аффинных преобразований в конвейере 2D-вида. GDI+ использует значения RGBA для представления цвета. Использование этих функций очевидно в компонентах Windows XP, таких как Microsoft Paint , Windows Picture and Fax Viewer , Photo Printing Wizard и заставка My Pictures Slideshow. Их присутствие в базовом графическом слое значительно упрощает реализацию систем векторной графики, таких как Adobe Flash или SVG . Кроме того, .NET Framework предоставляет управляемый интерфейс для GDI+ через System.Drawing
пространство имен .
Хотя GDI+ включен в Windows XP и более поздние версии, динамическая библиотека GDI+ также может поставляться вместе с приложением и использоваться в более старых версиях Windows. [4]
Из-за дополнительных возможностей обработки текста и независимости от разрешения в GDI+, центральный процессор берет на себя рендеринг текста. [5] Результат на порядок медленнее, чем у аппаратно ускоренного GDI. [6] Крис Джексон опубликовал некоторые тесты, показывающие, что написанный им фрагмент кода рендеринга текста может рендерить 99 000 глифов в секунду в GDI, но тот же код с использованием GDI+ рендерил 16 600 глифов в секунду.
GDI+ похож (по назначению и структуре) на подсистему QuickDraw GX компании Apple , а также на библиотеки с открытым исходным кодом libart и Cairo .
В Windows Vista все приложения Windows, включая приложения GDI и GDI+, работают в новом движке композитинга, Desktop Window Manager (DWM), который имеет аппаратное ускорение. Таким образом, сам GDI больше не имеет аппаратного ускорения. [7] [8] [9] Из-за характера операций композиции перемещение окон может быть более быстрым или более отзывчивым, поскольку базовый контент не должен повторно визуализироваться приложением. [8]
Windows 7 включает аппаратное ускорение GDI для операций блитинга в Windows Display Driver Model v1.1 . Это повышает производительность GDI и позволяет DWM использовать локальную видеопамять для композитинга, тем самым уменьшая объем системной памяти и увеличивая производительность графических операций. Большинство примитивных операций GDI по-прежнему не имеют аппаратного ускорения, в отличие от Direct2D . GDI+ продолжает полагаться на программный рендеринг в Windows 7. [10]
Принтер GDI или Winprinter (аналог Winmodem ) — это принтер, предназначенный для приема вывода с хост-компьютера под управлением Windows. Хост-компьютер выполняет всю обработку печати: GDI отображает страницу как растровое изображение, которое драйвер принтера получает, обрабатывает и отправляет на связанный принтер. [11] [12] Сочетание GDI и драйвера является двунаправленным; они получают информацию от принтера, например, готов ли он к печати или закончилась бумага.
Принтеры, которые не полагаются на GDI, требуют оборудования, прошивки и памяти для рендеринга страниц, в то время как принтер GDI использует для этого хост-компьютер. Однако принтер со своим собственным языком управления может принимать ввод с любого устройства с подходящим драйвером, в то время как принтер GDI требует ПК под управлением Windows. Принтеры GDI могут быть доступны компьютерам в сети, если они подключены как общие принтеры на компьютере, который включен и работает под управлением Windows. pnm2ppa
Были написаны некоторые «универсальные» драйверы GDI, такие как ; они направлены на то, чтобы сделать принтеры GDI совместимыми с операционными системами, отличными от Windows, такими как FreeBSD , но они не могут поддерживать все принтеры. [11]
Для упрощения создания драйверов для Winprinters был создан универсальный драйвер принтера Microsoft . Он позволяет поставщикам принтеров писать «минидрайверы» Generic Printer Description (GPD), которые описывают возможности принтера и набор команд в виде открытого текста, вместо того, чтобы заниматься разработкой драйвера режима ядра.
Компания Microsoft отошла от этой модели печати, приняв спецификацию Open XML Paper .
Каждое окно потребляет объекты GDI. По мере увеличения сложности окна с дополнительными функциями, такими как кнопки и изображения, использование им объектов GDI также увеличивается. Когда используется слишком много объектов, Windows не может рисовать больше объектов GDI, что приводит к неправильному поведению программного обеспечения и зависанию и неотзывчивости работы программы. [13] Многие приложения также неправильно закодированы и не освобождают объекты GDI после использования, что еще больше усугубляет проблему. [14] Общее количество доступных объектов GDI варьируется от версии к версии Windows: в Windows 9x было ограничение в 1200 объектов; в Windows 2000 — в 16 384 объекта; а в Windows XP и более поздних версиях есть настраиваемый предел (через реестр), который по умолчанию составляет 10 000 объектов на процесс (но теоретический максимум — 65 536 для всего сеанса). [15] [16] В Windows 8 и более поздних версиях ограничение на количество объектов GDI увеличено до 65 536 на сеанс входа пользователя.
Более ранние версии Windows, такие как Windows 3.1 и Windows 98, включали программу Resource Meter, позволяющую пользователю отслеживать, какая часть общих системных ресурсов GDI используется. Этот измеритель ресурсов потреблял объекты GDI сам по себе. Более поздние версии, такие как Windows 2000 и Windows XP, могут сообщать об использовании объектов GDI для каждой программы в диспетчере задач, но они не могут сообщить пользователю общую доступную емкость GDI.
Переполнение емкости GDI может повлиять на саму Windows, не давая открываться новым окнам, отображать меню и выводить окна с предупреждениями. Ситуацию может быть трудно исправить, и потенциально может потребоваться принудительный сброс системы, поскольку это препятствует работе основных системных программ. В Windows 8 и 8.1 принудительный выход из системы происходит в результате переполнения емкости GDI вместо перезагрузки.
Direct2D является преемником GDI и GDI+. Его брат DirectWrite заменяет Uniscribe . Они поставлялись с Windows 7 и Windows Server 2008 R2 и были доступны для Windows Vista и Windows Server 2008 (с установленным Platform Update). Позже Microsoft разработала Win2D , бесплатную и открытую библиотеку классов, похожую на GDI. Целевой аудиторией Win2D являются разработчики, использующие C++, C# и Visual Basic.NET для разработки приложений Universal Windows Platform . [17]
{{cite web}}
: Отсутствует или пусто |title=
( помощь )