Введение: почему вывод через GDI остаётся важным?
Сразу же отметим: если вы не читали статью “Проблемы 2D-ускорения под Windows: не все видеокарты одинаковы“, то сначала ознакомьтесь с её содержанием, поскольку в первой части мы рассмотрели историю развития 2D-графики под Windows и выявили современные проблемы на high-end дискретных видеокартах.
Во второй части мы сфокусируемся на важности 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 и буферизация вместо прямой доставки
Как мы уже объясняли в первой части статьи, Vista представляет совершенно новый способ вывода графических данных через ОС. До обращения к GDI все функции рисования выполняются так же, как и в Windows XP, то есть через win32k.sys, но работу с окнами в GDI в Vista взял на себя DWM (dynamic window manager). Кроме того, Vista использует только Direct3D для управления окнами. Каждое окно для каждого приложения записывается в текстурную память в качестве 3D-текстуры для видеокарты. Это весьма практичная эволюция для более современных видеокарт, но это также означает, что GDI уже не может считывать или записывать эти данные. В данной ситуации цепочка связи прерывается. В итоге получается двойная буферизация содержимого окна, что мы уже объясняли в первой части.
Что же здесь происходит? Обратите внимание на красные стрелки на диаграмме. Вместо унифицированного графического драйвера (в 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: аппаратное ускорение в минимальных дозах
Даже во время начального тестирования в первой части статьи мы могли видеть, что Windows 7 вновь предложила, по крайней мере, частичную поддержку аппаратного ускорения команд GDI – для видеокарт с драйверами WDDM 1.1. Если эти драйверы не доступны (например, для некоторых чипсетов с интегрированной графикой Intel), то Windows 7 работает более или менее похоже на 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. Но за это пришлось расплачиваться сложностью и возможными проблемами с драйверами. Но всё это мы детально рассмотрим дальше в нашей статье.
Вывод 2D-графики с помощью GDI: прямой или буферизованный?
На самом деле не так и важно, как XP, Vista или Windows 7 взаимодействуют с GDI; с точки зрения программиста принципы написания кода остались прежними. Чем отличаются эти реализации, мы показали в предыдущей части статьи, особенно со стороны видеокарты. Здесь же мы рассмотрим, как всё это работает под разными ОС.
Команды рисования
Неважно, что мы будем говорить о 2D-выходе со стороны GDI, всё построено на хорошо знакомом наборе стандартизированных инструкций рисования. Поскольку детальное описание этих инструкций выходит за рамки статьи, здесь мы скажем только следующее: каждый из графических примитивов, включая линии, кривые, полигоны, прямоугольники и эллипсы, имеет собственную чётко определённую команду, включая свойства, такие как заполнение, ширина линии, цвет и так далее. Эти команды вместе с любыми параметрами, которые они могут использовать, передаются на GDI. Всё что происходит дальше уже не подконтрольно приложению.
Прямое или буферизованное рисование: слон или муравьи
В принципе, не так и важно, что использовать: взять миллион муравьёв и перенести песчинки на 100 метров от точки A до точки B, или заполнить большой контейнер песка, загрузить его на слона и перенести за один раз. Оба варианта достигают поставленной цели.
В любом случае, давайте рассмотрим разницу между двумя этими подходами: всё же слон подразумевает намного меньше трафика между двумя конечными пунктами. На координацию усилий миллиона муравьёв требуется больше времени и сил, чем загрузка и транспортировка одного контейнера на слоне.
Преимущество метода муравья заключается в том, что здесь не требуется дополнительного контейнера (или буфера) для переноски материалов. Кроме того, если требуется перенести лишь несколько песчинок, то муравьи справятся с работой эффективнее и лучше, чем слон. Всё зависит от типа активности и количества данных, с которыми нужно работать. Теперь давайте рассмотрим процесс, при котором GDI будет использоваться для рисования часов.
Прямая отрисовка (метод муравья) выполняется медленно и применима только в некоторых ситуациях, поскольку графические объекты будут выводиться неспешно и друг за другом.
Вывод информации через буфер (метод слона) означает сборку всех выводимых элементов в одной прямоугольной области внутри буфера, после чего рендеринг будет выполняться для всего буфера в целом.
Легко видеть, что чем более сложные будут команды отрисовки, тем быстрее будет работать способ вывода через буфер. Недостатком этого способа можно назвать наличие временного буфера (его называют device-independent bitmap [DIB]), который равен по размеру итоговой видимой области.
К счастью, использование дополнительных ресурсов обычно с лихвой покрывается увеличением скорости рендеринга, которое даёт этот подход. Конечно, это также означает, что когда необходимы только мелкие изменения, то всё равно придётся работать с полным буфером и копировать его на видеокарту. Давайте посмотрим на один из частных случаев, когда реализован прямой вывод.
Вывод в реальном времени при перемещении 2D-объектов
Например, если вы хотите использовать мышь для переноса геометрической фигуры (полигона) из позиции A в позицию B на панели рисования, то вряд ли имеет смысл перерисовывать этот объект для каждой промежуточной точки по траектории движения курсора между A и B, когда каждая процедура рендеринга приведёт к заполнению буфера и вывода содержимого. Намного проще использовать растровый оператор ROP (raster operator), который применяет технику “исключающего ИЛИ” XOR.
Наложение двух идентичных объектов с помощью XOR, когда они “затирают” друг друга.
Перерисовка объекта в реальном времени с помощью функции ROP (XOR).
Сначала нужно перерисовать объект, используя XOR в прежнем его расположении на устройстве отображения. Это приведёт к тому, что оригинальный объект “исчезнет” на поверхности дисплея, как по мановению волшебной палочки. Затем нужно напрямую нарисовать объект в новом положении без XOR, чтобы он стал видимым на новом месте. Повторение этого процесса для каждого движения мыши позволяет в каждую секунду выдавать 10-50 положений объекта. Человеческий глаз воспринимает подобное перемещение как плавное, без подёргиваний. Только когда финальное местоположение будет достигнуто, можно полностью заполнять буфер и перерисовывать его на экране.
В целом же, прямая отрисовка на устройстве отображения называется “плавающей” (floating drawing). Отложите в голове этот процесс, поскольку мы будем ссылаться на него в следующем разделе, когда будем разъяснять 2D-поведение линейки видеокарт ATI Radeon HD 5000.
Ещё один проблемный момент касается рендеринга так называемых “плавающих объектов” (floating objects). Для их вывода нужно понимать все ключевые точки объекта, как они отображаются на экране и как они ориентированы, включая все графические примитивы. Если число таких объектов будет увеличиваться, то неизбежно возникнут проблемы с графикой. Это всё же не какой-то постоянный элемент для рисования на экране, и они не буферизуются в подавляющем большинстве программ.
Итог
Если рассмотреть диаграммы выше, то можно видеть поддержку аппаратного ускорения 2D под Windows XP, которая не требует каких-либо обходных решений. Под Vista практически не имеет значения, используем ли мы буфер или отсылаем каждую команду на устройство отображения: окно всё равно буферизуется. Что касается Windows 7 с драйверами WDDM 1.1, то мы теряем второй буфер, и на экран выводятся только изменения. В случае WDDM 1.0 мы получаем ту же ситуацию, что и под Vista. Дополнительное вновь вернувшееся аппаратное ускорение для команд GDI очень ограничено. Всё это нужно учитывать, когда мы будем обсуждать тесты и правильно оценивать их результаты.
Симптомы Radeon HD 5000 и их связь с Windows 7
Мы обнаружили, что прямой (небуферизованный) вывод разных примитивов (геометрических объектов) через GDI на видеокартах Radeon HD 5870 и the Radeon HD 5750 выполняется намного дольше под Windows 7, чем на других моделях. Перед тем, как мы постараемся более точно изолировать причины, нам следует более тщательно изучить симптомы, поскольку это определит их значимость для разных групп пользователей – то есть, возникнут у вас проблемы или нет. Конечно, с описанными проблемами столкнётся не каждый пользователь. Но если ваше программное обеспечение серьёзно пострадает из-за ограниченной 2D-функциональности, то в экстремальных случаях вы можете получить слайдшоу.
Выбор нескольких объектов. Передвижение такого участка в реальном времени может вызвать проблемы с производительностью.
Проблемы с прямой отрисовкой
Как мы уже указывали в первой части статьи, основные проблемы производительности новейших видеокарт AMD связаны с выводом линий, кривых, эллипсов и полигонов. На видеокарте Radeon HD 5870 под Windows 7 мы получили всего около 4000 кривых в секунду без использования буферов для устройств отображения. Когда мы передвигали один графический объект, состоящий из 50 кривых в реальном времени с помощью ROP, то видеокарта могла перерисовывать только 25 отдельных шагов в секунду (впрочем, помните, что техника XOR, которая приводит к исчезновению объекта из предыдущего местоположения, требует повторной отрисовки, так что на самом деле выполняется 50 операций).
Если передвигаемый объект превышает 100 кривых, то общее число кривых (5000 в секунду, учитывая 100 кривых при 50 операциях в секунду) будет превышать возможности Radeon HD 5870 по производительности! Орнаменты и клипарты обычно содержат больше 100 кривых, так что плавный перенос таких объектов (“плавающих”) невозможен. Это вызывает серьёзные проблемы продуктивности и функциональности даже в самых простых графических программах.
Кроме того, многие приложения в целях простоты используют подобные графические команды, чтобы не прибегать к буферу, если прямой вывод на дисплей будет работать достаточно хорошо. Именно эти программы получат на Radeon HD 5780 самое сильное падение производительности.
Проблемы отрисовки в буфер
Впрочем, даже если программы используют собственные внутренние буферы и выполняют обновления для различных геометрических объектов, вы всё равно можете получить падение производительности и медленный вывод. Тем более что блоковая передача содержимого буфера (она называется BitBlt) тоже производится медленно.
Какие программы подвержены такому замедлению?
На самом деле, любая 2D-программа, выполняющая команды GDI для вывода объектов на экран, подвержена описанной проблеме, особенно если необходимо отрисовывать много объектов. Это также верно и для программ, работающих с графической информацией, то есть приложений рисования, планирования и даже приложений продуктивности (например, часть программ в пакете Microsoft Office).
В каких конкретно программах мы обнаружили проблемы?
- CorelDraw, Adobe illustrator, Adobe Freehand MX, Nemetschek AllPlan (2D-функции);
- Adobe Photoshop CS3/CS4 (крупные векторные объекты на различных слоях);
- Microsoft Publisher, Microsoft PowerPoint и различные программы планирования дома в 2D;
- Microsoft Excel при выводе крупных диаграмм или больших таблиц с заполнением ячеек;
- различные инженерные программы, включая приложения для работы с чертежами;
- различные индустриальные программы.
Мы также обнаружили, что все эти программы работают вполне нормально на других видеокартах потребительского уровня. Мы не считаем, что для этих приложений требуется покупка видеокарт уровня рабочих станций из линеек FireGL или Quadro. На самом деле, мы получили вполне удовлетворительные результаты от многих low-end видеокарт по цене ниже $50. Да и вряд ли художники, дизайнеры и компании по работе с недвижимостью будут покупать специализированные профессиональные видеокарты AMD и nVidia.
Какие программы не подвержены описанным проблемам?
- Все 2D-программы, которые используют Direct2D для отображения 2D-графики (соответственно, они не работают в XP);
- все 3D-программы, которые используют Direct3D для вывода всего 2D-содержимого;
- все программы, которые для рендеринга 2D-графики используют OpenGL.
Итог по первой части
Лучшее, что остаётся делать – дождаться новых драйверов (которые мы тестируем на данный момент), после чего уже решить, насколько сильно эти проблемы повлияют на те приложения, которые вы запускаете. Повода для паники нет. Проблемы касаются только 2D-производительности под Windows 7, когда для вывода 2D-графики используются вызовы GDI или GDI+. Приложения, разработанные под Windows XP, почти всегда подвержены описанным проблемам. Если для разработки дизайна визитной карты производительности явно хватит, то при работе с узорчатым орнаментом картинку лучше не передвигать.
Поскольку Radeon HD 5750 тоже подвержена проблемам, то причина наверняка кроется в драйверах, а не в аппаратном оснащении. Вполне вероятно, что видеокарты начального уровня в линейке 5000, выпущенные недавно, тоже подвержены влиянию описанных проблем. Эти видеокарты приобретаются не столько для игр, сколько для работы. А это значит, что в некоторых случаях вы столкнётесь с описанными проблемами. Хотя проблемы не связаны с аппаратным дизайном новых видеокарт, во многих случаях они могут оказаться весьма серьёзными. Именно поэтому мы считаем, что AMD следует более тщательно работать над своими драйверами.
Tom2D: наш простой тест 2D GDI
Мы бы хотели представить нашим читателям простой 2D-тест. Он выдаёт GDI-команды, позволяя измерить скорость обработки.
Примечание: результаты, представленные здесь, не соответствуют результатам первой части. Особенно это касается отрисовки линий, поскольку мы внесли несколько изменений в сам тест после того, как впервые о нём написали.
Пользовательский интерфейс нашей программы, без тестовых данных.
Системные требования | |
ОС | Windows 2000 или старше |
Свободное пространство на диске | 2 Мбайт |
Разрешение экрана | 1024 x 768 или выше |
Наш тест не требует установки, при этом его легко переносить с одного на компьютера на другой. Следует помнить, что результаты очень сильно зависят от CPU! Кроме того, запуск других программ и сервисов может повлиять на результаты. Наконец, результаты измерений могут немного меняться от одного прогона к другому.
Тестовая конфигурация
Для наших тестов мы взяли “чистый” компьютер и создали новую учётную запись пользователя. Мы не устанавливали гаджеты, а также избегали вывода дополнительных графических окон. После старта мы привязывали программу Tom2D.exe к одному ядру CPU. Мы также отключили и деактивировали все ненужные фоновые службы и сервисы.
Режимы тестирования
Мы выбирали прямую отрисовку через GDI или буферизацию DIB, параметры видны на скриншоте выше (более подробную информацию об этих способах вы можете получить в предыдущих разделах статьи).
Программа Tom2D.exe использует разные команды рисования GDI, одну за другой, накапливая результаты по всем тестам. Изучая результаты отдельных тестов и сравнивая их с другими, вы можете определить узкие места в вашей системе.
Для выполнения полного теста достаточно нажать клавишу “Стартовать полное тестирование”, все тесты будут проведены, после чего будет выданы индивидуальные результаты, а также суммарный накопительный результат. Вы можете использовать клавишу “Копировать результаты в клипборд”, чтобы получить их в текстовом представлении.
На следующих страницах мы опишем каждый тест по отдельности и поясним, как они работают. Мы также поделимся собственными результатами, полученными при прохождении каждого отдельного теста.
Тестовая конфигурация | |
Процессор | Intel Core 2 Quad Q6600, 2,4 ГГц @ 3,2 ГГц, степпинг G0, кэш L2 8 Мбайт, LGA 775 |
Память | 8 Гбайт DDR2-1066 CL5 |
Материнская плата | DFI LANParty DK X48 T2RS |
Операционная система | Windows 7 Ultimate x64 |
Видеокарты | Radeon HD 5870, GeForce GTX 285 |
Графические драйверы | Catalyst 9.12, ForceWare 195.62 |
Другие видеокарты | Radeon HD 5750, Radeon HD 4870, Radeon HD 3650 GeForce GTX 285, GeForce 8800 GTS 512MB, GeForce 8400 GS, GeForce 6800 GT 256MB |
Интегрированные решения | GeForce 7050 (nForce 610i), GeForce 8100 (nForce 730i) Intel G45 (+Intel Pentium E5200, 4GB), Intel GMA X4500HD (+Core 2 Duo P8700 (2,53 ГГц), 4 Гбайт), Intel GMA 950 (+Intel Atom, Windows XP Professional) |
Ретро-ПК | Pentium MMX (P55C) 233 МГц Tyan Tomcat IVD S1564D (Intel 430HX) 224 Мбайт EDO DRAM 3dfx Voodoo4 4500, 166 МГц GPU (VSA100) 32 Мбайт PCI (Windows 98SE) |
Кроме платформ, представленных в предыдущей таблице, наши читатели протестировали много других комбинаций под Windows 98, Vista и XP. Все эти результаты мы сведём в итоговые диаграммы в нашей статье. Если вы заметили, что результаты интегрированных графических ядер 780G/785G отсутствуют, то причина в драйверах – мы ждём новой версии драйверов, чтобы добавить результаты.
Конечно, большинство наших читателей используют видеокарты для игр, но некорректное поведение видеокарт по выводу 2D-графики нас всё же беспокоит. И использование Direct2D сегодня не является панацеей, поскольку жизнь не сводится к браузерам и мультимедийным приложениям.
Мы хотели бы поблагодарить тех наших читателей, кто запустил тесты на своих компьютерах и поделился с нами результатами. Все эти значения (мы получили больше 800 результатов от наших читателей) были учтены и проанализированы, чтобы наш обзор был максимально объективен. Мы получали близкие результаты за исключением отдельных случаев, так что наша выборка вполне репрезентативна.
Tom2D: текст
Наш первый тест использует вывод текста. Во всех случаях (за исключением процессора Atom под операционными системами Windows XP и Windows 98 SE), автоматически активировалась технология ClearType.
В данном тесте мы использовали текст с размером шрифта от 8 до 197 пунктов, постепенно увеличивая размер. Всего мы проводили 500 тестов. Мы выбирали буквы для отображения случайным образом, случайно выбирали цвет шрифта и расположение буквы на экране. Seed-значение для генератора случайных чисел используется всегда одно и то же, поэтому все тесты должны давать сравнимые результаты. Мы использовали шрифт Arial для текста.
В тесте вызывались следующие функции GDI.
Для прямого вывода:
- SetBkMode
- GetTextMetrics
- CreateFontIndirect
- SetTextColor
- TextOut
- SelectObject
- DeleteObject
Для вывода через буфер DIB:
- CreateCompatibleDC
- CreateDIBSection
- CreateSolidBrush
- Rectangle
- BitBlt
Здесь мы не видим ничего необычного. Не только GMA450 с процессором Intel Atom хорошо смотрится по сравнению с другими видеокартами, но даже старое интегрированное графическое ядро GeForce 7050 чипсета 610i даёт удивительно хорошие результаты. Видеокарты Radeon здесь очень близки друг к другу, они дают вполне убедительные результаты. Старая видеокарта 6800GT со всего 256 Мбайт памяти GDDR3 неплохо показывает себя под интерфейсом Aero благодаря отдельному 2D-блоку, но без Aero производительность значительно падает.
Tom2D: линии
Данный тест использует функции GDI по рисованию линий. В первой части материала данный тест показал наиболее существенные отличия между видеокартами. Проблемы, выявленные в этом тесте, обнаружило и более 40 наших читателей, судя по их результатам.
Мы выводили около 150 000 линий случайной длины и цвета на случайных координатах. Seed-значение для генератора случайных чисел используется всегда одно и то же, поэтому все тесты должны давать сравнимые результаты. Все линии рисуются внутри нашей тестовой поверхности, поэтому обрезки не требуется.
В тесте вызывались следующие функции GDI.
Для прямого вывода:
- CreatePen
- MoveToEx
- LineTo
- SelectObject
- DeleteObject
Для вывода через буфер DIB:
- CreateCompatibleDC
- CreateDIBSection
- CreateSolidBrush
- Rectangle
- BitBlt
Здесь мы смогли подтвердить результаты, которые мы встретили в первой части: видеокарты линейки ATI Radeon HD 5000 работают с очень низкой производительностью.
Что интересно, измерения вывода на экран без интерфейса Aero показывали более высокие результаты, когда мы открывали второе окно и максимизировали его (например, браузер Mozilla Firefox) до выполнения теста, после чего переключались в окно теста. Увеличение производительности в таком случае повторялось раз за разом. Второй тест, который мы провели через некоторое время, уже не давал такого эффекта, мы вновь наблюдали потерю производительности.
Опять же, всё это указывает на проблему с драйверами, и будем надеяться, что проблема будет решена. Все остальные тесты говорят сами за себя. Опять же, Atom с графическим ядром GMA 950 (и активным Aero) дал удивительно хорошие результаты, а GeForce GTX 285 даёт весьма низкую производительность прямого вывода при отключении Aero. Производительность, превышающая 20 000 линий в секунду, вряд ли ухудшит работу с приложениями в реальных условиях.
Tom2D: кривые
Следующий этап нашего теста заключается в рендеринге кривых. Здесь мы вновь обнаружили существенную разницу между видеокартами, как и в первой части. Как и в случае теста линий, подобные результаты были подтверждены нашими читателями на более чем 40 тестовых системах.
В тесте мы выводим 100 000 кривых случайной длины, мы меняем радиус в случайных местах, а также случайно выбираем цвет. Seed-значение для генератора случайных чисел используется всегда одно и то же, поэтому все тесты должны давать сравнимые результаты. Все линии рисуются внутри нашей тестовой поверхности, поэтому обрезки не требуется.
В тесте вызывались следующие функции GDI.
Для прямого вывода:
- CreatePen
- PolyBezier
- SelectObject
- DeleteObject
Для вывода через буфер DIB:
- CreateCompatibleDC
- CreateDIBSection
- CreateSolidBrush
- Rectangle
- BitBlt
В данном тесте мы наблюдаем результаты, очень близкие к предыдущему тесту линий, включая такой же парадоксальный прирост производительности, когда мы открывали окно другого приложения и переходили от него к тесту. Интегрированная графика Intel в данном случае даёт результаты ниже среднего, хотя связка Atom и GMA 950 всё же весьма мощная.
Tom2D: полигоны
Затем перейдём к выводу полигонов. Здесь разные тестовые видеокарты тоже показали любопытные слабости.
В данном тесте мы выводили 60 000 полигонов, состоящих из разного числа вершин от 3 до 30, с разной длиной линий, с заливкой или без, в случайных областях экрана. Seed-значение для генератора случайных чисел используется всегда одно и то же, поэтому все тесты должны давать сравнимые результаты. Все линии рисуются внутри нашей тестовой поверхности, поэтому обрезки не требуется.
В тесте вызывались следующие функции GDI.
Для прямого вывода:
- CreatePen
- CreateSolidBrush
- GetStockObject
- SelectObject
- DeleteObject
- Polygon
Для вывода через буфер DIB:
- CreateCompatibleDC
- CreateDIBSection
- Rectangle
- BitBlt
Когда полигоны выводятся через буфер, то не имеет значения, активна поддержка Aero или выключена. Что касается прямой отрисовки на экране, то high-end видеокарты заметно отстают. Интересно, что сдерживает видеокарты AMD? Точно так же, почему Nvidia GeForce GTX 285 страдает из-за задержек при выводе полигонов? И почему эти видеокарты уступают комбинации Intel GMA 950/Atom на старом чипсете Intel G45 с интегрированной графикой?
Tom2D: прямоугольники
Отрисовка прямоугольников тоже входит в наш тестовый пакет.
Мы выводили в общей сложности 200 000 прямоугольников случайного размера, цвета и положения. Цвета линий и заполнения у одного прямоугольника не менялись. Seed-значение для генератора случайных чисел используется всегда одно и то же, поэтому все тесты должны давать сравнимые результаты. Все линии рисуются внутри нашей тестовой поверхности, поэтому обрезки не требуется.
В тесте вызывались следующие функции GDI.
Для прямого вывода:
- CreatePen
- CreateSolidBrush
- Rectangle
- SelectObject
- DeleteObject
Для вывода через буфер DIB:
- CreateCompatibleDC
- CreateDIBSection
- BitBlt
Вывод прямоугольников через GDI нельзя назвать быстрым. Почти все видеокарты работают довольно быстро, когда интерфейс Aero выключен. Что ещё любопытнее, все видеокарты, независимо от производителя, существенно замедлились при выводе через буфер.
Tom2D: эллипсы
Перейдём к эллипсам. Данный тест по результатам оказался весьма близок к выводу прямоугольников.
В данном тесте выводится 100 000 эллипсов случайного размера и цвета, в случайных местах экрана. Мы изменяли цвет и заполнение. Seed-значение для генератора случайных чисел используется всегда одно и то же, поэтому все тесты должны давать сравнимые результаты. Все линии рисуются внутри нашей тестовой поверхности, поэтому обрезки не требуется.
В тесте вызывались следующие функции GDI.
Для прямого вывода:
- CreatePen
- CreateSolidBrush
- GetStockObject
- Circle
- Arc
- SelectObject
- DeleteObject
Для вывода через буфер DIB:
- CreateCompatibleDC
- CreateDIBSection
- BitBlt
Как видим, вывод эллипсов не даёт такого же серьёзного падения производительности, как вывод прямоугольников. Две видеокарты AMD уступили по производительности комбинации Intel Atom/GMA 950 при прямом выводе. При использовании буфера данный тест выполняется ощутимо быстрее.
Tom2D: блитирование
Под блитированием понимается копирование одного битового участка на другой битовый участок. В нашем случае мы копировали участки картинки.
Для этого теста мы копировали в сумме 50 000 участков картинки размером от 1×1 до 500×500 пикселей. Копирование происходило в случайно выбранное местоположение с помощью команд BLT (block level transfer, blits). Мы изменяли стиль копирования (копирование, инверсия, окраска). Seed-значение для генератора случайных чисел используется всегда одно и то же, поэтому все тесты должны давать сравнимые результаты. Все линии рисуются внутри нашей тестовой поверхности, поэтому обрезки не требуется.
В тесте вызывались следующие функции GDI.
Для прямого вывода:
- BitBlt (copy, invert, paint)
Для вывода через буфер DIB:
- CreateCompatibleDC
- CreateDIBSection
- SelectObject
- DeleteObject
Копирование через BLT оказалось “слабым местом” для видеокарт линейки Radeon HD 5000 под операционной системой XP. При использовании буфера система Atom фактически висла, да и две топовые видеокарты под XP вряд ли можно использовать вообще. В данном случае GeForce GTX 285 и Radeon HD 5870 работают на одном и том же низком уровне.
Tom2D: растягивание и сжимание
В сфере 2D под растягиванием/сжиманием следует понимать операции трансформации и копирования с одного участка на другой.
Всего мы копировали 10 000 участков изображения размером от 1×1 до 500×500 пикселей, мы трансформировали участки и выводили в случайном местоположении экрана – тоже размером от 1×1 до 500×500 пикселей. Мы использовали те же способы копирования, что и в предыдущем тесте (копирование, инверсия, окраска). Seed-значение для генератора случайных чисел используется всегда одно и то же, поэтому все тесты должны давать сравнимые результаты. Все линии рисуются внутри нашей тестовой поверхности, поэтому обрезки не требуется.
В тесте вызывались следующие функции GDI.
Для прямого вывода:
- StretchBlt (copy, invert, paint)
Для вывода через буфер DIB:
- CreateCompatibleDC
- CreateDIBSection
- SelectObject
- DeleteObject
Здесь старая видеокарта Voodoo 4500 вышла на первое место, оставив далеко позади все другие модели видеокарт.
Когда Radeon HD 5870 работает под XP, то производительность не радует. То же самое касается и видеокарты GeForce GTX 285.
Заключение
Каков же будет итог нашего анализа? Нынешние топовые видеокарты показывают себя отнюдь не очень хорошо. Иногда мы наблюдали существенное падение производительности линейки Radeon HD 5000 под некоторыми тестами Windows XP, но под Windows 7 часть операций прямого вывода через GDI тоже выполнялась неоправданно медленно.
Найденные нами недостатки указывают на проблемы с драйверами, поскольку открытие и закрытие второго окна приводило к моментальному увеличению производительности, что мы отметили в тесте отрисовки линий. Впрочем, даже видеокарта Nvidia GeForce GTX 285 часто проигрывала интегрированным графическим решениям. Обидная новость для тех, кто решил потратить $400 и больше за дискретную видеокарту.
Интересно видеть, что интегрированные графические ядра показали весьма высокие результаты во многих наших тестах. Стареющий чипсет Nvidia nForce 630i, в частности, постоянно обеспечивал высокую производительность. Да и чипсеты Intel с интегрированной графикой тоже очень хорошо подошли для 2D-приложений, пусть даже эту компанию часто ругают за отставание по драйверам в сфере 3D. Процессор Atom даёт заметное падение при увеличении нагрузки на CPU (что не удивляет), поэтому и производительность отрисовки через GDI тоже снижается, иногда спускаясь в аутсайдеры. В этом, к сожалению, кроется существенный недостаток этой платформы под Windows XP, так что выбирайте приложения с умом.
Хотя GDI уже не является передовой технологией для вывода 2D-графики, результаты наших тестов важны для многих пользователей.
Если вы хотите самостоятельно провести тесты Tom2D, то версию тестовой утилиты с русскоязычным интерфейсом вы можете скачать здесь.
Дополнение. Как мы и планировали, AMD ответила после публикации первой части статьи, предоставив драйвер, в котором проблемы были решены. Ниже представлены результаты с новой версией драйвера.
Как можно видеть, производительность с драйвером Catalyst 10.1 (мы получили версию hotfix, которая вышла раньше публично доступного драйвера) оказалась существенно лучшей, чем в случае с драйвером Catalyst 9.12 и с активным интерфейсом Aero. А в случае с полигонами производительность даже превысила драйвер 9.12 под Windows XP. Именно такого исправления мы и ждали. Почему AMD не сделала улучшенные драйверы сразу же после выхода новых видеокарт?
Вы также можете заметить, что в последней версии теста 1.04/1.05 (ссылка выше) мы наблюдаем падение производительности без интерфейса Aero (то есть без Desktop Window Manager). Мы проводили тесты на многих машинах, но результаты оказались теми же самыми.
Впрочем, это не так и важно, поскольку вряд ли пользователи будут отключать интерфейс Aero, если производительность под ним будет так хороша. Наши показатели (и результаты AMD) в данном отношении сходятся. В конце концов, проблема, о которой мы сообщали в первой статье, была решена. И мы получили существенный прирост под Windows 7 с нашими видеокартами линейки Radeon HD 5000 и активным интерфейсом Aero.
Мы выражаем благодарность команде разработчиков драйверов AMD, которые быстро решили выявленные нами проблемы под Windows 7, представив обновлённые драйверы. Так что покупатели видеокарт всё же получат высокую производительность за свои деньги. В любом случае, в погоне за 3D-производительностью не следует забывать и о 2D-графике.