Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Интерфейс графического устройства ( GDI ) - это интерфейс прикладного программирования Microsoft Windows и основной компонент операционной системы, отвечающий за представление графических объектов и их передачу на устройства вывода, такие как мониторы и принтеры .

GDI отвечает за такие задачи, как рисование линий и кривых, визуализация шрифтов и обработка палитр . Он не несет прямой ответственности за рисование окон, меню и т.д .; эта задача зарезервирована для пользовательской подсистемы, которая находится в user32.dll и построена поверх GDI. Другие системы имеют компоненты, которые похожи на GDI, например MacOS « Кварц и X Window System » s Xlib / XCB .

Наиболее значительными преимуществами GDI по сравнению с более прямыми методами доступа к оборудованию, возможно, являются его возможности масштабирования и абстрактное представление целевых устройств. Используя GDI, очень легко рисовать на нескольких устройствах, таких как экран и принтер, и ожидать надлежащего воспроизведения в каждом случае. Эта возможность лежит в основе большинства приложений типа « Что видишь, то и получаешь » для Microsoft Windows.

Простые игры, не требующие быстрой отрисовки графики, могут использовать GDI. Однако GDI относительно сложно использовать для расширенной анимации, и в нем отсутствует понятие синхронизации с отдельными видеокадрами на видеокарте , отсутствует аппаратная растеризация для 3D и т. Д. Современные игры обычно вместо этого используют DirectX , Vulkan или OpenGL , что позволяет программистам использовать возможности современного оборудования.

Технические детали [ править ]

Контекста устройства (DC) используется для определения атрибутов текста и изображений, которые выводятся на экран или принтер. Фактический контекст поддерживается GDI. Дескриптор контекста устройства (HDC) получается перед записью вывода и затем освобождается после записи элементов. GDI использует алгоритм рисования линий Брезенхэма для рисования линий с псевдонимом. [1]

История версий [ править ]

Ранние версии [ править ]

GDI присутствовал в первоначальном выпуске Windows. Программы MS-DOS до сих пор управляли графическим оборудованием, используя программные прерывания (иногда через Video BIOS ) и напрямую управляя видеопамятью . Код, написанный таким образом, предполагает, что это единственный пользователь видеопамяти, что было неприемлемо в оконной системе, такой как Microsoft Windows, где несколько приложений захотят писать (в свои собственные подокна) одновременно. В декабре 1983 года BYTE обсудил планы Microsoft относительно системы вывода графики на принтеры и мониторы с одним и тем же кодом в предстоящем первом выпуске Windows. [2]

Windows XP [ править ]

С появлением Windows XP GDI был дополнен подсистемой GDI + на основе C ++ . GDI + добавляет сглаженную 2D-графику, координаты с плавающей запятой, градиентное затенение, более сложное управление путями, встроенную поддержку современных форматов графических файлов, таких как JPEG и PNG , и поддержку композиции аффинных преобразований в конвейере 2D-просмотра. GDI + использует значения RGBA для представления цвета. Использование этих функций очевидно в пользовательском интерфейсе Windows XP и некоторых ее приложениях, таких как Microsoft Paint , Windows Picture и Fax Viewer., Мастер печати фотографий и заставка «Слайд-шоу Мои изображения», а также их присутствие в базовом графическом слое значительно упрощает реализацию систем векторной графики, таких как Flash или SVG .

GDI + входит в состав всех версий Windows, начиная с Windows XP. Динамическая библиотека GDI + также может поставляться с приложением и использоваться в более старых версиях Windows, начиная с Windows 98 и Windows NT 4.0 и более поздних. [3]

Из-за дополнительных возможностей обработки текста и независимости от разрешения в GDI + рендеринг текста выполняется ЦП [4], и это почти на порядок медленнее, чем в GDI с аппаратным ускорением. [5] Крис Джексон опубликовал несколько тестов, показывающих, что написанный им фрагмент кода визуализации текста может отображать 99 000 глифов в секунду в GDI, но тот же код, использующий GDI +, отображает 16 600 символов в секунду.

Библиотека классов Microsoft .NET предоставляет управляемый интерфейс для GDI + через System.Drawing пространство имен .

GDI + похож (по назначению и структуре) на подсистему Apple QuickDraw GX , а также библиотеки libart и Cairo с открытым исходным кодом .

Windows Vista [ править ]

В Windows Vista все приложения Windows, включая приложения GDI и GDI +, запускаются в новом механизме компоновки, диспетчере окон рабочего стола (DWM), который построен на основе модели драйвера дисплея Windows . Рендеринг GDI реализуется с помощью Canonical Display Driver (cdd.dll), который обращается к поверхностям системной памяти, которые затем перенаправляются через DWM, и GDI больше не ускоряется аппаратно драйвером видеокарты . [6] [7] [8] Из-за характера операций композиции перемещение окна может быть быстрее или более отзывчивым, поскольку приложение не требует повторного рендеринга нижележащего содержимого. [7]

Windows 7 [ править ]

Windows 7 включает аппаратное ускорение GDI для операций копирования в Windows Display Driver Model v1.1 . Это улучшает производительность GDI драйвера Canonical Display Driver и позволяет механизму DWM использовать локальную видеопамять для компоновки, тем самым уменьшая объем системной памяти и повышая производительность графических операций. Большинство примитивных операций GDI по-прежнему не имеют аппаратного ускорения, в отличие от Direct2D . По состоянию на ноябрь 2009 года и AMD, и Nvidia выпустили видеодрайверы, совместимые с WDDM v1.1.

GDI + продолжает полагаться на программный рендеринг в Windows 7. [9]

Принтеры GDI [ править ]

Принтер GDI или Winprinter (аналог Winmodem ) - это принтер, предназначенный для приема вывода с главного компьютера, на котором запущен GDI под Windows. Главный компьютер выполняет всю обработку печати: программное обеспечение GDI отображает страницу как растровое изображение, которое отправляется программному драйверу принтера , обычно предоставляемому производителем принтера, для обработки для конкретного принтера, а затем на принтер. [10] [11] Комбинация GDI и драйвера является двунаправленной; они получают информацию от принтера, например, готов ли он к печати, закончилась ли бумага или чернила и т. д.

Принтеры без поддержки GDI требуют оборудования, микропрограмм и памяти для рендеринга страниц; принтер GDI использует для этого главный компьютер, что делает его дешевле в производстве, чем аналогичный принтер без GDI. Некоторые производители выпускают по существу один и тот же принтер в версии, совместимой с языком управления принтером, таким как PCL или PostScript , и более дешевой версией только для GDI. В большинстве случаев только самые дешевые модели в линейке любого производителя поддерживают только GDI.

Принтер с собственным языком управления может принимать ввод от любого устройства с подходящим драйвером; Для принтера GDI требуется ПК с ОС Windows, и он несовместим с другим оборудованием и операционными системами. Как правило, принтеры GDI несовместимы с аппаратными серверами печати , хотя некоторые серверы имеют встроенную возможность обработки, что делает их совместимыми с указанными принтерами GDI. Принтеры GDI можно сделать доступными для компьютеров в сети, если они подключены как общие принтеры на компьютере, который включен и работает под управлением Windows. Были написаны некоторые «общие» драйверы GDI, такие как pnm2ppa, которые делают некоторые принтеры GDI совместимыми с операционными системами, отличными от Windows, такими как FreeBSD , но нет гарантии, что какой-либо конкретный принтер GDI будет поддерживаться. [10]

Чтобы упростить создание драйверов для Winprinters, был создан универсальный драйвер принтера Microsoft . Это позволяет поставщикам принтеров писать «минидрайверы» общего описания принтера (GPD), которые описывают возможности принтера и набор команд в виде открытого текста, вместо того, чтобы заниматься разработкой драйверов режима ядра.

Ограничения [ править ]

Каждый раз, когда открывается окно, оно потребляет объекты GDI. По мере увеличения сложности окна с дополнительными функциями, такими как кнопки и изображения, также увеличивается использование его объекта GDI. Когда используется слишком много объектов, Windows не может рисовать больше объектов GDI, что приводит к некорректной работе программного обеспечения и зависанию и зависанию работы программы. [12] Многие приложения также неправильно закодированы и не могут освободить объекты GDI после использования, что еще больше усугубляет проблему. [13]Общее количество доступных объектов GDI варьируется от одной версии Windows к другой: Windows 95, 98 и Millennium имеют ограничение в 1200 общих объектов; Windows 2000 имеет ограничение в 16 384 объекта; а Windows XP, Vista и Windows 7 имеют настраиваемый предел (через реестр), который по умолчанию составляет 10 000 объектов на процесс (но теоретический максимум 65 536 для всего сеанса). [14] [15] Windows 8 и 8.1 дополнительно увеличивают лимит объектов 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 вместо аппаратной перезагрузки.

Например, при принудительном завершении замороженного процесса с помощью диспетчера задач обычно появляется окно предупреждения «Вы уверены» . При отсутствии бесплатного GDI Windows издает звуковой сигнал об ошибке, и выбор предупреждения не появляется, поэтому процессы, переполняющие GDI, не могут быть прекращены (если пользователь не использует команду taskkill ).

Преемник: Direct2D и DirectWrite [ править ]

Direct2D и DirectWrite были разработаны для замены GDI / GDI + и Uniscribe соответственно для экранно-ориентированного рендеринга и поставлялись с Windows 7 и Windows Server 2008 R2, а также с Windows Vista и Windows Server 2008 (с установленным обновлением платформы). Для WPF / UWP на основе всех приложений Win2D является GDI , как библиотеки классов , разработанный Microsoft , который можно загрузить в Visual Studio с помощью NuGet . Win2D - это простой в использовании API среды выполнения Windows для рендеринга 2D-графики в немедленном режиме с ускорением графического процессора. [16] [17]

См. Также [ править ]

  • Крыло
  • DirectX
  • Спецификация XML Paper
  • Direct2D
  • DirectWrite
  • Не описывать
  • Файлы библиотеки Microsoft Windows

Примечания и ссылки [ править ]

  1. ^ Сравнение Direct2D и аппаратного ускорения GDI. https://msdn.microsoft.com/en-us/library/windows/desktop/ff729480(v=vs.85).aspx
  2. Батлер, Джон (декабрь 1983 г.). «Независимый от устройства вывод графики для Microsoft Windows» . БАЙТ . п. 49 . Проверено 20 октября 2013 года .
  3. ^ GDI +
  4. ^ «API-интерфейсы 2D-рисования в Windows -» . Блог разработчиков DirectX . Блоги MSDN. 12 мая 2009 года . Проверено 19 июля 2012 года .
  5. ^ Джексон, Крис. «GDI против GDI + производительность отрисовки текста» . Семантическое созвучие Криса Джексона . Microsoft.
  6. ^ MSDN: Сравнение аппаратного ускорения Direct2D и GDI
  7. ^ a b GDI не имеет аппаратного ускорения в Windows Vista
  8. ^ Многослойные окна ... SW иногда быстрее, чем HW . Авалите в блогах MSDN.
  9. Томас Олсен (29 октября 2008 г.). «Знакомство с Microsoft Direct2D API» .
  10. ^ a b "linuxprinting.org о принтере GDI" . Фонд Linux. Архивировано из оригинала 7 февраля 2007 года . Проверено 24 декабря 2020 года .
  11. ^ "Принтеры только для Windows" . Проект документации Linux . Проверено 29 октября 2019 года .
  12. ^ Статья 838283 базы знаний Майкрософт - меню настольных приложений отображаются неправильно, если процесс превышает квоту объекта GDI в Windows XP или Windows 2000 http://support.microsoft.com/kb/838283
  13. ^ Блог Microsoft Developer Network - утечка GDI в Outlook 2007 вызывает проблемы, когда использование GDI достигает 10 000 объектов http://blogs.msdn.com/rgregg/archive/2007/09/03/outlook-2007-gdi-leak-hotfix.aspx
  14. ^ Microsoft Developer Network - ограничения объекта GDI http://msdn.microsoft.com/en-us/library/ms724291(VS.85).aspx
  15. ^ Статья 894500 базы знаний Майкрософт - Программы .NET, разработанные для новых операционных систем NT, могут работать неправильно в старых версиях Win 95 / Win 98 / Win ME из-за более низких ограничений использования GDI http://support.microsoft.com/kb/894500
  16. ^ Win2D GitHub Документы
  17. ^ Галерея примеров Win2D

Внешние ссылки [ править ]

  • Страница Microsoft GDI +
  • Список часто задаваемых вопросов Боба Пауэлла по GDI +
  • Статья MSDN об обзоре GDI
  • Бюллетень по безопасности Microsoft MS04-028
  • F-Secure: критическая уязвимость в MS Windows может усилить вирусную угрозу
  • IGDI + - библиотека Delphi с открытым исходным кодом GDI +.