Введение

Microsoft Windows API

Графический интерфейс устройства (GDI) — это устаревший компонент Microsoft Windows, отвечающий за представление графических объектов и передачу их на выходные устройства, такие как мониторы и принтеры. Он был вытеснен API DirectDraw, а затем API Direct2D. Приложения Windows используют Windows API для взаимодействия с GDI, выполняя такие задачи, как рисование линий и кривых, рендеринг шрифтов и обработка палитр. Подсистема USER Windows использует GDI для рендеринга элементов пользовательского интерфейса, таких как рамки окон и меню. Другие системы имеют компоненты, аналогичные GDI; например, Mac OS имеет QuickDraw, а Linux и Unix — основной протокол X Window System. Наиболее значительными преимуществами GDI перед более прямыми методами доступа к аппаратному обеспечению, пожалуй, являются его возможности масштабирования и абстрактное представление целевых устройств. С помощью GDI можно рисовать на нескольких устройствах, таких как экран и принтер, и ожидать корректного воспроизведения в каждом случае. Эта возможность лежит в основе большинства приложений "Что вы видите, то и получаете" для Microsoft Windows. Простые игры, не требующие быстрой графической обработки, могут использовать GDI. Однако GDI относительно сложно использовать для сложной анимации, в нем отсутствует возможность синхронизации с отдельными кадрами видеокарты и аппаратная растрировка для 3D. В современных играх обычно используются DirectX, Vulkan или OpenGL.

Технические детали

В GDI контекст устройства (DC) определяет атрибуты текста и изображений для выходного устройства, например, экрана или принтера. GDI поддерживает актуальный контекст. Для формирования вывода требуется дескриптор контекста устройства (HDC). После формирования вывода дескриптор можно освободить. GDI использует алгоритм рисования линий Брезенхема для отрисовки растеризованных линий.

Ранние версии

GDI присутствовал в первоначальном выпуске Windows. Программы MS-DOS манипулировали графическим оборудованием, используя программные прерывания (иногда через видео BIOS) и напрямую изменяя видеопамять. Код, написанный таким образом, предполагает, что он является единственным пользователем видеопамяти, что было неприемлемо в многозадачной среде, такой как Windows. В декабре 1983 года журнал BYTE обсуждал планы Microsoft по созданию системы для вывода графики как на принтеры, так и на мониторы с использованием одного и того же кода в первом выпуске Windows. В Windows 3.1x и Windows 9x GDI может использовать функции Bit blit для 2D-ускорения, если установлен соответствующий драйвер графической карты.

Windows XP

С появлением 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. Из-за расширенных возможностей обработки текста и независимости от разрешения в GDI+, рендеринг текста выполняется центральным процессором. В результате производительность оказывается на порядок ниже, чем у аппаратно ускоренного GDI. Крис Джексон опубликовал результаты тестов, показывающих, что фрагмент кода для рендеринга текста, написанный им, мог отрисовывать 99 000 глифов в секунду в GDI, в то время как тот же код с использованием GDI+ отрисовывал 16 600 глифов в секунду. GDI+ аналогична (по назначению и структуре) подсистеме Apple QuickDraw GX, а также библиотекам с открытым исходным кодом libart и Cairo.

Windows Vista (англ.) (англ.)

В Windows Vista все приложения Windows, включая приложения GDI и GDI+, работают в новом механизме композиции Desktop Window Manager (DWM), который использует аппаратное ускорение. В связи с этим, сам GDI больше не поддерживается аппаратным ускорением. Благодаря особенностям операций композиции, перемещение окон может выполняться быстрее и быть более отзывчивым, поскольку базовый контент не требует повторной отрисовки приложением.

Принтеры GDI

Принтер GDI или Winprinter (аналогично Winmodem) — это принтер, предназначенный для приема вывода с хост-компьютера, работающего под управлением Windows. Хост-компьютер выполняет всю обработку печати: GDI отрисовывает страницу в виде растрового изображения, которое получает драйвер принтера, обрабатывает и отправляет на соответствующий принтер. Комбинация GDI и драйвера является двунаправленной; они получают информацию от принтера, например, готов ли он к печати или закончилась ли бумага. Принтеры, не использующие GDI, требуют аппаратного обеспечения, прошивки и памяти для отрисовки страниц, в то время как принтер GDI использует для этого ресурсы хост-компьютера. Однако принтер с собственным языком управления может принимать ввод от любого устройства с подходящим драйвером, в то время как принтер GDI требует ПК с Windows. Принтеры GDI могут быть доступны компьютерам в сети, если они подключены как общие принтеры на компьютере, работающем под управлением Windows. Были разработаны некоторые "универсальные" драйверы GDI, такие как pnm2ppa, которые направлены на обеспечение совместимости принтеров GDI с операционными системами, отличными от Windows, такими как FreeBSD, но они не могут поддерживать все принтеры. Многие приложения также некорректно программируются и не освобождают объекты GDI после использования, что усугубляет проблему. Общее количество доступных объектов GDI варьируется в зависимости от версии Windows: Windows 9x имела ограничение в 1200 объектов; Windows 2000 — 16 384 объекта; Windows XP и более поздние версии имеют настраиваемый предел (через реестр), который по умолчанию составляет 10 000 объектов на процесс (но теоретический максимум — 65 536 для всей сессии). 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 (при установленном обновлении платформы). Позже Microsoft разработала Win2D — бесплатную библиотеку классов с открытым исходным кодом, аналогичную GDI. Win2D ориентирована на разработчиков, использующих C++, C# и Visual Basic .NET для разработки приложений Universal Windows Platform.