Введение: почему вывод через GDI остаётся важным?
Сразу же отметим: если вы не читали статью "
Во второй части мы сфокусируемся на важности GDI, объясним особенности 2D-графики более глубоко, а также дадим ссылку на скачивание нашего теста 2D с русскоязычным интерфейсом (на самом деле мы дали ссылку на скачивание в нашем Клубе экспертов ещё в ветке обсуждения первой статьи, чтобы поощрить форумчан). Чтобы полностью понимать результаты этого теста, сначала нужно рассмотреть некоторые теоретические фундаментальные основы.
Почему мы тестируем GDI в эпоху Windows 7 и Direct2D?
Как думают многие наши читатели, с представлением видеокарт класса DirectX 10 и Windows Vista старые методы GDI для отрисовки 2D-графики были признаны устаревшими. Уже некоторое время для разработчиков Microsoft доступна WPF (Windows Presentation Foundation), а также и Direct2D. В любом случае, есть множество весомых причин, почему GDI (Graphics Device Interface) остаётся очень значимым и актуальным, что заставляет нас тестировать производительность GDI даже в новой среде Windows 7. Среди этих причин хотелось бы отметить следующие.
- GDI продолжает поддерживать старые видеокарты, а Direct2D требует видеокарт, которые поддерживают стандарт DirectX 10 или более высокий.
- GDI поддерживается во всех известных версиях Windows, а Direct2D доступен только в Windows Vista и Windows 7.
- Любое графическое приложение, которое работает под Windows XP (и старыми версиями Windows), использует GDI.
Многие разработчики ПО не торопятся переносить свои программы со старых API на новые. Даже сегодня многие разработчики продолжают использовать программные библиотеки, в которых они хорошо разбираются, пусть даже доступны новые технологии. Преобразование из одной библиотеки в другую подразумевает переписывание и повторные тесты всех модулей кода. Поскольку прирост производительности в результате перехода со старых библиотек на новые может быть едва ощутим, разработчики ПО игнорируют такие изменения по чисто экономическим причинам (слишком много времени и усилий за слишком маленький результат). В качестве примера можно взять историю внедрения Direct2D в разных компонентах Mozilla Firefox, и вы получите представление о лени в индустрии по поводу данного процесса преобразования. Кроме того, для многих компаний будет просто самоубийством не поддерживать сообщество пользователей Windows XP в последних версиях программ. Всё это приводит к одному наблюдению: GDI будет с нами до тех пор, пока Windows XP не перестанет представлять большую долю в сообществе конечных пользователей.
Есть также технические причины, которые объясняют продолжающееся использование GDI. Ключевые модули кода GDI (которые содержатся и используются чаще всего в приложениях Windows) уже не такие маленькие. Direct2D также потребляет существенное количество вычислительной мощности и системных ресурсов, но не может сделать ничего, что нельзя было бы реализовать через Direct3D. И те, кто всё же решили отказаться от использования Direct3D, обычно принимают это решение довольно осторожно. Кроме того, GDI работает независимо от устройств вывода, таких как мониторы или принтеры, которые могут использоваться. Поэтому одна и та же процедура в программе может отрисовывать графику на мониторе или выводить документ на принтер, уменьшая размер кода (и соответствующие затраты на обслуживание и риск ошибок) в два раза. Многие из доступных принтеров сегодня являются устройствами GDI, и вряд ли ситуация изменится в ближайшем будущем, даже под Windows 7, где широко доступны драйверы для принтеров только для GDI.
Сами мы рассматриваем переход на WPF и Direct2D как меру, которую усиленно продвигает Microsoft, а также как необратимый шаг вперёд. Но не следует из-за эйфории новых технологий забывать о реальности жизни. Принимая во внимание Windows XP, сегодня более чем достаточно наследственных технологий. Нельзя смотреть только вперёд, игнорируя современное состояние реальности, в которой живёт большинство пользователей. В качестве примера можно привести известную нелюбовь интегрированных графических ядер 780G и 785G к Windows XP.
Мы вернёмся к
2D GDI от Windows XP до Windows 7 в деталях
XP: ясная поддержка без конкуренции
До Windows XP и включая эту систему, GDI играл ключевую роль в отображении 2D-графики. Возьмём в качестве примера создание и вывод линии. Движения мыши, используемые для отрисовки линии, передавались win32k.sys, центральному компоненту для всех событий. Причём совсем неважно, использовали ли вы мышь, клавиатуру или другие устройства ввода; все данные собирались в этой процедуре для последующего распределения. Затем информацию получало наше приложение, которое превращало её в инструкции рисования GDI. Они направлялись на GDI, тоже в win32k.sys, что показано фиолетовыми стрелками на диаграмме.
Эти простые процедуры, использовавшиеся для программного вывода 2D-графики, также объясняют, почему так легко перейти с них на аппаратное ускорение - если видеокарта обладает достаточными возможностями для независимой их отрисовки. Синяя стрелка на иллюстрации выше показывает, как информация возвращается в вызывающее приложение, чтобы оно было оповещено об изменении содержимого окна (например, когда другие окна уже не закрывают видимый контент), чтобы форсировать перерисовку содержимого.
Видеокарты HD1xxx в линейке ATI Radeon и ранее выпущенные, а также в линейке nVidia GeForce 7xxx и ранее, использовали отдельный блок для ускорения 2D-графики. Он исчез с появлением видеокарт DX10, которые использовали унифицированную архитектуру шейдеров у обоих производителей.
Windows Vista: CPU вместо GPU и буферизация вместо прямой доставки
Как мы уже объясняли в
Что же здесь происходит? Обратите внимание на красные стрелки на диаграмме. Вместо унифицированного графического драйвера (в XP он назывался DDI Display Driver) адресуется новый CDD (Canonical Display Driver). Этот модуль в Vista независим от видеокарты. Хотя текущее содержание окна хранится в виде текстуры в видеопамяти видеокарты, каждое окно должно храниться в виде соответствующего буфера в оперативной памяти (его размер равен ширине окна умноженной на высоту окна и на четыре байта для 32-битного цвета).
Самое свежее отображение каждого окна преобразуется в битовую картинку в системной памяти, после чего оно преобразуется в 3D-текстуру в памяти видеокарты. Таким образом, DWM управляет всеми окнами и передаёт их контент через Direct3D. DWM также получает данные о том, если окно изменилось в какой-либо области, что приводит к перерисовке (синяя стрелка на иллюстрации выше). В этот момент DWM копирует содержимое системной памяти в видеопамять и отрисовывает окно с помощью Direct3D. Приложениям уже не требуется перерисовывать окна (в отличие от работы под Windows XP).
Упомянутый выше подход по своей сути отключает аппаратное ускорение 2D, приводя к серьёзному падению производительности по сравнению с Windows XP. Это также проявляет себя под Vista в виде запаздывания отрисовки 2D-графики и потребления больших объёмов памяти.
Windows 7: аппаратное ускорение в минимальных дозах
Даже во время начального тестирования в
На первый взгляд, всё выглядит так же, как и под Vista. Однако мы уже видим, что теперь не нужно дважды буферизировать содержимое каждого окна. Вместо системной памяти здесь работает так называемая апертурная память (aperture memory). Под этим термином понимается специфическая область в обычной оперативной памяти, к которой видеокарта может обращаться напрямую. Если содержимое окна будет изменяться из-за перемещения или наложения, это содержимое будет копироваться напрямую из данной памяти в видеопамять на видеокарте.
По сравнению с Windows XP, только подмножество команд GDI поддерживается GPU - а именно ClearType, ColorFill, BitBlt, AlphaBlend, TransparentBlt и StretchBlt. Если вы не знакомы с этими командами, то они выполняют следующее: прямой вывод текста, заполнение поверхности простыми цветами, копирование содержимого окна и прозрачное наложение. Хотя рендеринг сложных геометрических фигур не поддерживается вообще, копии содержимого окна и заполняемые области могут легко передаваться из апертурной памяти напрямую в память видеокарты.
Итог
Windows 7 снизила использование памяти, устранив большую часть двойной буферизации содержимого окон. Впрочем, даже Vista выиграла от подобных эффектов благодаря переходу на более новую модель драйверов WDDM. Именно поэтому аппаратное ускорение вновь стало возможным благодаря новому обновлению платформы (которое произошло вместе с внедрением DirectX 11), схожим с Windows 7. Но за это пришлось расплачиваться сложностью и возможными проблемами с драйверами. Но всё это мы детально рассмотрим дальше в нашей статье.