Поделиться через


Сравнение аппаратного ускорения Direct2D и GDI

Как Direct2D , так и GDI — это ИНТЕРФЕЙСы API для двухмерной отрисовки немедленного режима и предлагают некоторую степень аппаратного ускорения. В этом разделе рассматриваются различия между Direct2D и GDI, включая прошлые и нынешние различия в функциях аппаратного ускорения обоих API.

Этот раздел состоит из следующих частей:

Различия между Direct2D и GDI

GDI отрисовывает непрозрачные геометрические объекты с псевдонимами, такие как многоугольники, эллипсы и линии. Он отображает текст с псевдонимом и ClearType, а также поддерживает смешивание прозрачности с помощью API AlphaBlend. Тем не менее, его обработка прозрачности является несогласованной, и большинство API GDI просто игнорируют альфа-канал. Немногие API GDI гарантируют, что альфа-канал будет содержать после операции. Что еще более важно, отрисовка GDI не легко сопоставляется с трехмерным операциями, а современный GPU наиболее эффективно отображается в трехмерной части модуля отрисовки. Например, линии с псевдонимами Direct2D предназначены для реализации в виде двух треугольников, отображаемых на GPU, тогда как GDI использует алгоритм рисования линий Брезенхэма.

Direct2D отрисовывает непрозрачные, прозрачные, псевдонимы и сглаживаемые примитивы. Современные пользовательские интерфейсы часто используют прозрачность и анимацию. Direct2D упрощает создание современного пользовательского интерфейса, так как он имеет строгие гарантии в отношении того, как он принимает и отображает прозрачное содержимое, а все его примитивы отрисовываются с помощью аппаратного ускорения. Direct2D не является чистой надмножеством GDI: примитивы, которые были бы необоснованно медленными при реализации на GPU, отсутствуют в Direct2D. Так как Direct2D создается с акцентом на трехмерном ускорении, его также легко использовать с Direct3D.

С Windows NT 4 GDI работает в режиме ядра. Приложение вызывает GDI, который затем вызывает своего аналога режима ядра, который передает примитивы в собственную модель драйвера. Затем этот драйвер отправляет результаты в драйвер отображения глобального режима ядра.

Начиная с Windows 2000 , драйверы GDI и GDI выполняются в независимом пространстве ядра, называемом "пространством сеанса". Для каждого сеанса входа создается адресное пространство сеанса, и каждый экземпляр GDI выполняется независимо в этом отдельном адресном пространстве режима ядра. Однако Direct2D выполняется в пользовательском режиме и передает команды рисования через драйвер Direct3D пользовательского режима драйверу режима ядра.

Рис. 1 — direct2d по сравнению с gdi

Аппаратное ускорение GDI и Direct2D

Наиболее важным отличием между аппаратным ускорением Direct2D и GDI является базовая технология, которая управляет ими. Direct2D располагается поверх Direct3D, и У GDI есть собственная модель драйвера — интерфейс драйвера устройства GDI (DDI), соответствующий примитивам GDI. Модель драйвера Direct3D соответствует тому, что отрисовывает оборудование трехмерной отрисовки в GPU. При первом определении DDI GDI большинство оборудования для ускорения отображения было ориентировано на примитивы GDI. Со временем все больше и больше внимания уделялось ускорению 3D-игр и меньше — ускорению приложений. В результате API BitBlt был аппаратным ускорением, а большинство других операций GDI — нет.

Это задает этап для последовательности изменений в том, как GDI отрисовывается на дисплее. На следующем рисунке показано, как отрисовка дисплея GDI изменилась с Windows XP на Windows 7.

Рис. 2. Эволюция отрисовки дисплея gdi

Существует также ряд дополнительных факторов, которые вызвали изменения в модели драйвера GDI , как описано ниже.

Увеличение сложности и размера драйверов дисплея

С течением времени трехмерные драйверы стали более сложными. Более сложный код, как правило, имеет больше дефектов, что делает его полезным для драйвера в пользовательском режиме, где ошибка драйвера не может привести к перезагрузке системы. Как видно на рисунке выше, драйвер дисплея делится на сложный компонент пользовательского режима и более простой компонент режима ядра.

Сложность синхронизации сеансов и глобальных адресных пространств ядра

В Windows XP драйвер дисплея существует в двух разных адресных пространствах: пространстве сеанса и пространстве ядра. Части драйвера должны реагировать на такие события, как события управления питанием. Это необходимо синхронизировать с состоянием драйвера в адресном пространстве сеанса. Это сложная задача, и она может привести к дефектам, когда драйверы отображения пытаются справиться с этими отдельными адресными пространствами.

Управление составными окнами

Диспетчер окон рабочего стола (DWM), диспетчер окон для создания элементов, представленный в Windows 7, отрисовывает все окна на поверхности вне экрана, а затем объединяет их для отображения на экране. Для этого GDI должен иметь возможность отрисовки на поверхности, которая затем будет отрисовывается Direct3D для отображения. Это создало проблему в модели драйвера XP, так как GDI и Direct3D были параллельными стеками драйверов.

В результате в Windows Vista драйвер дисплея GDI DDI был реализован, так как корпорация Майкрософт предоставила канонический драйвер дисплея (CDD), который отрисовывал содержимое GDI в растровом рисунке системной памяти для создания на экране.

Отрисовка GDI в Windows 7

Модель драйвера, используемая в Windows Vista, требовала, чтобы каждое окно GDI было подкреплено как поверхностью видеопамяти, так и поверхностью системной памяти. Это привело к использованию системной памяти для каждого окна GDI.

По этой причине GDI был снова изменен в Windows 7. Вместо отрисовки в поверхности системной памяти GDI был изменен для отрисовки в сегмент памяти с диафрагмой. Память диафрагмы можно обновить из области видеопамяти, в ней содержится содержимое окна. GDI может отрисовывать обратно в память диафрагмы, а затем результаты могут быть отправлены обратно на поверхность окна. Так как сегмент памяти диафрагмы адресуется GPU, GPU может ускорить эти обновления в области видеопамять. Например, отрисовка текста, BitBlts, AlphaBlend, TransparentBlt и StretchBlt в этих случаях ускоряются.

Контрастное ускорение Direct2D и GDI в Windows 7

Direct2D и GDI — это интерфейсы API визуализации в двухмерном немедленном режиме и аппаратное ускорение. Однако в обоих API остается ряд различий.

Расположение ресурсов

GDI по умолчанию сохраняет свои ресурсы, в частности растровые изображения, в системной памяти. Direct2D сохраняет свои ресурсы в видеопамях на адаптере дисплея. Если GDI требуется обновить видеопамяти, это необходимо сделать по шине, если ресурс уже находится в сегменте памяти диафрагмы или если операция может быть выражена напрямую. В отличие от этого, Direct2D может просто преобразовать свои примитивы в примитивы Direct3D, так как ресурсы уже находятся в видеопамяти.

Метод отрисовки

Для поддержания совместимости GDI выполняет большую часть своей отрисовки в диафрагме памяти с помощью ЦП. В отличие от этого, Direct2D преобразует вызовы API в примитивы Direct3D и операции рисования. Затем результат отрисовывается на GPU. Часть отрисовки GDI выполняется на GPU, когда память диафрагмы копируется в область видеопамять, представляющую окно GDI.

Масштабируемость

Вызовы отрисовки Direct2D являются независимыми потоками команд для GPU. Каждая фабрика Direct2D представляет собой отдельное устройство Direct3D. GDI использует один поток команд для всех приложений в системе. Метод GDI может привести к нарастать нагрузку на GPU и контекст отрисовки ЦП.

Расположение

Direct2D работает полностью в пользовательском режиме, включая время выполнения Direct3D и драйвер Direct3D в пользовательском режиме. Это помогает предотвратить сбои системы, вызванные дефектами кода в ядре. Однако GDI имеет большую часть своих функциональных возможностей в пространстве сеанса в режиме ядра, а поверхность API — в пользовательском режиме.

Доступность аппаратного ускорения

GDI — это аппаратное ускорение в Windows XP и ускорение в Windows 7, когда запущен диспетчер окон рабочего стола и используется драйвер WDDM 1.1. Direct2D — это аппаратное ускорение практически в любом драйвере WDDM и независимо от того, используется ли DWM. В Vista GDI всегда будет отображаться на ЦП.

Модель представления

Во время создания Windows не хватало памяти, чтобы каждое окно сохранялось в собственном растровом рисунке. В результате GDI всегда логически отображается непосредственно на экране с применением различных областей обрезки, чтобы приложение не отображалось за пределами окна. В модели Direct2D приложение отрисовывается в обратном буфере, а результат отображается после завершения рисования приложения. Это позволяет Direct2D обрабатывать сценарии анимации гораздо более плавно, чем GDI.

Заключение

Существующий код GDI будет по-прежнему хорошо работать в Windows 7. Однако при написании нового кода отрисовки графики следует учитывать Direct2D , так как он лучше использует преимущества современных GPU.