Является ли GDI+ просто слоем поверх GDI или чем-то новым?

Когда вышел GDI+, я помню всю шумиху о том, что это был «новый, быстрый, лучший» способ отображения данных в Windows. Но каждый раз, когда я смотрел на него, мне казалось, что на самом деле это просто COM-обертка вокруг GDI.

Это правда? Или GDI+ действительно независимая графическая библиотека, которая просто разделяет некоторые парадигмы с GDI?

Лично я не уверен, как это может быть независимым, но я никогда не видел определенного утверждения так или иначе.


person Euro Micelli    schedule 09.07.2009    source источник


Ответы (3)


Многие функции GDI ускоряются графическим оборудованием, а некоторые подпрограммы GDI+ могут использовать GDI. Но большая часть GDI+ не зависит от GDI.

Важным и красноречивым примером является рендеринг текста. В GDI+ рендеринг текста полностью выполняется программно; сглаживание, подгонка пикселей по глифам и другие эффекты выполняются без видеокарты.

alt text
(источник: microsoft.com)

У Криса Джексона из Microsoft есть интересный пост в блоге, в котором он описывает разница в скорости рендеринга текста в GDI и GDI+:

... мой путь кода GDI отображал примерно 99 000 глифов в секунду, а мой путь кода GDI+ отображал примерно 16 000 глифов в секунду.

Другим примером является рисование линий. GDI+ поддерживает сглаженное рисование линий/многоугольников и кругов/эллипсов, в то время как GDI не поддерживает:

alt text
(источник: microsoft.com)
alt text
(источник: microsoft.com)

alt text
(источник: microsoft.com)

person Ian Boyd    schedule 16.01.2010
comment
Но чтобы ответить на ваш вопрос более прямо: GDI+ совершенно новый. На самом деле это становится проблемой, поскольку он медленнее, чем GDI (т. е. не имеет аппаратного ускорения), а рендеринг текста отличается от GDI (что приводит к тому, что текст может выглядеть по-разному в разных частях приложения .NET). Это не оболочка COM вокруг GDI, на самом деле это даже не COM. Это плоский C API. Microsoft создала набор классов C++, которые упрощают вызов плоских функций. System.Drawing в .NET — это набор классов, которые также вызывают плоские функции. - person Ian Boyd; 09.11.2011

GDI+ построен на основе GDI и добавляет несколько дополнительных функций. Например, в GDI+ добавлена ​​поддержка прозрачности, сглаживания, растяжения растровых изображений и т. д.

GDI+ — это, в основном, API на основе объектов, а GDI — это API-интерфейс функций. Большинство функций в GDI+ не оптимизированы аппаратно (они обрабатываются программным обеспечением), в отличие от GDI. Например, в GDI BitBlt обрабатывается непосредственно аппаратно. Функции растрового рисования GDI+ не поддерживаются.

GDI+ — это мощный API, но будьте осторожны с его производительностью.

GDI+ доступен в C++, COM и .NET.

person decasteljau    schedule 09.07.2009

GDI+ не COM. GDI+ имеет базовый «плоский» API, который можно вызывать из C (или, следовательно, из любого другого языка), и объектно-ориентированную оболочку в C++, которая просто вызывает плоский API. В .NET (System.Drawing) и Delphi также есть обертки, которые также просто вызывают плоский API. Он работает совершенно иначе, чем GDI, поскольку вы не устанавливаете объекты (перья, кисти, шрифты) в контекст устройства, а передаете их функциям рисования. Он не имеет много общего с GDI. Я не знаю, использует ли реализация GDI+ GDI, но, скорее всего, нет, потому что у него так много функций, которые просто недоступны в GDI.

К сожалению, он медленнее, чем GDI. Хотя он очень мощный.

Как отметил в то же время Декастеляу, проблемы с производительностью могут быть связаны с тем, что он не обрабатывается аппаратно, в отличие от OpenVG или WPF. Недавно я использовал XNA для графического приложения реального времени.

person OregonGhost    schedule 09.07.2009