Эволюция графики в Windows

87

Трудно оценить важность WPF не принимая во внимание тот факт, что разработчики Windows-приложений в течение более 15 лет пользовались, по сути, одной и той же технологией отображения. Стандартное Windows-приложение при создании пользовательского интерфейса полагается на две основополагающие части операционной системы Windows:

User32

Обеспечивает знакомый внешний вид и поведение таких элементов, как окна, кнопки, текстовые поля и т.п.;

GDI/GDI+

Предоставляет поддержку рисования фигур, текста и изображений за счет дополнительного усложнения (и часто неважной производительности).

С годами обе технологии совершенствовались, и API-интерфейсы, используемые разработчиками для взаимодействия с ними, значительно менялись. Но как бы ни разрабатывалось приложение — с помощью .NET и Windows Forms, (в прошлом) Visual Basic 6 или кода С++ на основе MFC — "за кулисами" работают одни и те же части операционной системы Windows. Новые платформы просто предоставляют улучшенные оболочки для взаимодействия с User32 и GDI/GDI+. Они могут быть более эффективными, менее сложными, могут включать некоторые заранее подготовленные средства, чтобы не приходилось создавать их самостоятельно, однако они не могут преодолеть фундаментальные ограничения системных компонентов, разработанных более 10 лет назад.

Базовое разделение ответственности между User32 и GDI/GDI+ было заложено свыше 15 лет назад в Windows 3.0. Конечно, часть User32 в те времена была просто User, поскольку тогда программное обеспечение еще не вошло в 32-разрядный мир.

Использование DirectX

В Microsoft разработали один обходной путь для преодоления ограничений, присущих библиотекам User32 и GDI/GDI+. Этим путем является DirectX. Он начинался как "топорный", полный ошибок инструментальный набор для создания игр на платформе Windows. Главной его целью была скорость, и потому Microsoft тесно сотрудничала с производителями видеокарт, чтобы обеспечить для DirectX аппаратную поддержку, необходимую для отображения сложных текстур, специальных эффектов вроде частичной прозрачности и трехмерной графики.

За годы, прошедшие с момента появления (вскоре после выхода Windows 95), механизм DirectX обрел зрелость. Теперь это неотъемлемая часть Windows, которая включает поддержку всех современных видеокарт. Однако API-интерфейс DirectX по-прежнему несет в себе наследие своих корней как средства для разработки игр. Из-за присущей DirectX сложности он почти никогда не использовался в традиционных Windows-приложениях (в частности, в бизнес-приложениях).

Технология WPF в корне меняет ситуацию. Лежащая в основе WPF графическая технология — это не GDI/GDI+. Теперь это DirectX. Примечательно, что приложения WPF используют DirectX независимо от создаваемого типа пользовательского интерфейса. Это значит, что создается ли сложная трехмерная графика (DirectX's forte), или просто рисуются кнопки и простой текст — вся работа по рисованию проходит через конвейер DirectX. В результате даже самые заурядные бизнес-приложения могут использовать богатые эффекты вроде прозрачности и сглаживания. Также получается выигрыш от аппаратного ускорения, и это означает, что DirectX передает как можно больше работы узлу обработки графики (graphics processing unit — GPU), который представляет собой отдельный процессор на видеокарте.

Технология DirectX более эффективна, поскольку оперирует высокоуровневыми конструкциями вроде текстур и градиентов, которые могут отображаться непосредственно видеокартой. Компонент GDI/GDI+ на это не способен, поэтому ему приходится преобразовывать их в инструкции рисования пикселей, и потому отображение проходит намного медленнее даже на современных видеокартах.

Один компонент, который остается на сцене (в ограниченной степени) — это User32. Это объясняется тем, что WPF по-прежнему полагается на User32 в отношении таких служб, как обработка и маршрутизация ввода, а также определение того, какое приложение какой частью экрана владеет. Однако все рисование производится через DirectX.

Это наиболее существенное изменение в WPF. Технология WPF — это не оболочка для GDI/GDI+. На самом деле это его замена — отдельный уровень, работающий через DirectX.

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

Возможно, вам известно, что видеокарты различаются между собой в плане поддержки специализированных средств визуализации и оптимизации. К счастью, проблемой это не является, поскольку WPF обладает способностью выполнять всю работу с использованием программных вычислений вместо того, чтобы полагаться на встроенную поддержку видеокарты.

В отношении программной поддержки WPF существует одно исключение. Из-за слабой поддержки драйверов WPF выполняет сглаживание трехмерной графики только в случае, если приложение запущено под управлением Windows Vista или Windows 7 (и есть встроенный драйвер WDDM для установленной видеокарты).

Это значит, что при рисовании трехмерных фигур на компьютере с Windows ХР вместо гладких линий будут получены ступенчатые ломаные. Однако для двумерной графики сглаживание обеспечивается всегда, независимо от операционной системы и поддержки драйверов.

Наличие мощной видеокарты не дает абсолютной гарантии, что вы получите максимальную, с аппаратной поддержкой производительность на WPF. Программное обеспечение также играет важную роль. Например, WPF не может обеспечить аппаратного ускорения на видеокартах, если используются устаревшие драйверы. (Для устаревших видеокарт, такие драйверы, скорее всего, будут единственно доступными.) Технология WPF также обеспечивает более высокую производительность в средах операционных систем Windows Vista и Windows 7, где она может пользоваться преимуществами новой модели дисплейных драйверов Windows (Windows Display Driver Model — WDDM). Модель WDDM предлагает несколько важных усовершенствований по сравнению с Windows ХР Display Driver Model (XPDM). Что более важно, WDDM позволяет запланировать несколько операций GPU одновременно и отображать страницы памяти видеокарты на обычную системную память, если вся память видеокарты израсходована.

Запомните в качестве главного эмпирического правила: WPF предоставляет некоторого рода аппаратное ускорение всем драйверам WDDM и драйверам XPDM, созданным после ноября 2004 г., когда Microsoft издала новые руководства по разработке драйверов. Разумеется, уровень поддержки отличается. Когда инфраструктура WPF запускается в первый раз, она оценивает видеокарту и назначает ей рейтинг от 0 до 2.

Среди обещаний, связанных с WPF, было и то, что вам не нужно беспокоиться о деталях и сложностях, связанных со специфическим аппаратным обеспечением. Технология WPF достаточно интеллектуальна, чтобы по возможности использовать аппаратную оптимизацию, но в случае неудачи все будет обработано программно. Поэтому если вы запустите WPF-приложение на компьютере с унаследованной видеокартой, интерфейс будет выглядеть так, как он был разработан. Конечно, программные альтернативы могут оказаться значительно медленнее, так что вы столкнетесь с тем, что компьютеры со старыми видеокартами не очень хорошо отрабатывают расширенные приложения WPF — особенно те, что включают сложную анимацию или другие сложные графические эффекты. На практике может быть принято решение упростить некоторые сложные эффекты в пользовательском интерфейсе, в зависимости от уровня аппаратной поддержки, доступной клиенту (определяется свойством RenderCapability.Tier).

Целью WPF является взвалить на видеокарту как можно больше работы, чтобы сложные графические процедуры ограничивались возможностями визуализации (узлом обработки графики), а не вычислительной мощностью процессора (центральным процессором компьютера). При таком подходе центральный процессор высвобождается для другой работы, видеокарта используется максимально эффективно и появляется возможность пользоваться преимуществами новых видеокарт по мере их появления.

Уровни WPF

Видеокарты значительно различаются между собой. Когда WPF оценивает видеокарту, то учитывает множество факторов, включая объем памяти видеокарты, поддержку построителей текстур (встроенные процедуры вычисления пиксельных эффектов наподобие прозрачности), вершинных построителей текстур (встроенные процедуры вычисления значений вершин треугольника, которые применяются при текстурировании трехмерных объектов). На основе всех этих деталей определяется значение уровня визуализации WPF.

WPF распознает три уровня визуализации:

Уровень визуализации 0

Видеокарта не предоставляет никакого аппаратного ускорения. Это соответствует версии DirectX ниже 7.0.

Уровень визуализации 1

Видеокарта обеспечивает частичное аппаратное ускорение. Это соответствует версии DirectX выше 7.0, но ниже 9.0.

Уровень визуализации 2

Все средства, которые могут быть ускорены аппаратно, будут ускорены. Это отвечает версии DirectX 9.0 и выше.

В некоторых ситуациях требуется программно проверить текущий уровень визуализации, чтобы выборочно отключить некоторые сложные графические средства на менее мощных картах. Для этого используется статическое свойство Tier класса System.Windows.Media.RenderCapability. Но здесь должен быть предпринят один трюк. Чтобы извлечь значение уровня из свойства Tier, необходимо выполнить сдвиг на 16 бит, как показано ниже:

int renderingTier = (RenderCapability.Tier >> 16);
if (renderingTier == 0)
{...}
else if (renderingTier == 1)
{...}

Такое проектное решение допускает расширяемость. В будущих версиях WPF другие биты свойства Tier могут быть использованы для сохранения информации о поддержке других свойств, создавая в результате подуровни.

Пройди тесты
Лучший чат для C# программистов