Windows XP: "старая школа" 2D и пределы WM_PAINT
Вы можете говорить о Windows XP всё, что думаете, но аппаратное ускорение GDI работает безупречно и по сей день, при этом его хватает для большинства типов приложений. Впрочем, чего XP сделать не может, так это переложить технику работы со слоями 2,5D на современные 3D-видеокарты. Как мы уже описывали выше, рендеринг содержимого окон выполняется самими приложениями.
Типичное 2D-приложение, для которого вряд ли будут покупать дорогую видеокарту. Нажмите на картинку для увеличения.
Это ограничение вряд ли обеспокоит тех пользователей, кто концентрирует свои усилия на любом одном окне настольного приложения. Наиболее типичное применение подобной технологии можно видеть в окружениях SDI (single device interface, интерфейс одного устройства). Но всё становится более неудобным, когда на рабочем столе открыты и видны множество окон. Кто будет против того, чтобы воспользоваться улучшенной технологией слоёв, которая поддерживает меню, лучше работает на современном "железе", а также облегчает работу с несколькими окнами на нескольких мониторах? Кому не хотелось бы оставить размывание перемещаемых окон и следы за ними в прошлом, получив более высокую графическую 2D-производительность?
Окна как колода карт: эффект дублирования окон под XP при перетаскивании. Нажмите на картинку для увеличения.
Хотя чистая 2D-производительность в векторных графических программах, таких как Corel Draw или приложений САПР, достаточно высока, поскольку функции GDI в них поддерживаются должным образом, мы упёрлись в ограничения возможностей WM_PAINT. Когда графический интерфейс XP перегружен анимацией, мягкими тенями, прозрачными окнами и другими графическими элементами, он вплотную приближается к пределам 2D-графики.
Когда система находится под тяжёлой нагрузкой, то функция WM_Paint "повисает" или обновляется только время от времени. События перерисовки должны дождаться своей очереди, чтобы быть выполненными. Нажмите на картинку для увеличения.
Многие пользователи обнаружили, что лучше всего отображать окна только в виде рамок при их переносе, а анимированные меню вообще лучше выключить. В целом, экономия графических ресурсов оказывается вполне нормальным подходом при работе на рабочем столе XP. К сожалению, многие красивые графические темы оказались, в конце концов, в корзине после первоначальной эйфории, связанной с запуском новой операционной системы, поскольку ОС теряла способность выводить всю графику без ошибок или без задержек.
Microsoft быстро заметила, что её графическое решение 2D, которое присутствовало во всех версиях Windows до этого, включая XP, требует замены. Да и растущая доступность всё более быстрых 3D-ускорителей вместе со снижающимися ценами на дискретные GPU явно указывали на то, что времена (и операционные системы) меняются.
Типичный пример 3D-видеокарты в 2005 году: Radeon X1800.
На данный момент важно отметить, что аппаратное ускорение в XP изначально не работало с интегрированным графическим ядром ATI 780G в "родных" разрешениях вообще. В результате окна отрисовывались медленно, что ухудшало даже базовую производительность web-браузера. Последующие обновления драйвера помогли решить эти проблемы. Но даже сегодня графическое ядро 780G не может работать оптимально, что сильно контрастирует с 740G. Но сегодня, когда XP уже остаётся в прошлом, это суждение, возможно, тоже должно разделить подобную судьбу...
Затем на рынок вышла Windows Vista, которая является, возможно, самой противоречивой ОС Microsoft (вместе с Windows ME). В любом случае, независимо от вашей любви или ненависти к Vista, компания уже не могла откладывать некоторые технические совершенствования.
Краткий итог по XP таков.
- Аппаратное ускорение 2D работало безупречно для команд GDI.
- Аппаратного ускорения для слоёв 2,5D не было предусмотрено, что приводило к замедлению пользовательского интерфейса.
- Повторяющаяся перерисовка или изменение содержимого окна отнимала время, а также сказывалась на производительности.
Windows Vista: прогресс и отказ от старого
Когда мы впервые установили Windows Vista, то едва сдерживали себя. Интригующая, сложная и улучшенная, Vista обещала очень немало.
Много света и теней, но без аппаратного ускорения 2D. Нажмите на картинку для увеличения.
Но то, что казалось очень революционным на первый взгляд, сменялось огорчениями при запуске того или иного приложения, а иногда и просто вселяло ужас. Давайте рассмотрим самые важные особенности в деталях.
Аппаратная реализация слоёв 2,5D
Эта технология была впервые реализована в Windows Vista. На её выход потребовалось весьма долгое время, но в 2006 году технология, наконец, появилась. Впрочем, одно небольшое ограничение оставалось: она работала только в том случае, если был активирован интерфейс Aero. Кроме того, для поддержки слоёв 2,5D требовалась видеокарта с поддержкой 3D, причём даже если вы не планировали запускать 3D-приложения или игры. Если вы использовали тему Vista Basic, то приходилось смириться с теми же эффектами размытия и раздвоения при перемещении окон, которые были знакомы пользователям XP, поскольку поддержка слоёв 2,5D автоматически выключалась – даже если в системе была установлена 3D-видеокарта. Обидно.
Переход на поддержку слоёв 2,5D также заставил Microsoft решать несколько проблем. Vista считалась медленной операционной системой, но, по большей части, стабильной. Но что же случилось? Мы уже упоминали, что GDI был ключевым интерфейсом для программирования графики. После введения (к сожалению), очень медленного расширения GDI+ на основе C++, которое так и не обусловило технологического прорыва из-за своей производительности, мы уже не могли отрицать существование своего рода "хаоса интерфейсов". Фактически, было очень и очень непохоже, что GDI, GDI+, DirectDraw и Direct3D могут быть вообще одновременно ускорены аппаратно.
WDDM & DWM - Windows Display Driver Model и Dynamic Windows Manager
Помимо новой модели драйверов устройств, Windows представила модель DWM для управления устройствами вывода на экран. Общая концепция оказалась не такой простой, она добавила программный уровень (и соответствующее увеличение сложности) между окнами и командами отрисовки с одной стороны, а также между драйверами и устройствами с другой стороны. Прямое взаимодействие было прекращено по причине появления DWM. Пытаясь получить контроль над всем, модель DWM обеспечивала координацию всех отдельных графических интерфейсов. Этот переход оставил в стороне довольно серьёзную графическую особенность, о которой мы уже упоминали – а именно аппаратное ускорение функций отображения GDI. Понять сложно, но так именно и произошло.
Большую часть дополнительной памяти, которую потребляет Vista, обычно относят к технологии SuperFetch. К сожалению, это лишь частично описывает ситуацию в реальности. Отсутствие аппаратного 2D-ускорения привело к тому, что вся тяжесть вызовов GDI по выводу содержимого окон ложится на CPU. Всё это приводит к огромному буферу внутри DWM. Полные отображения окон должны затем передаваться на видеокарту. Но это быстро привело к появлению серьёзного "узкого места", поскольку только одно окно в один момент времени может отсылать команды GDI на DWM. Асинхронные задачи не разрешаются, что приводит к длительной очереди ожидающих запросов на обслуживание. Всё это не только требует существенного процессорного времени на выполнение, но и потребляет немалый объём памяти, поскольку все активные окна находятся внутри буфера DWM. Отдельные окна могут занимать 100 Мбайт, так что вполне понятно, что потребление памяти будет увеличиваться. В самых экстремальных случаях Vista может попросту "зависнуть" – например, когда вредоносная программа будет открывать одно окно за другим в бесконечном цикле. Конечно, такой цикл не может продолжаться бесконечно, поэтому вам придётся выполнить принудительное выключение компьютера, чтобы восстановить контроль над системой.
 |
Удвоение потребления памяти не удваивает наслаждение от работы (источник: Microsoft). Нажмите на картинку для увеличения.
Подведём краткий итог по Vista.
- Vista впервые использует аппаратное ускорение для модели слоёв 2,5D.
- С активной технологией Aero медленная перерисовка окон Windows остаётся в прошлом.
- Microsoft отказывается от аппаратного ускорения функций 2D-отрисовки GDI.
- DWM не может работать с окнами в асинхронном режиме, что негативно сказывается на графической производительности.
- Очередь ожидания команд GDI внутри DWM может отнять большой объём памяти.