Что такое gdi – GDI двигатель: что это и как работает, проблемы, устройство

Содержание

Что такое gdi двигатель

Продолжаю тему про Hyundai часть — 1 и часть — 2 в данной записи речь пойдёт о двигателе GDI.
Я приобрел себе автомобиль двигателем GDI (M16GDI), многие мне говорили и прдолжают говорить что типа с этим двигателем хапну горя.Но я считаю что если лить в него минимум АИ-95 и качественное моторное масло, вовремя реагировать на подозрения в работе двигателя, то проблем не должно ни каких быть.

Но как оно на самом деле, давайте разберём…

Что такое двигатель GDI

Двигатель GDI (Gasoline Direct Injection) – бензиновый силовой агрегат с прямым (непосредственным) впрыском топлива. Моторы с аббревиатурой GDI производятся японскими компаниями Mitsubishi, Toyota, Nissan, корейскими автопроизводителями, а также фирмой Bosh.
Идея постройки двигателя с непосредственным впрыском топлива в цилиндры родилась достаточно давно, при этом массовый GDI впервые был представлен только в 1995 году. Моторы с технологией GDI в большинстве встречаются на автомобилях марки Mitsubishi. Перовой моделью с таким силовым агрегатом стала модель Mitsubishi Galant, которая получила силовую установку 1.8 GDI.

Особенности и отличия моторов GDI

Принцип работы двигателя GDI представляет собой своеобразный «симбиоз» привычных бензиновых и дизельных ДВС. Начнем с того, что для нормальной работы любого двигателя внутреннего сгорания в цилиндры необходимо подать так называемую топливно-воздушную смесь. Другими словами, определенная часть горючего смешивается в необходимой пропорции с частью воздуха применительно к разным режимам работы мотора. От состава смеси напрямую зависит мощность двигателя, КПД, экономичность, экологичность и ряд других характеристик.

Большинство бензиновых и дизельных двигателей сегодня:

— моторы с внешним смесеобразованием. К таковым относятся устаревшие карбюраторные агрегаты на
бензине и современные атмосферные, компрессорные или турбированные инжекторные бензиновые

моторы. В таких двигателях процесс приготовления топливно-воздушной смеси происходит отдельно (во
впускном коллекторе), после чего готовый заряд поступает в цилиндры и воспламеняется от свечи
системы зажигания;

— двигатели с внутренним смесеобразованием. Данный тип агрегатов представлен дизельными моторами, в
которых порция дизтоплива подается напрямую в цилиндры и смешивается с уже имеющимся там
воздухом. Воспламенение заряда происходит от контакта подаваемой солярки с разогретым от сжатия
объемом воздуха, то есть без участия внешнего источника воспламенения;

Двигатель GDI представляет собой бензиновый мотор, в котором процесс смесеобразования
аналогичен дизельному, то есть топливо впрыскивается прямо в цилиндры, где происходит
смешивание с поданным ранее воздухом. При этом полученная топливно-воздушная смесь

воспламеняется в цилиндре посредством искры от свечи зажигания.

Если сказать иначе, воздух поступает в двигатель отдельно, форсунка GDI осуществляет непосредственный впрыск топлива в цилиндр, затем происходит перемешивание компонентов, после чего поджиг смеси осуществляет электрическая искра свечи зажигания. Следует добавить, что во время такого смесеобразования конструкторами учитывается ряд аэродинамических особенностей для получения оптимально упорядоченного состава смеси. По этой причине конструкция поршня и камеры сгорания существенно отличается от аналогов в двигателях с внешним смесеобразованием, а также форкамерных ДВС. Днище поршня имеет особую форму для направления факела распыла на свечу зажигания, ГБЦ получила вертикальные прямые впускные каналы, что позволяет «закручивать» воздух в цилиндрах двигателя. Благодаря такому устройству топливно-воздушная рабочая смесь в GDI движется по строго заданной траектории.

Более того, состав смеси отличается в разных участках общего объема цилиндра. В результате подобных решений двигатели линейки GDI способны работать на сильно обедненной смеси, которая была бы непригодна для работы обычного бензинового мотора. Необходимое для воспламенения от искры соотношение топлива и воздуха концентрируется в цилиндре GDI в области расположения свечи зажигания, в то время как по условным «краям» цилиндра смесь остается максимально обедненной.

Еще одной особенностью двигателя GDI является наличие двух топливных насосов:

— привычный электробензонасос в топливном баке;
— топливный насос высокого давления (ТНВД) с механическим приводом от ДВС;

Данное решение также является аналогом принципа подачи топлива в дизельном двигателе. В моторах GDI давление впрыска составляет около 50 бар, в то время как в обычных бензиновых ДВС около 3 бар.

Моторы GDI имеют целый ряд конструктивных различий, благодаря чему их можно разделить на две группы:

— для внутреннего японского рынка;
— для европейских рынков;

Отличаются такие агрегаты по конструкции самого мотора, по особенностям исполнения ТНВД и по устройству системы топливного впрыска. Версии для Японии имеют два основных режима впрыска топлива GDI:

1. ultra lean combustion mode;
2. superior output mode;

Первый режим предполагает работу мотора на сверхобедненной смеси, которая имеет соотношение 37:1-43:1. Такой режим работы поддерживается ЭБУ на умеренных скоростях до 110-120 км/ч. с учетом плавного разгона, то есть без резких нажатий на педаль газа. В указанном режиме двигатель GDI обеспечивает максимальный показатель крутящего момента. Форсунки впрыскивают горючее в тот момент, когда поршень находится на такте сжатия и не дошел до ВМТ. Подача топлива инжектором в этом случае происходит в виде однородной струи, после происходит завихрение потока по часовой стрелке для наилучшего смешивания с воздухом в цилиндре.

Во втором режиме предполагается стехиометрический состав смеси топлива и воздуха. Указанный режим работы активируется в том случае, если мотор находится под нагрузкой (движение на высокой скорости, буксирование прицепа, езда в гору и т.п.)

В версиях для Европы мотор GDI получил дополнительный режим two-stage mixing. Указанный
режим рассчитан на активный разгон с места или необходимость резкого ускорения при обгоне.
В таком режиме топливо выпрыскивается в цилиндры ступенчато (в два этапа за 4 такта).

На такте впуска в этом режиме совершается первый впрыск, результатом которого становится максимально обедненная смесь в цилиндре с соотношением около 60:1. Данная смесь не рассчитана на воспламенение. Главной задачей является эффективное охлаждение камеры сгорания, так как в охлажденную камеру можно будет подать больший объем воздуха и топлива на такте сжатия. Другими словами, данное решение позволяет улучшить наполнение цилиндров. Затем на такте сжатия происходит второй впрыск, после которого состав смеси уже составляет 12:1, то есть рабочая смесь становится максимально обогащенной.

В результате цилиндры эффективно наполняются и двигатель отдает максимально доступную мощность. По сравнению с моторами, которые имеют распределенный впрыск, GDI оказывается на 10% мощнее. В итоге европейские версии GDI более эластичны и способны отдавать больше крутящего момента на «низах» при необходимости резко ускориться во время движения на скорости 30-60 км/ч.

акже следует отметить особый режим двигателя GDI под названием stich F/B. Указанный режим
работы предполагает наиболее приближенный к стехиометрическому состав топливно-
воздушной смеси, а также делится на два подрежима: closed loop и open loop.

В первом случае состав смеси регулируется на основе показаний кислородного датчика, во втором показания датчика не влияют на состав смеси топлива и воздуха. Данная особенность является отличием GDI от других моторов во время работы на холостом ходу. ЭБУ двигателем динамично меняет режимы compression on lean и stich F/B во время работы мотора на холостых оборотах, условно продувая цилиндры. Особенностью является повышение холостых оборотов двигателя до 900-950 об/мин. в момент перехода между указанными режимами. Указанная смена режимов работы GDI в норме должна происходить 1 раз в 4 мин. Все режимы переключаются под управлением ЭБУ. Если говорить о комфорте водителя, смена режимов и изменения в работе мотора практически не ощущаются.

Что касается токсичности GDI, японские инженеры разработали специальные катализаторы для моторов, которые работают на сильно обедненной смеси. В результате уровень окислов азота в выхлопе такого двигателя уложился в рамки Евро-3. Стоит отметить, что высокое содержание серы, которое отмечено в отечественном бензине, быстро выводит каталитические нейтрализаторы из строя.

Неисправности и проблемы моторов GDI

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

В целях профилактики на моторах GDI рекомендуется менять свечи зажигания каждые 10-20 тыс.
пройденных километров, а также один раз в 25-30 тыс. км. производить очистку впускного
коллектора от нагара и частиц сажи на его стенках. Также периодически нужно контролировать
состояние инжекторов, проверять качество распыла топлива и чистить форсунки.

Автомобильная промышленность развивается огромными темпами. Еще не так давно производители выпускали карбюраторные моторы. Затем постепенно начал реализовываться инжекторный впрыск – сначала моноинжектор, а затем полноценный распределенный. Но это далеко не вершина технологий. Сейчас в продаже имеются бензиновые автомобили с непосредственным впрыском. Под их капотом находится GDI двигатель. Что это такое и в чем особенности системы? Рассмотрим в нашей сегодняшней статье.

Характеристика

Под данной аббревиатурой подразумевается впрыск непосредственно в камеру сгорания. Вот, на каких автомобилях применяется двигатель GDI:

Обычный инжекторный мотор имеет коллекторную систему смесеобразования. Так, в цилиндры подается уже готовый безвоздушный состав. Смешивание происходит во впускном коллекторе, на котором монтируются форсунки. Управление последними осуществляет электроника. Но есть также модели, где работа форсунок осуществляется механически (например, старые «Мерседесы» с системой «К-Джетроник»). Что являет собой двигатель GDI?

Отличия

В отличие от вышеописанных агрегатов, данный мотор имеет форсунку, направленную прямо в камеру сгорания. Подобная система практикуется на дизельных моторах с системой «Коммон Рейл». Однако здесь в цилиндры подается бензин. Подача воздуха осуществляется посредством впускных клапанов, которые открываются и закрываются в определенный момент (согласно вращению распредвала). Таким образом, ключевое отличие двигателя GDI от обычного инжекторного в том, что смесь образовывается непосредственно в цилиндре, а не в коллекторе.

Особенности

Конечно, создать идеальное соотношение смеси довольно трудно в таких условиях. Поэтому в работе дополнительно участвует электронный блок с программным обеспечением. Оно рассчитано на несколько разных циклов работы. Также особенности заключаются в самих форсунках. Чтобы получить идеальное смесеобразование, производители применяют вихревые форсунки. Они способны впрыскивать горючее в виде мелкодисперсионного тумана.

Следующая особенность двигателя GDI – это соотношение смеси. Если говорить о классических инжекторных моторах, здесь на одну часть бензина приходится 14 частей воздуха. Двигатель GDI формирует обедненную смесь, где на одну порцию топлива приходится 20 порций воздуха. Но при таком соотношении двигатель не всегда может работать на полную мощность. Поэтому в случае необходимости, состав смеси корректируется. Так, соотношение бензина и воздуха может быть как у моторов с распределенным впрыском – 1:14. Изменению состава смеси способствует двухступенчатая система подачи топлива.

Преимущества

Итак, давайте рассмотрим плюсы данных силовых агрегатов:

  • Экономия топлива. Эта характеристика достигается за счет образования более бедной смеси, о чем говорилось выше. Так, при отсутствии нагрузок двигатель работает на бедной смеси. Однако, когда нужно использовать весь потенциал, состав ее меняется на нормальный. За счет двухступенчатой подачи топлива машина экономит порядка 25 процентов на холостых оборотах. Если брать обычную езду, то такой мотор будет расходовать примерно на 10 процентов меньше топлива, нежели тот, что оснащен распределенным впрыском.
  • Правильное горение топлива. Специалисты отмечают, что наиболее качественное воспламенение и горение смеси будет в том случае, если топливо находится в непосредственной близости к свече. Так, в цилиндрах бензин сгорает полностью, и отдача от этого максимальная. Также стоит отметить технологию послойного непосредственного впрыска FSI. Она применяется на автомобилях марки «Фольксваген». Впоследствии эту технологию подхватили и другие производители, в том числе и «Киа». Двигатели GDI корейского производства отличаются высокой производительностью и имеют широкую полку крутящего момента, чего нет у простых инжекторных моторов.
  • Меньшая токсичность выхлопа. Эта характеристика тесно связана с двумя предыдущими. Отзывы специалистов говорят, что моторы с непосредственным впрыском выбрасывают намного меньше вредных веществ, нежели их аналоги (особенно на холостых оборотах).
  • Мощность. Благодаря более правильному горению с одного и того же объема инженерам удалось снять на 10 процентов больше мощности, нежели от ДВС с распределенным впрыском. Также моторы GDI отличается более высокой степенью сжатия. Это положительно сказывается на крутящем моменте.
  • Меньшее количество нагара. Как отмечают отзывы, при работе данные моторы не выделяют существенный нагар. Масляные каналы не закупориваются продуктами сгорания. Соответственно, служат эти двигатели дольше простых инжекторных. Также на моторах GDI более чистое масло.

Но не все так гладко, как кажется. У этих двигателей есть свои недостатки, о которых обязательно стоит поговорить.

Минусы

Первый недостаток касается устройства системы. Двигатели с непосредственным впрыском имеют более сложную систему впуска. Сюда входит ТНВД (топливный насос высокого давления), по конструкции схожий с тем, что применяется на современных дизельных ДВС. Ввиду этого автомобили с впрыском GDI более требовательны к качеству топлива, как и их дизельные собратья. Особенно вредны для этого мотора следующие компоненты:

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

Важно также соблюдать октановое число. В руководстве по эксплуатации написано, что данный мотор работает на бензине с октановым числом 100, который в России очень редко встретишь. Как минимум, такие автомобили следует заправлять топливом с ОЧ не ниже 98. А попытка залить 95-й будет сопровождаться характерными вибрациями по кузову. Также для данных моторов противопоказаны различные очистители, присадки и добавки. Запрещено использовать и этилированный бензин.

Следующий недостаток касается обслуживания. В России мало сервисов, которые специализируются именно на таких двигателях. И если с ремонтом «Коммон Рейла» не возникнет вопросов, то с поиском СТО, что способно отремонтировать GDI-мотор, могут возникнуть проблемы.

Отремонтировать такой двигатель не так просто, как обычный ДВС с распределенным впрыском. Сложности заключаются не только в топливном насосе высокого давления, но и в двухступенчатой системе подачи горючего. И у каждого производителя есть свои специфические поломки. О них мы расскажем ниже.

«Кадиллак» GDI

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

«Лексус» и «Тойота»

Двигатели этих автомобилей имеют проблемы с двухступенчатым насосом. Он приводится в действие от распределительного вала, и в данном насосе ломаются клапаны. В итоге бензин начинает поступать в картер двигателя, смешиваясь с маслом. Это однозначно приводит к износу всех трущихся пар в двигателе.

Двигатель 4G93 GDI

О нем стоит рассказать отдельно. Что это за мотор? 4G93 — это двухлитровый четырехцилиндровый агрегат, серийно производящийся на протяжении 20 лет. Максимальная мощность в зависимости от модификаций – от 160 до 215 лошадиных сил. Изначально он был карбюраторным, а затем инжекторным. В начале 2000-х этот двигатель оснастили непосредственным впрыском. Агрегат имеет двухвальную головку блока с ременным приводом ГРМ. Также мотор оснащен гидрокомпенсаторами.

Как отмечают отзывы, двигатель GDI «Митсубиси» может иметь проблемы с насосами. Их всего два. Это топливный насос низкого и высокого давления. Зачастую проблемы возникают именно с последним. Так, ТНВД забивается твердыми частицами, что находятся в топливе. В итоге машина глохнет при нажатии на педаль газа и при любых попытках разогнаться. При этом на холостых оборотах двигатели «Мицубиси» GDI могут вести себя нормально. В такой ситуации требуется детальная диагностика и чистка элементов насоса.

Среди прочих проблем данного мотора стоит отметить:

  • Проблемы с клапаном рециркуляции газов. Впускной коллектор на этом двигателе требует регулярной чистки.
  • Залив свечей зажигания. Это происходит в сильные морозы при попытке запуска двигателя «на холодную».
  • Стук двигателя. Такое происходит по причине неисправных гидрокомпенсаторов. Из-за этого зазор клапанов не соответствует норме.

О проблемах с запчастями

Нужно отметить, что детали на данные моторы не так широко распространены в России. Поэтому в случае поломки нередко владельцам приходится ждать по две-три недели, пока придут запчасти. Вдобавок, их цена отнюдь не маленькая. А производить какие-либо ремонтные работы с ним самостоятельно не получится. Система имеет сложное устройство и требует наличия опыта.

Подводим итоги

Итак, мы выяснили, что собой представляет двигатель с непосредственным впрыском. Как видите, мотор GDI имеет как ряд положительных, так и отрицательных сторон. Стоит ли приобретать себе такой автомобиль? Однозначного ответа на этот вопрос нет. Да, эти моторы более мощные, экологичные и расходуют меньше топлива. В то же время не каждый сервис берется за их обслуживание, а стоимость ремонта всегда будет существенной. Нужно постоянно заправляться на проверенных АЗС, чтобы твердые частицы не забили тонкие полости насоса высокого давления. Поэтому эксплуатация автомобилей с двигателем GDI целесообразна только в крупных городах, где есть качественные АЗС и специализированные мастерские. В остальных случаях содержание такого автомобиля будет проблемным.

Ещё в начале 2000-х годов в Россию начали попадать первые автомобили Mitsubishi с обозначениями GDI около индексов, указывающих на объём двигателя.

Под этой аббревиатурой скрывается непосредственный впрыск топлива в цилиндры двигателя — именно эта японская компания стала первой, начавшей серийное производство силовых агрегатов с такой системой впуска. Такой мотор заслужил очень неоднозначные отзывы, поэтому перед покупкой автомобилей Mitsubishi следует внимательно рассмотреть плюсы и минусы двигателя GDI.

Это будет полезным и покупателям машин других производителей, поскольку такие двигатели устанавливаются на автомобили Volkswagen, GM, Toyota, Mercedes и других марок.

Теоретическая часть

Обычный инжекторный двигатель, который использует коллекторную систему смесеобразования, предполагает подачу в цилиндры уже готового бензовоздушного состава. Такое смешивание воздуха и горючего происходит во впускном коллекторе, где устанавливаются форсунки, управляемые электроникой. Если же говорить про двигатель GDI, то в нём форсунка направлена непосредственно в камеру сгорания. Соответственно, через впускные клапаны подаётся только воздух, а процесс смесеобразования происходит непосредственно в цилиндрах.

Камера сгорания двигателя GDI

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

Стоит сказать, что основные плюсы двигатель GDI получает в результате работы на сверхобеднённой смеси, в которой содержание бензина по сравнению с воздухом уменьшено до 1:20, тогда как при распределённом впрыске соотношение поддерживается на постоянном уровне 1:14. Однако даже мотор с непосредственным впрыском не может работать постоянно в таком режиме, поэтому под нагрузками в его системе впуска восстанавливается нормальное смесеобразование.

За счёт этого двигатель GDI должен оснащаться двухступенчатой системой подачи топлива. Именно со всеми этими отличиями и связаны основные минусы конструкции — посмотрим, смогут ли их превзойти плюсы, полученные от перехода на непосредственный впрыск.

Положительные стороны

Как уже говорилось выше, главные плюсы двигатель GDI получает благодаря возможности работы на сильно обеднённой смеси при отсутствии больших нагрузок. Преимуществом уменьшения соотношения с 1:14 до 1:20 является существенное снижение расхода топлива при движении в смешанном или городском цикле. Исследования специалистов показывают, что в городском заторе с длительной работой двигателя на постоянных оборотах холостого хода затраты горючего уменьшаются сразу на 20–25%. Однако говорить о таких же результатах при быстрой езде по трассе не приходится — двигатель GDI будет требовать столько же топлива, сколько и силовой агрегат с распределённым впрыском.

Двигатель KIA с системой GDI

Дополнительные плюсы удаётся получить и от смесеобразования, происходящего непосредственно в камере сгорания. Специалисты по двигателям автомобилей могут сказать, что горение в цилиндре происходит неравномерно — больше всего топлива удаётся поджечь в непосредственной близости к свече, тогда как дальние части камеры охватываются неравномерно, что и приводит к выбросу остатков горючего в выхлопную трубу. Компания Volkswagen впервые предложила технологию послойного прямого впрыска топлива, назвав её FSI — впоследствии другие автомобильные фирмы приняли на вооружение такую методику.

За один обычный такт впуска форсунка может впрыскивать до пяти порций топлива, которые образуют неравномерную смесь, составленную с учётом всех нюансов процесса горения. Благодаря этому двигатели FSI и современные агрегаты GDI имеют меньший расход топлива, меньшую токсичность выхлопа, а также лучшую стабильность работы на невысоких оборотах.

Двигатель V6 FSI Audi

Такое изменение смесеобразования позволяет получить и другой положительный эффект, сущность которого заключается в повышении мощности и тяги приблизительно на 10–15%. Кроме того, двигатель GDI позволяет получить плюсы, связанные с уменьшением объёма нагара. Соответственно, увеличивается срок службы многих компонентов, а масло сохраняет большую часть своих свойств вплоть до момента замены. Плюсы заключаются и в снижении вероятности поломки мотора в результате закупорки масляных каналов продуктами сгорания топлива. Однако ни одна сложная конструкция не может обойтись без своих минусов — включая и мотор с непосредственным впрыском.

Главные недостатки

Минусы двигателей с прямым впрыском связаны с использованием более сложной системы впуска, в состав которой входит и топливный насос высокого давления, похожий на аналогичную конструкцию в дизельном силовом агрегате. Применение таких агрегатов приводит к тому, что двигатель GDI становится чувствительным к качеству топлива. Это касается не только содержания твёрдых частиц, но также наличия в горючем соединений серы, железа, фосфора и многих других минералов. Минусы проявляются в частых поломках мотора при заправке некачественным топливом.

Схема системы питания двигателя GDI

Кроме того, проблемы двигателей с непосредственным впрыском связаны и с тем, что в них применяются очень специфические технологические решения, которые пока знакомы лишь немногим специалистам сервисных центров. За счёт этого отремонтировать двигатель GDI не так просто, как обычный агрегат с распределённым впрыском. Минусы этих двигателей могут быть связаны и с упомянутой в теоретической части двухступенчатой системой подачи топлива. Практически у каждого производителя есть свои специфические поломки:

  • Моторы Toyota и Lexus с непосредственным впрыском страдают от поломки клапанов двухступенчатого насоса, приводимого распредвалом. В результате бензин поступает в картер двигателя, что приводит к его непоправимым поломкам в течение 1–2 дней;
  • Двигатели Mitsubishi оснащаются двумя различными насосами — низкого и высокого давления. Второй узел достаточно часто забивается твёрдыми частицами, содержащимися в некачественном топливе. В результате мотор может отлично работать на холостых и низких оборотах, но глохнуть при нажатии на педаль газа;
  • В двигателях Cadillac применяются пьезофорсунки с особым напылением. При длительной работе на топливе с высоким содержанием серы они разрушаются, что приводит к необходимости ремонта стоимостью в 1500–2000 долларов.

Пьезофорсунка двигателя GDI

Минусы могут заключаться и в малой распространённости запчастей к таким двигателям — очень часто их приходится ожидать в течение 2–3 недель, что приводит к длительным простоям автомобиля. Поэтому, приобретая машину с прямым впрыском топлива, стоит серьёзно задуматься о вопросах её ремонта, а также о необходимости заправки качественным топливом на фирменных АЗС.

Стоит ли покупать?

Конечно, двигатели с непосредственным впрыском имеют более высокую мощность и тягу, а также способны обеспечивать экономию топлива. Однако у них есть существенные минусы, которые связаны с надёжностью и требованиями к качеству топлива. Поэтому их эксплуатация в российских условиях может приводить к частым дорогостоящим ремонтам. Но в последнее время в продаже появились автомобили, которые прошли специальную адаптацию.

Они могут заправляться обычным бензином, продающимся на российских заправках, не создавая угрозу больших материальных затрат. Их преимущества не столь значительны, но даже адаптированные моторы с непосредственным впрыском позволяют экономить немало топлива, получая при этом лучшие динамические параметры.

GDI — Википедия. Что такое GDI

GDI (Graphics Device Interface, Graphical Device Interface) — один из трёх основных компонентов или «подсистем», вместе с ядром и Windows API, составляющих пользовательский интерфейс (оконный менеджер GDI) Microsoft Windows.

GDI — это интерфейс Windows для представления графических объектов и передачи их на устройства отображения, такие, как мониторы и принтеры.

GDI отвечает за отрисовку линий и кривых, отображение шрифтов и обработку палитры. Он не отвечает за отрисовку окон, меню и т. п., эта задача закреплена за пользовательской подсистемой, располагающейся в user32.dll и основывающейся на GDI. GDI выполняет те же функции, что и QuickDraw в Mac OS.

Одно из преимуществ использования GDI вместо прямого доступа к оборудованию — это унификация работы с различными устройствами. Используя GDI, можно одними и теми же функциями рисовать на разных устройствах, таких, как экран или принтер, получая на них практически одинаковые изображения. Эта возможность лежит в центре всех WYSIWYG-приложений для Windows.

Простые игры, которые не требуют быстрой графики, могут использовать GDI. Однако GDI не обеспечивает качественной анимации, поскольку в нём нет возможности синхронизации с кадровым буфером. Также в GDI нет растеризации для отрисовки 3D-графики. Современные игры используют DirectX или OpenGL, что даёт программистам доступ к большему количеству аппаратных возможностей.

Краткое описание

Для определения атрибутов текста и изображения, которые выводятся на экран или принтер, используется программный объект под названием «контекст устройства» (Device Context, DC). DC, как и большинство объектов GDI, инкапсулирует подробности реализации и данные в себе и к ним нельзя получить прямой доступ.

Для любого рисования нужен объект HDC (Handle DC). При выводе на принтер HDC получается вызовом CreateDC, и на нём вызываются специальные функции для перехода на новую страницу печатаемого документа. При выводе на экран также можно использовать CreateDC, но это приведёт к рисованию поверх всех окон вне их границ, потому обычно для рисования на экране используются вызовы GetDC и BeginPaint, принадлежащие уже не GDI, а USER, и возвращающие контекст, ссылающийся на регион отсечения окна.

Функциональность:

  • вывод одними и теми же вызовами на экран, принтер, «экран в памяти» (доступный приложению по указателю и созданный им bitmap в памяти, также возможно выделение bitmapов в памяти видеокарты — CreateCompatibleBitmap — и рисование на них, такие битовые карты не доступны по указателю, но дальнейшая перерисовка с них на физический экран происходит очень быстро без нагрузки процессора и шины, и особенно быстро в случае Remote Desktop).
  • вывод в метафайл — запоминание последовательности команд рисования в файле, который можно «проиграть» заново, векторный графический файл .wmf есть именно этот метафайл с небольшим дополнительным заголовком в начале.
  • вывод текста различными шрифтами, в том числе TrueType и OpenType, а также шрифтами, вшитыми в принтер (при изображении документа на экране используется ближайший похожий программно реализованный шрифт). Буквы всегда заливаются одним цветом («текущий цвет»), промежутки между ними либо остаются прозрачными, либо же заливаются другим цветом («текущий цвет фона»). Не поддерживается расположение букв по кривой.
  • богатый набор операций с битовыми картами (битмапами), включая масштабирование, автоматическое преобразование из типичных форматов в текущий формат экрана без усилий со стороны программиста (StretchDIBits), рисование на битмапах нескольких типичных форматов, находящихся в памяти, и огромное количество логических операций комбинирования цветов 2 битмапов — уже имеющегося на устройстве назначения и вновь рисуемого.
  • богатый набор операций векторной графики (примерно тот же, что в PostScript, но используется другой вид кривых). Проводимая линия имеет атрибуты — толщину, рисунок пунктира и цвет (собраны вместе в т. н. объекте PEN) и способ сглаживания углов многоугольников. Заливка может быть одноцветной, одной из штриховок на выбор или же битмапом 8 на 8 (эти атрибуты собраны в «объекте BRUSH»). В Windows NT также появились кривые Безье.
  • все цвета в вызовах — всегда в RGB, независимо от системы цветов текущего устройства. Исключение — отдельные пикселы внутри битмапов, которые могут быть и в виде, определённом устройством.
  • поддержка регионов отсечения и всех основных логических операций над ними. Координаты в них — 16-битные целые (что ограничивало размер экрана Windows, даже довольно поздних версий, до 32K пикселов).
  • поддержка матрицы поворотов/растяжений — World Transform, не поддерживается для регионов отсечения, только для векторной графики.

Реализация

В Windows 9x и более ранних реализована в 16-битной GDI.DLL, которая, в свою очередь, подгружает выполненный в виде DLL драйвер видеокарты. Драйвер видеокарты первоначально и был обязан реализовать вообще всё рисование, в том числе рисование через битмапы в памяти в формате экрана. Позже появилась DIBENG.DLL, в которой было реализовано рисование на битмапах типичных форматов, драйвер был обязан пропускать в неё все вызовы, кроме тех, для которых он задействовал аппаратный ускоритель видеокарты.

Драйвер принтера подгружался таким же образом и имел тот же интерфейс «сверху», но «снизу» он вместо рисования в памяти/на аппаратуре генерировал последовательности команд принтера и отсылал их в объект Job. Эти команды, как правило, были либо двоичные и не читаемые человеком, либо PostScript.

В Windows NT GDI была полностью переписана с нуля заново, причём на C++ (по слухам, у Microsoft тогда не было компилятора этого языка и они использовали cfront). API для приложений не изменился (кроме добавления кривых Безье), для драйверов — обёртки на языке Си вокруг реализованных на C++ внутренностей (вроде BRUSHOBJ_pvGetRbrush).

Сама GDI была размещена сначала в WINSRV.DLL в процессе CSRSS.EXE, начиная с NT4 — в win32k.sys. Драйверы загружались туда же. DIBENG.DLL была переписана заново и перенесена туда же, как совокупность вызовов EngXxx — EngTextOut и другие. Логика взаимодействия драйвера-GDI-DIBENG осталась примерно та же.

GDI32.DLL в режиме пользователя реализована как набор специальных системных вызовов, ведущих в win32k.sys (до NT4 — как обёртки вокруг вызова CsrClientCallServer, посылавшего сообщение в CSRSS.EXE).

В Windows Vista появилась модель драйверов WDDM, в которой была отменена возможность использования аппаратуры двухмерной графики. При использовании WDDM все GDI-приложения (то есть все обычные системные части Windows UI — заголовки и рамки окон, рабочий стол, панель задач и другое) используют GDI-драйвер cdd.dll (Canonical Display Driver)[1], который рисует на некоторых битмапах в памяти, своих для каждого окна (содержимое окна стало запоминаться в памяти, до того Windows никогда так не делала и всегда перерисовывала окна заново, кроме неких специальных окон с флагом CS_SAVEBITS). Изображения из cdd.dll извлекаются процессом dwm.exe (Desktop Window Manager), который является Direct3D-приложением и отрисовывает «картинки окон» на физическом экране через Direct3D.

Сам же WDDM-драйвер поддерживает только DirectDraw и Direct3D и не имеет отношения ни к GDI, ни к win32k.sys, сопрягаясь с модулем dxgkrnl.sys в ядре.

Критика

Крайне сильно критикуется подсистема печати Windows, особенно в случае сравнения её с CUPS.

Причины: бинарный формат потока задания печати (в CUPS это PostScript) и реализация обработки этого потока в виде нескольких DLL внутри одного процесса SPOOLSV.EXE (CUPS вместо этого использует обычный конвейер из нескольких процессов вроде pstoraster | rastertoepson | parallel, который можно при желании запустить из обычного UNIX shell). Таким образом, CUPS поддерживает разработку фильтров заданий печати (например, для платных принтеров в отелях) даже на скриптовых языках вроде Perl.

Однако тут речь скорее о компонентах, лежащих ниже GDI.

Однако CUPS имеет серьёзные проблемы с поддержкой WinPrinterов вроде всех дешёвых лазерных принтеров Hewlett-Packard. Так как они не поддерживают распространённый формат PCL, для них надо ставить огромные, сложные в настройках и построении пакеты, такие, как HP OfficeJet (порт «hpoj» во FreeBSD). При этом CUPS прекрасно поддерживает струйные принтеры, дорогие модели лазерных принтеров Hewlett-Packard и принтеры PostScript.

Примерные аналоги

Нижние уровни технологии X11, используемой в UNIX-подобных ОС, таких, как Linux.

При этом X11 беднее возможностями, чем GDI (например, есть проблемы с реализацией независимых от устройства цветов), и для получения полного аналога GDI необходимо добавить ещё ряд библиотек, таких, как SDL.

GDI+

С выходом Windows XP появился потомок подсистемы, GDI+, основанной на C++[2]. Подсистема GDI+ доступна как «плоский» набор из 600 функций, реализованных в gdiplus.dll. Эти функции «обёрнуты» в 40 классов C++. Microsoft не планирует оказывать поддержку для кода, который обращается к плоскому набору напрямую, а не через классы и методы C++. .NET Framework предлагает набор альтернативных C++ обёрточных классов, входящих в пространство имён System.Drawing..

GDI+ является улучшенной средой для 2D-графики, в которую добавлены такие возможности, как сглаживание линий (antialiasing), использование координат с плавающей точкой, градиентная заливка, возможность работы изнутри с такими графическими форматами, как JPEG и PNG, куда лучшая реализация регионов отсечения с возможностью использовать в них координаты с плавающей точкой (а не 16-битные целые) и применения к ним World Transform, преобразования двумерных матриц и т. п. GDI+ использует ARGB-цвета. Эти возможности используются в пользовательском интерфейсе Windows XP, а их присутствие в базовом графическом слое облегчает использование систем векторной графики, таких, как Flash или SVG.

Динамические библиотеки GDI+ могут распространяться вместе с приложениями для использования в предыдущих версиях Windows.

GDI+ схож с подсистемой Quartz 2D у Apple и библиотеками с открытым кодом libart и Cairo.

GDI+ есть не более чем набор обёрток над обычной GDI. В Windows 7 появился новый API Direct2D, который есть примерно то же, но реализован «сверху донизу» вплоть до драйвера видеокарты (точнее, использует некие возможности Direct3D в этом драйвере), и может использовать аппаратное ускорение — то есть видеопроцессор трёхмерной графики для рисования некоторых двухмерных объектов (antialiasing и т. д.)

Уязвимости

14 сентября 2004 года была обнаружена уязвимость в GDI+ и других графических API, связанная с ошибкой в коде библиотеки JPEG. Эта ошибка позволяла выполнить произвольный код на любой системе Windows. Патч для исправления уязвимости был выпущен 12 октября 2004 года[3].

Примечания

Ссылки

GDI — это… Что такое GDI?

У этого термина существуют и другие значения, см. GDI (значения).

GDI (Graphics Device Interface, Graphical Device Interface) — один из трёх основных компонентов или «подсистем», вместе с ядром и Windows API составляющих пользовательский интерфейс (оконный менеджер GDI) Microsoft Windows.

GDI — это интерфейс Windows для представления графических объектов и передачи их на устройства отображения, такие как мониторы и принтеры.

GDI отвечает за отрисовку линий и кривых, отображение шрифтов и обработку палитры. Он не отвечает за отрисовку окон, меню и т. п., эта задача закреплена за пользовательской подсистемой, располагающейся в user32.dll и основывающейся на GDI. GDI выполняет те же функции, что и QuickDraw в Mac OS.

Одно из преимуществ использования GDI вместо прямого доступа к оборудованию — это унификация работы с различными устройствами. Используя GDI, можно одними и теми же функциями рисовать на разных устройствах, таких как экран или принтер, получая на них практически одинаковые изображения. Эта возможность лежит в центре всех WYSIWYG-приложений для Windows.

Простые игры, которые не требуют быстрой графики, могут использовать GDI. Однако GDI не обеспечивает качественной анимации, поскольку в нём нет возможности синхронизации с кадровым буфером. Также, в GDI нет растеризации для отрисовки 3D-графики. Современные игры используют DirectX или OpenGL, что даёт программистам доступ к большему количеству аппаратных возможностей.

Краткое описание

Для определения атрибутов текста и изображения, которые выводятся на экран или принтер, используется программный объект под названием «контекст устройства» (Device Context, DC). DC, как и большинство объектов GDI, инкапсулирует подробности реализации и данные в себе и к ним нельзя получить прямой доступ.

Для любого рисования нужен объект HDC (хэндл DC). При выводе на принтер HDC получается вызовом CreateDC, и на нем зовутся специальные функции для перехода на новую страницу печатаемого документа. При выводе на экран также можно использовать CreateDC, но это приведет к рисованию поверх всех окон вне их границ, потому обычно для рисования на экране используются вызовы GetDC и BeginPaint, принадлежащие уже не GDI, а USER, и возвращающие контекст, ссылающийся на регион отсечения окна.

Функционал:

  • вывод одними и теми же вызовами на экран, принтер, «экран в памяти» (доступный приложению по указателю и созданный им bitmap в памяти, также возможно выделение bitmapов в памяти видеокарты — CreateCompatibleBitmap — и рисование на них, такие битовые карты не доступны по указателю, но дальнейшая перерисовка с них на физический экран происходит очень быстро без нагрузки процессора и шины, и особенно быстро в случае Remote Desktop).
  • вывод в метафайл — запоминание последовательности команд рисования в файле, можно проиграть заново, векторный графический файл .wmf есть именно этот метафайл с небольшим дополнительным заголовком в начале.
  • вывод текста различными шрифтами, в т. ч. TrueType и OpenType, а также шрифтами, вшитыми в принтер (при изображении документа на экране используется ближайший похожий программно реализованный шрифт). Буквы всегда заливаются одним цветом («текущий цвет»), промежутки между ними либо остаются прозрачными, либо же заливаются другим цветом («текущий цвет фона»). Не поддерживается расположение букв по кривой.
  • богатый набор операций с bitmapами, включая масштабирование, автоматическое преобразование из стандартных форматов в текущий формат экрана без усилий со стороны программиста (StretchDIBits), рисование на bitmapах нескольких стандартных форматов, находящихся в памяти, и огромное количество логических операций комбинирования цветов 2 bitmapов — уже имеющегося на устройстве назначения и вновь рисуемого.
  • богатый набор операций векторной графики (примерно тот же, что в PostScript, но используется другой вид сплайнов). Проводимая линия имеет атрибуты — толщину, рисунок пунктира и цвет (собраны вместе в т. н. объекте PEN) и способ сглаживания углов многоугольников. Заливка может быть одноцветной, одной из стандартных штриховок или же bitmapом 8 на 8 (эти атрибуты собраны в «объекте BRUSH»). В Windows NT также появились сплайны Безье.
  • все цвета в вызовах — всегда в RGB, независимо от системы цветов текущего устройства. Исключение — отдельные пикселы внутри bitmapов, которые могут быть и в виде, определенном устройством.
  • поддержка регионов отсечения и всех основных логических операций над ними. Координаты в них — 16-битные целые (что ограничивало размер экрана Windows, даже довольно поздних версий, до 32K пикселов).
  • поддержка матрицы поворотов/растяжений — World Transform, не поддерживается для регионов отсечения, только для векторной графики.

Реализация

В Windows 9x и более ранних реализована в 16-битной GDI.DLL, которая в свою очередь подгружает выполненный в виде DLL драйвер видеокарты. Драйвер видеокарты первоначально и был обязан реализовать вообще все рисование, в т. ч. рисование на bitmapах в памяти в формате экрана. Позже появилась DIBENG.DLL, в которой было реализовано рисование на bitmapах стандартных форматов, драйвер был обязан пропускать в нее все вызовы, кроме тех, для которых он задействовал аппаратный ускоритель видеокарты.

Драйвер принтера подгружался таким же образом и имел тот же интерфейс «сверху», но «снизу» он вместо рисования в памяти/на аппаратуре генерировал последовательности команд принтера и отсылал их в объект Job. Эти команды как правило были либо бинарные и не читаемые человеком, либо PostScript.

В Windows NT GDI была полностью переписана с нуля заново, причем на Си++ (по слухам, у Microsoft тогда не было компилятора этого языка и они использовали cfront). API для приложений не изменился (кроме добавления кривых Безье), для драйверов — обертки на языке Си вокруг реализованных на Си++ внутренностей (вроде BRUSHOBJ_pvGetRbrush).

Сама GDI была размещена сначала в WINSRV.DLL в процессе CSRSS.EXE, начиная с NT4 — в win32k.sys. Драйверы загружались туда же. DIBENG.DLL была переписана заново и перенесена туда же как совокупность вызовов EngXxx — EngTextOut и другие. Логика взаимодействия драйвера-GDI-DIBENG осталась примерно та же.

GDI32.DLL в режиме пользователя реализована как набор специальных системных вызовов, ведущих в win32k.sys (до NT4 — как обертки вокруг вызова CsrClientCallServer, посылавшего сообщение в CSRSS.EXE).

В Windows Vista появилась модель драйверов WDDM, в которой была отменена возможность использования аппаратуры двухмерной графики. При использовании WDDM все GDI-приложения (т. е. все обычные системные части Windows UI — заголовки и рамки окон, рабочий стол, таскбар и другое) используют GDI-драйвер cdd.dll (Canonical Display Driver), который рисует на некоторых bitmapах в памяти, своих для каждого окна (содержимое окна стало запоминаться в памяти, до того Windows никогда так не делала и всегда перерисовывала окна заново, кроме неких специальных окон с флагом CS_SAVEBITS). Изображения из cdd.dll извлекаются процессом dwm.exe (Desktop Window Manager), который является Direct3D-приложением и отрисовывает «картинки окон» на физическом экране через Direct3D.

Сам же WDDM-драйвер поддерживает только DirectDraw и Direct3D и не имеет отношения ни к GDI, ни к win32k.sys, сопрягаясь с модулем dxgkrnl.sys в ядре.

Критика

Крайне сильно критикуется подсистема печати Windows, особенно в случае сравнения ее с CUPS.

Причины: бинарный формат потока задания печати (в CUPS это PostScript), и реализация обработки этого потока в виде нескольких DLL внутри одного процесса SPOOLSV.EXE (CUPS вместо этого использует обычный конвейер из нескольких процессов вроде pstoraster | rastertoepson | parallel, который можно при желании запустить из обычного UNIX shell). Таким образом, CUPS поддерживает разработку фильтров заданий печати (например, для платных принтеров в отелях) даже на скриптовых языках вроде Perl.

Однако тут речь скорее о компонентах, лежащих ниже GDI.

Однако CUPS имеет серьёзные проблемы с поддержкой WinPrinterов вроде всех дешевых лазерных принтеров Hewlett-Packard. Так как они не поддерживают стандартный формат PCL, для них надо ставить огромные, сложные в настройках и построении пакеты, такие как HP OfficeJet (порт «hpoj» во FreeBSD). При этом CUPS прекрасно поддерживает струйные принтеры, дорогие модели лазерных принтеров Hewlett-Packard и принтеры PostScript.

Примерные аналоги

Нижние уровни технологии X11, используемой в UNIX-подобных ОС, таких как Linux.

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

GDI+

С выходом Windows XP появился потомок подсистемы, GDI+, основанной на C++[1].

GDI+ является улучшенной средой для 2D-графики, в которую добавлены такие возможности, как сглаживание линий (antialiasing), использование координат с плавающей точкой, градиентная заливка, внутренняя поддержка таких графических форматов, как JPEG и PNG, куда лучшая поддержка регионов отсечения с возможностью использовать в них координаты с плавающей точкой (а не 16-битные целые) и применения к ним World Transform, преобразования двумерных матриц и т. п. GDI+ использует ARGB-цвета. Эти возможности используются в пользовательском интерфейсе Windows XP, а их присутствие в базовом графическом слое облегчает использование систем векторной графики, таких как Flash или SVG.

Динамические библиотеки GDI+ могут распространяться вместе с приложениями для использования в предыдущих версиях Windows.

GDI+ схож с подсистемой Quartz 2D у Apple и библиотеками с открытым кодом libart и Cairo.

GDI+ есть не более чем набор оберток над обычной GDI. В Windows 7 появился новый API Direct2D, который есть примерно то же, но реализован «сверху донизу» вплоть до драйвера видеокарты (точнее, использует некие возможности Direct3D в этом драйвере), и может использовать аппаратное ускорение — т. е. трехмерный видеопроцессор для рисования некоторых двухмерных объектов (antialiasing и т. д.)

Уязвимости

14 сентября 2004 года была обнаружена уязвимость в GDI+ и других графических API, связанная с ошибкой в коде библиотеки JPEG. Эта ошибка позволяла выполнить произвольный код на любой системе Windows. Патч для исправления уязвимости был выпущен 12 октября 2004 года[2].

Примечания

  1. GDI+ Flat API  (англ.). MSDN Library. Microsoft. Архивировано из первоисточника 3 марта 2012. Проверено 31 октября 2009.
    Подсистема GDI+ доступна как «плоский» набор из 600 функций, реализованных в gdiplus.dll. Эти функции «обёрнуты» в 40 классов C++. Microsoft не планирует оказывать поддержку для кода, который обращается к плоскому набору напрямую, а не через классы и методы C++. .NET Framework предлагает набор альтернативных C++ обёрточных классов, входящих в пространство имен System.Drawing.
  2. MS04-028: Buffer overrun in JPEG processing (GDI+) could allow code execution

Ссылки

GDI — это… Что такое GDI?

У этого термина существуют и другие значения, см. GDI (значения).

GDI (Graphics Device Interface, Graphical Device Interface) — один из трёх основных компонентов или «подсистем», вместе с ядром и Windows API составляющих пользовательский интерфейс (оконный менеджер GDI) Microsoft Windows.

GDI — это интерфейс Windows для представления графических объектов и передачи их на устройства отображения, такие как мониторы и принтеры.

GDI отвечает за отрисовку линий и кривых, отображение шрифтов и обработку палитры. Он не отвечает за отрисовку окон, меню и т. п., эта задача закреплена за пользовательской подсистемой, располагающейся в user32.dll и основывающейся на GDI. GDI выполняет те же функции, что и QuickDraw в Mac OS.

Одно из преимуществ использования GDI вместо прямого доступа к оборудованию — это унификация работы с различными устройствами. Используя GDI, можно одними и теми же функциями рисовать на разных устройствах, таких как экран или принтер, получая на них практически одинаковые изображения. Эта возможность лежит в центре всех WYSIWYG-приложений для Windows.

Простые игры, которые не требуют быстрой графики, могут использовать GDI. Однако GDI не обеспечивает качественной анимации, поскольку в нём нет возможности синхронизации с кадровым буфером. Также, в GDI нет растеризации для отрисовки 3D-графики. Современные игры используют DirectX или OpenGL, что даёт программистам доступ к большему количеству аппаратных возможностей.

Краткое описание

Для определения атрибутов текста и изображения, которые выводятся на экран или принтер, используется программный объект под названием «контекст устройства» (Device Context, DC). DC, как и большинство объектов GDI, инкапсулирует подробности реализации и данные в себе и к ним нельзя получить прямой доступ.

Для любого рисования нужен объект HDC (хэндл DC). При выводе на принтер HDC получается вызовом CreateDC, и на нем зовутся специальные функции для перехода на новую страницу печатаемого документа. При выводе на экран также можно использовать CreateDC, но это приведет к рисованию поверх всех окон вне их границ, потому обычно для рисования на экране используются вызовы GetDC и BeginPaint, принадлежащие уже не GDI, а USER, и возвращающие контекст, ссылающийся на регион отсечения окна.

Функционал:

  • вывод одними и теми же вызовами на экран, принтер, «экран в памяти» (доступный приложению по указателю и созданный им bitmap в памяти, также возможно выделение bitmapов в памяти видеокарты — CreateCompatibleBitmap — и рисование на них, такие битовые карты не доступны по указателю, но дальнейшая перерисовка с них на физический экран происходит очень быстро без нагрузки процессора и шины, и особенно быстро в случае Remote Desktop).
  • вывод в метафайл — запоминание последовательности команд рисования в файле, можно проиграть заново, векторный графический файл .wmf есть именно этот метафайл с небольшим дополнительным заголовком в начале.
  • вывод текста различными шрифтами, в т. ч. TrueType и OpenType, а также шрифтами, вшитыми в принтер (при изображении документа на экране используется ближайший похожий программно реализованный шрифт). Буквы всегда заливаются одним цветом («текущий цвет»), промежутки между ними либо остаются прозрачными, либо же заливаются другим цветом («текущий цвет фона»). Не поддерживается расположение букв по кривой.
  • богатый набор операций с bitmapами, включая масштабирование, автоматическое преобразование из стандартных форматов в текущий формат экрана без усилий со стороны программиста (StretchDIBits), рисование на bitmapах нескольких стандартных форматов, находящихся в памяти, и огромное количество логических операций комбинирования цветов 2 bitmapов — уже имеющегося на устройстве назначения и вновь рисуемого.
  • богатый набор операций векторной графики (примерно тот же, что в PostScript, но используется другой вид сплайнов). Проводимая линия имеет атрибуты — толщину, рисунок пунктира и цвет (собраны вместе в т. н. объекте PEN) и способ сглаживания углов многоугольников. Заливка может быть одноцветной, одной из стандартных штриховок или же bitmapом 8 на 8 (эти атрибуты собраны в «объекте BRUSH»). В Windows NT также появились сплайны Безье.
  • все цвета в вызовах — всегда в RGB, независимо от системы цветов текущего устройства. Исключение — отдельные пикселы внутри bitmapов, которые могут быть и в виде, определенном устройством.
  • поддержка регионов отсечения и всех основных логических операций над ними. Координаты в них — 16-битные целые (что ограничивало размер экрана Windows, даже довольно поздних версий, до 32K пикселов).
  • поддержка матрицы поворотов/растяжений — World Transform, не поддерживается для регионов отсечения, только для векторной графики.

Реализация

В Windows 9x и более ранних реализована в 16-битной GDI.DLL, которая в свою очередь подгружает выполненный в виде DLL драйвер видеокарты. Драйвер видеокарты первоначально и был обязан реализовать вообще все рисование, в т. ч. рисование на bitmapах в памяти в формате экрана. Позже появилась DIBENG.DLL, в которой было реализовано рисование на bitmapах стандартных форматов, драйвер был обязан пропускать в нее все вызовы, кроме тех, для которых он задействовал аппаратный ускоритель видеокарты.

Драйвер принтера подгружался таким же образом и имел тот же интерфейс «сверху», но «снизу» он вместо рисования в памяти/на аппаратуре генерировал последовательности команд принтера и отсылал их в объект Job. Эти команды как правило были либо бинарные и не читаемые человеком, либо PostScript.

В Windows NT GDI была полностью переписана с нуля заново, причем на Си++ (по слухам, у Microsoft тогда не было компилятора этого языка и они использовали cfront). API для приложений не изменился (кроме добавления кривых Безье), для драйверов — обертки на языке Си вокруг реализованных на Си++ внутренностей (вроде BRUSHOBJ_pvGetRbrush).

Сама GDI была размещена сначала в WINSRV.DLL в процессе CSRSS.EXE, начиная с NT4 — в win32k.sys. Драйверы загружались туда же. DIBENG.DLL была переписана заново и перенесена туда же как совокупность вызовов EngXxx — EngTextOut и другие. Логика взаимодействия драйвера-GDI-DIBENG осталась примерно та же.

GDI32.DLL в режиме пользователя реализована как набор специальных системных вызовов, ведущих в win32k.sys (до NT4 — как обертки вокруг вызова CsrClientCallServer, посылавшего сообщение в CSRSS.EXE).

В Windows Vista появилась модель драйверов WDDM, в которой была отменена возможность использования аппаратуры двухмерной графики. При использовании WDDM все GDI-приложения (т. е. все обычные системные части Windows UI — заголовки и рамки окон, рабочий стол, таскбар и другое) используют GDI-драйвер cdd.dll (Canonical Display Driver), который рисует на некоторых bitmapах в памяти, своих для каждого окна (содержимое окна стало запоминаться в памяти, до того Windows никогда так не делала и всегда перерисовывала окна заново, кроме неких специальных окон с флагом CS_SAVEBITS). Изображения из cdd.dll извлекаются процессом dwm.exe (Desktop Window Manager), который является Direct3D-приложением и отрисовывает «картинки окон» на физическом экране через Direct3D.

Сам же WDDM-драйвер поддерживает только DirectDraw и Direct3D и не имеет отношения ни к GDI, ни к win32k.sys, сопрягаясь с модулем dxgkrnl.sys в ядре.

Критика

Крайне сильно критикуется подсистема печати Windows, особенно в случае сравнения ее с CUPS.

Причины: бинарный формат потока задания печати (в CUPS это PostScript), и реализация обработки этого потока в виде нескольких DLL внутри одного процесса SPOOLSV.EXE (CUPS вместо этого использует обычный конвейер из нескольких процессов вроде pstoraster | rastertoepson | parallel, который можно при желании запустить из обычного UNIX shell). Таким образом, CUPS поддерживает разработку фильтров заданий печати (например, для платных принтеров в отелях) даже на скриптовых языках вроде Perl.

Однако тут речь скорее о компонентах, лежащих ниже GDI.

Однако CUPS имеет серьёзные проблемы с поддержкой WinPrinterов вроде всех дешевых лазерных принтеров Hewlett-Packard. Так как они не поддерживают стандартный формат PCL, для них надо ставить огромные, сложные в настройках и построении пакеты, такие как HP OfficeJet (порт «hpoj» во FreeBSD). При этом CUPS прекрасно поддерживает струйные принтеры, дорогие модели лазерных принтеров Hewlett-Packard и принтеры PostScript.

Примерные аналоги

Нижние уровни технологии X11, используемой в UNIX-подобных ОС, таких как Linux.

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

GDI+

С выходом Windows XP появился потомок подсистемы, GDI+, основанной на C++[1].

GDI+ является улучшенной средой для 2D-графики, в которую добавлены такие возможности, как сглаживание линий (antialiasing), использование координат с плавающей точкой, градиентная заливка, внутренняя поддержка таких графических форматов, как JPEG и PNG, куда лучшая поддержка регионов отсечения с возможностью использовать в них координаты с плавающей точкой (а не 16-битные целые) и применения к ним World Transform, преобразования двумерных матриц и т. п. GDI+ использует ARGB-цвета. Эти возможности используются в пользовательском интерфейсе Windows XP, а их присутствие в базовом графическом слое облегчает использование систем векторной графики, таких как Flash или SVG.

Динамические библиотеки GDI+ могут распространяться вместе с приложениями для использования в предыдущих версиях Windows.

GDI+ схож с подсистемой Quartz 2D у Apple и библиотеками с открытым кодом libart и Cairo.

GDI+ есть не более чем набор оберток над обычной GDI. В Windows 7 появился новый API Direct2D, который есть примерно то же, но реализован «сверху донизу» вплоть до драйвера видеокарты (точнее, использует некие возможности Direct3D в этом драйвере), и может использовать аппаратное ускорение — т. е. трехмерный видеопроцессор для рисования некоторых двухмерных объектов (antialiasing и т. д.)

Уязвимости

14 сентября 2004 года была обнаружена уязвимость в GDI+ и других графических API, связанная с ошибкой в коде библиотеки JPEG. Эта ошибка позволяла выполнить произвольный код на любой системе Windows. Патч для исправления уязвимости был выпущен 12 октября 2004 года[2].

Примечания

  1. GDI+ Flat API  (англ.). MSDN Library. Microsoft. Архивировано из первоисточника 3 марта 2012. Проверено 31 октября 2009.
    Подсистема GDI+ доступна как «плоский» набор из 600 функций, реализованных в gdiplus.dll. Эти функции «обёрнуты» в 40 классов C++. Microsoft не планирует оказывать поддержку для кода, который обращается к плоскому набору напрямую, а не через классы и методы C++. .NET Framework предлагает набор альтернативных C++ обёрточных классов, входящих в пространство имен System.Drawing.
  2. MS04-028: Buffer overrun in JPEG processing (GDI+) could allow code execution

Ссылки

GDI — это… Что такое GDI?

У этого термина существуют и другие значения, см. GDI (значения).

GDI (Graphics Device Interface, Graphical Device Interface) — один из трёх основных компонентов или «подсистем», вместе с ядром и Windows API составляющих пользовательский интерфейс (оконный менеджер GDI) Microsoft Windows.

GDI — это интерфейс Windows для представления графических объектов и передачи их на устройства отображения, такие как мониторы и принтеры.

GDI отвечает за отрисовку линий и кривых, отображение шрифтов и обработку палитры. Он не отвечает за отрисовку окон, меню и т. п., эта задача закреплена за пользовательской подсистемой, располагающейся в user32.dll и основывающейся на GDI. GDI выполняет те же функции, что и QuickDraw в Mac OS.

Одно из преимуществ использования GDI вместо прямого доступа к оборудованию — это унификация работы с различными устройствами. Используя GDI, можно одними и теми же функциями рисовать на разных устройствах, таких как экран или принтер, получая на них практически одинаковые изображения. Эта возможность лежит в центре всех WYSIWYG-приложений для Windows.

Простые игры, которые не требуют быстрой графики, могут использовать GDI. Однако GDI не обеспечивает качественной анимации, поскольку в нём нет возможности синхронизации с кадровым буфером. Также, в GDI нет растеризации для отрисовки 3D-графики. Современные игры используют DirectX или OpenGL, что даёт программистам доступ к большему количеству аппаратных возможностей.

Краткое описание

Для определения атрибутов текста и изображения, которые выводятся на экран или принтер, используется программный объект под названием «контекст устройства» (Device Context, DC). DC, как и большинство объектов GDI, инкапсулирует подробности реализации и данные в себе и к ним нельзя получить прямой доступ.

Для любого рисования нужен объект HDC (хэндл DC). При выводе на принтер HDC получается вызовом CreateDC, и на нем зовутся специальные функции для перехода на новую страницу печатаемого документа. При выводе на экран также можно использовать CreateDC, но это приведет к рисованию поверх всех окон вне их границ, потому обычно для рисования на экране используются вызовы GetDC и BeginPaint, принадлежащие уже не GDI, а USER, и возвращающие контекст, ссылающийся на регион отсечения окна.

Функционал:

  • вывод одними и теми же вызовами на экран, принтер, «экран в памяти» (доступный приложению по указателю и созданный им bitmap в памяти, также возможно выделение bitmapов в памяти видеокарты — CreateCompatibleBitmap — и рисование на них, такие битовые карты не доступны по указателю, но дальнейшая перерисовка с них на физический экран происходит очень быстро без нагрузки процессора и шины, и особенно быстро в случае Remote Desktop).
  • вывод в метафайл — запоминание последовательности команд рисования в файле, можно проиграть заново, векторный графический файл .wmf есть именно этот метафайл с небольшим дополнительным заголовком в начале.
  • вывод текста различными шрифтами, в т. ч. TrueType и OpenType, а также шрифтами, вшитыми в принтер (при изображении документа на экране используется ближайший похожий программно реализованный шрифт). Буквы всегда заливаются одним цветом («текущий цвет»), промежутки между ними либо остаются прозрачными, либо же заливаются другим цветом («текущий цвет фона»). Не поддерживается расположение букв по кривой.
  • богатый набор операций с bitmapами, включая масштабирование, автоматическое преобразование из стандартных форматов в текущий формат экрана без усилий со стороны программиста (StretchDIBits), рисование на bitmapах нескольких стандартных форматов, находящихся в памяти, и огромное количество логических операций комбинирования цветов 2 bitmapов — уже имеющегося на устройстве назначения и вновь рисуемого.
  • богатый набор операций векторной графики (примерно тот же, что в PostScript, но используется другой вид сплайнов). Проводимая линия имеет атрибуты — толщину, рисунок пунктира и цвет (собраны вместе в т. н. объекте PEN) и способ сглаживания углов многоугольников. Заливка может быть одноцветной, одной из стандартных штриховок или же bitmapом 8 на 8 (эти атрибуты собраны в «объекте BRUSH»). В Windows NT также появились сплайны Безье.
  • все цвета в вызовах — всегда в RGB, независимо от системы цветов текущего устройства. Исключение — отдельные пикселы внутри bitmapов, которые могут быть и в виде, определенном устройством.
  • поддержка регионов отсечения и всех основных логических операций над ними. Координаты в них — 16-битные целые (что ограничивало размер экрана Windows, даже довольно поздних версий, до 32K пикселов).
  • поддержка матрицы поворотов/растяжений — World Transform, не поддерживается для регионов отсечения, только для векторной графики.

Реализация

В Windows 9x и более ранних реализована в 16-битной GDI.DLL, которая в свою очередь подгружает выполненный в виде DLL драйвер видеокарты. Драйвер видеокарты первоначально и был обязан реализовать вообще все рисование, в т. ч. рисование на bitmapах в памяти в формате экрана. Позже появилась DIBENG.DLL, в которой было реализовано рисование на bitmapах стандартных форматов, драйвер был обязан пропускать в нее все вызовы, кроме тех, для которых он задействовал аппаратный ускоритель видеокарты.

Драйвер принтера подгружался таким же образом и имел тот же интерфейс «сверху», но «снизу» он вместо рисования в памяти/на аппаратуре генерировал последовательности команд принтера и отсылал их в объект Job. Эти команды как правило были либо бинарные и не читаемые человеком, либо PostScript.

В Windows NT GDI была полностью переписана с нуля заново, причем на Си++ (по слухам, у Microsoft тогда не было компилятора этого языка и они использовали cfront). API для приложений не изменился (кроме добавления кривых Безье), для драйверов — обертки на языке Си вокруг реализованных на Си++ внутренностей (вроде BRUSHOBJ_pvGetRbrush).

Сама GDI была размещена сначала в WINSRV.DLL в процессе CSRSS.EXE, начиная с NT4 — в win32k.sys. Драйверы загружались туда же. DIBENG.DLL была переписана заново и перенесена туда же как совокупность вызовов EngXxx — EngTextOut и другие. Логика взаимодействия драйвера-GDI-DIBENG осталась примерно та же.

GDI32.DLL в режиме пользователя реализована как набор специальных системных вызовов, ведущих в win32k.sys (до NT4 — как обертки вокруг вызова CsrClientCallServer, посылавшего сообщение в CSRSS.EXE).

В Windows Vista появилась модель драйверов WDDM, в которой была отменена возможность использования аппаратуры двухмерной графики. При использовании WDDM все GDI-приложения (т. е. все обычные системные части Windows UI — заголовки и рамки окон, рабочий стол, таскбар и другое) используют GDI-драйвер cdd.dll (Canonical Display Driver), который рисует на некоторых bitmapах в памяти, своих для каждого окна (содержимое окна стало запоминаться в памяти, до того Windows никогда так не делала и всегда перерисовывала окна заново, кроме неких специальных окон с флагом CS_SAVEBITS). Изображения из cdd.dll извлекаются процессом dwm.exe (Desktop Window Manager), который является Direct3D-приложением и отрисовывает «картинки окон» на физическом экране через Direct3D.

Сам же WDDM-драйвер поддерживает только DirectDraw и Direct3D и не имеет отношения ни к GDI, ни к win32k.sys, сопрягаясь с модулем dxgkrnl.sys в ядре.

Критика

Крайне сильно критикуется подсистема печати Windows, особенно в случае сравнения ее с CUPS.

Причины: бинарный формат потока задания печати (в CUPS это PostScript), и реализация обработки этого потока в виде нескольких DLL внутри одного процесса SPOOLSV.EXE (CUPS вместо этого использует обычный конвейер из нескольких процессов вроде pstoraster | rastertoepson | parallel, который можно при желании запустить из обычного UNIX shell). Таким образом, CUPS поддерживает разработку фильтров заданий печати (например, для платных принтеров в отелях) даже на скриптовых языках вроде Perl.

Однако тут речь скорее о компонентах, лежащих ниже GDI.

Однако CUPS имеет серьёзные проблемы с поддержкой WinPrinterов вроде всех дешевых лазерных принтеров Hewlett-Packard. Так как они не поддерживают стандартный формат PCL, для них надо ставить огромные, сложные в настройках и построении пакеты, такие как HP OfficeJet (порт «hpoj» во FreeBSD). При этом CUPS прекрасно поддерживает струйные принтеры, дорогие модели лазерных принтеров Hewlett-Packard и принтеры PostScript.

Примерные аналоги

Нижние уровни технологии X11, используемой в UNIX-подобных ОС, таких как Linux.

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

GDI+

С выходом Windows XP появился потомок подсистемы, GDI+, основанной на C++[1].

GDI+ является улучшенной средой для 2D-графики, в которую добавлены такие возможности, как сглаживание линий (antialiasing), использование координат с плавающей точкой, градиентная заливка, внутренняя поддержка таких графических форматов, как JPEG и PNG, куда лучшая поддержка регионов отсечения с возможностью использовать в них координаты с плавающей точкой (а не 16-битные целые) и применения к ним World Transform, преобразования двумерных матриц и т. п. GDI+ использует ARGB-цвета. Эти возможности используются в пользовательском интерфейсе Windows XP, а их присутствие в базовом графическом слое облегчает использование систем векторной графики, таких как Flash или SVG.

Динамические библиотеки GDI+ могут распространяться вместе с приложениями для использования в предыдущих версиях Windows.

GDI+ схож с подсистемой Quartz 2D у Apple и библиотеками с открытым кодом libart и Cairo.

GDI+ есть не более чем набор оберток над обычной GDI. В Windows 7 появился новый API Direct2D, который есть примерно то же, но реализован «сверху донизу» вплоть до драйвера видеокарты (точнее, использует некие возможности Direct3D в этом драйвере), и может использовать аппаратное ускорение — т. е. трехмерный видеопроцессор для рисования некоторых двухмерных объектов (antialiasing и т. д.)

Уязвимости

14 сентября 2004 года была обнаружена уязвимость в GDI+ и других графических API, связанная с ошибкой в коде библиотеки JPEG. Эта ошибка позволяла выполнить произвольный код на любой системе Windows. Патч для исправления уязвимости был выпущен 12 октября 2004 года[2].

Примечания

  1. GDI+ Flat API  (англ.). MSDN Library. Microsoft. Архивировано из первоисточника 3 марта 2012. Проверено 31 октября 2009.
    Подсистема GDI+ доступна как «плоский» набор из 600 функций, реализованных в gdiplus.dll. Эти функции «обёрнуты» в 40 классов C++. Microsoft не планирует оказывать поддержку для кода, который обращается к плоскому набору напрямую, а не через классы и методы C++. .NET Framework предлагает набор альтернативных C++ обёрточных классов, входящих в пространство имен System.Drawing.
  2. MS04-028: Buffer overrun in JPEG processing (GDI+) could allow code execution

Ссылки

GDI — это… Что такое GDI?

У этого термина существуют и другие значения, см. GDI (значения).

GDI (Graphics Device Interface, Graphical Device Interface) — один из трёх основных компонентов или «подсистем», вместе с ядром и Windows API составляющих пользовательский интерфейс (оконный менеджер GDI) Microsoft Windows.

GDI — это интерфейс Windows для представления графических объектов и передачи их на устройства отображения, такие как мониторы и принтеры.

GDI отвечает за отрисовку линий и кривых, отображение шрифтов и обработку палитры. Он не отвечает за отрисовку окон, меню и т. п., эта задача закреплена за пользовательской подсистемой, располагающейся в user32.dll и основывающейся на GDI. GDI выполняет те же функции, что и QuickDraw в Mac OS.

Одно из преимуществ использования GDI вместо прямого доступа к оборудованию — это унификация работы с различными устройствами. Используя GDI, можно одними и теми же функциями рисовать на разных устройствах, таких как экран или принтер, получая на них практически одинаковые изображения. Эта возможность лежит в центре всех WYSIWYG-приложений для Windows.

Простые игры, которые не требуют быстрой графики, могут использовать GDI. Однако GDI не обеспечивает качественной анимации, поскольку в нём нет возможности синхронизации с кадровым буфером. Также, в GDI нет растеризации для отрисовки 3D-графики. Современные игры используют DirectX или OpenGL, что даёт программистам доступ к большему количеству аппаратных возможностей.

Краткое описание

Для определения атрибутов текста и изображения, которые выводятся на экран или принтер, используется программный объект под названием «контекст устройства» (Device Context, DC). DC, как и большинство объектов GDI, инкапсулирует подробности реализации и данные в себе и к ним нельзя получить прямой доступ.

Для любого рисования нужен объект HDC (хэндл DC). При выводе на принтер HDC получается вызовом CreateDC, и на нем зовутся специальные функции для перехода на новую страницу печатаемого документа. При выводе на экран также можно использовать CreateDC, но это приведет к рисованию поверх всех окон вне их границ, потому обычно для рисования на экране используются вызовы GetDC и BeginPaint, принадлежащие уже не GDI, а USER, и возвращающие контекст, ссылающийся на регион отсечения окна.

Функционал:

  • вывод одними и теми же вызовами на экран, принтер, «экран в памяти» (доступный приложению по указателю и созданный им bitmap в памяти, также возможно выделение bitmapов в памяти видеокарты — CreateCompatibleBitmap — и рисование на них, такие битовые карты не доступны по указателю, но дальнейшая перерисовка с них на физический экран происходит очень быстро без нагрузки процессора и шины, и особенно быстро в случае Remote Desktop).
  • вывод в метафайл — запоминание последовательности команд рисования в файле, можно проиграть заново, векторный графический файл .wmf есть именно этот метафайл с небольшим дополнительным заголовком в начале.
  • вывод текста различными шрифтами, в т. ч. TrueType и OpenType, а также шрифтами, вшитыми в принтер (при изображении документа на экране используется ближайший похожий программно реализованный шрифт). Буквы всегда заливаются одним цветом («текущий цвет»), промежутки между ними либо остаются прозрачными, либо же заливаются другим цветом («текущий цвет фона»). Не поддерживается расположение букв по кривой.
  • богатый набор операций с bitmapами, включая масштабирование, автоматическое преобразование из стандартных форматов в текущий формат экрана без усилий со стороны программиста (StretchDIBits), рисование на bitmapах нескольких стандартных форматов, находящихся в памяти, и огромное количество логических операций комбинирования цветов 2 bitmapов — уже имеющегося на устройстве назначения и вновь рисуемого.
  • богатый набор операций векторной графики (примерно тот же, что в PostScript, но используется другой вид сплайнов). Проводимая линия имеет атрибуты — толщину, рисунок пунктира и цвет (собраны вместе в т. н. объекте PEN) и способ сглаживания углов многоугольников. Заливка может быть одноцветной, одной из стандартных штриховок или же bitmapом 8 на 8 (эти атрибуты собраны в «объекте BRUSH»). В Windows NT также появились сплайны Безье.
  • все цвета в вызовах — всегда в RGB, независимо от системы цветов текущего устройства. Исключение — отдельные пикселы внутри bitmapов, которые могут быть и в виде, определенном устройством.
  • поддержка регионов отсечения и всех основных логических операций над ними. Координаты в них — 16-битные целые (что ограничивало размер экрана Windows, даже довольно поздних версий, до 32K пикселов).
  • поддержка матрицы поворотов/растяжений — World Transform, не поддерживается для регионов отсечения, только для векторной графики.

Реализация

В Windows 9x и более ранних реализована в 16-битной GDI.DLL, которая в свою очередь подгружает выполненный в виде DLL драйвер видеокарты. Драйвер видеокарты первоначально и был обязан реализовать вообще все рисование, в т. ч. рисование на bitmapах в памяти в формате экрана. Позже появилась DIBENG.DLL, в которой было реализовано рисование на bitmapах стандартных форматов, драйвер был обязан пропускать в нее все вызовы, кроме тех, для которых он задействовал аппаратный ускоритель видеокарты.

Драйвер принтера подгружался таким же образом и имел тот же интерфейс «сверху», но «снизу» он вместо рисования в памяти/на аппаратуре генерировал последовательности команд принтера и отсылал их в объект Job. Эти команды как правило были либо бинарные и не читаемые человеком, либо PostScript.

В Windows NT GDI была полностью переписана с нуля заново, причем на Си++ (по слухам, у Microsoft тогда не было компилятора этого языка и они использовали cfront). API для приложений не изменился (кроме добавления кривых Безье), для драйверов — обертки на языке Си вокруг реализованных на Си++ внутренностей (вроде BRUSHOBJ_pvGetRbrush).

Сама GDI была размещена сначала в WINSRV.DLL в процессе CSRSS.EXE, начиная с NT4 — в win32k.sys. Драйверы загружались туда же. DIBENG.DLL была переписана заново и перенесена туда же как совокупность вызовов EngXxx — EngTextOut и другие. Логика взаимодействия драйвера-GDI-DIBENG осталась примерно та же.

GDI32.DLL в режиме пользователя реализована как набор специальных системных вызовов, ведущих в win32k.sys (до NT4 — как обертки вокруг вызова CsrClientCallServer, посылавшего сообщение в CSRSS.EXE).

В Windows Vista появилась модель драйверов WDDM, в которой была отменена возможность использования аппаратуры двухмерной графики. При использовании WDDM все GDI-приложения (т. е. все обычные системные части Windows UI — заголовки и рамки окон, рабочий стол, таскбар и другое) используют GDI-драйвер cdd.dll (Canonical Display Driver), который рисует на некоторых bitmapах в памяти, своих для каждого окна (содержимое окна стало запоминаться в памяти, до того Windows никогда так не делала и всегда перерисовывала окна заново, кроме неких специальных окон с флагом CS_SAVEBITS). Изображения из cdd.dll извлекаются процессом dwm.exe (Desktop Window Manager), который является Direct3D-приложением и отрисовывает «картинки окон» на физическом экране через Direct3D.

Сам же WDDM-драйвер поддерживает только DirectDraw и Direct3D и не имеет отношения ни к GDI, ни к win32k.sys, сопрягаясь с модулем dxgkrnl.sys в ядре.

Критика

Крайне сильно критикуется подсистема печати Windows, особенно в случае сравнения ее с CUPS.

Причины: бинарный формат потока задания печати (в CUPS это PostScript), и реализация обработки этого потока в виде нескольких DLL внутри одного процесса SPOOLSV.EXE (CUPS вместо этого использует обычный конвейер из нескольких процессов вроде pstoraster | rastertoepson | parallel, который можно при желании запустить из обычного UNIX shell). Таким образом, CUPS поддерживает разработку фильтров заданий печати (например, для платных принтеров в отелях) даже на скриптовых языках вроде Perl.

Однако тут речь скорее о компонентах, лежащих ниже GDI.

Однако CUPS имеет серьёзные проблемы с поддержкой WinPrinterов вроде всех дешевых лазерных принтеров Hewlett-Packard. Так как они не поддерживают стандартный формат PCL, для них надо ставить огромные, сложные в настройках и построении пакеты, такие как HP OfficeJet (порт «hpoj» во FreeBSD). При этом CUPS прекрасно поддерживает струйные принтеры, дорогие модели лазерных принтеров Hewlett-Packard и принтеры PostScript.

Примерные аналоги

Нижние уровни технологии X11, используемой в UNIX-подобных ОС, таких как Linux.

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

GDI+

С выходом Windows XP появился потомок подсистемы, GDI+, основанной на C++[1].

GDI+ является улучшенной средой для 2D-графики, в которую добавлены такие возможности, как сглаживание линий (antialiasing), использование координат с плавающей точкой, градиентная заливка, внутренняя поддержка таких графических форматов, как JPEG и PNG, куда лучшая поддержка регионов отсечения с возможностью использовать в них координаты с плавающей точкой (а не 16-битные целые) и применения к ним World Transform, преобразования двумерных матриц и т. п. GDI+ использует ARGB-цвета. Эти возможности используются в пользовательском интерфейсе Windows XP, а их присутствие в базовом графическом слое облегчает использование систем векторной графики, таких как Flash или SVG.

Динамические библиотеки GDI+ могут распространяться вместе с приложениями для использования в предыдущих версиях Windows.

GDI+ схож с подсистемой Quartz 2D у Apple и библиотеками с открытым кодом libart и Cairo.

GDI+ есть не более чем набор оберток над обычной GDI. В Windows 7 появился новый API Direct2D, который есть примерно то же, но реализован «сверху донизу» вплоть до драйвера видеокарты (точнее, использует некие возможности Direct3D в этом драйвере), и может использовать аппаратное ускорение — т. е. трехмерный видеопроцессор для рисования некоторых двухмерных объектов (antialiasing и т. д.)

Уязвимости

14 сентября 2004 года была обнаружена уязвимость в GDI+ и других графических API, связанная с ошибкой в коде библиотеки JPEG. Эта ошибка позволяла выполнить произвольный код на любой системе Windows. Патч для исправления уязвимости был выпущен 12 октября 2004 года[2].

Примечания

  1. GDI+ Flat API  (англ.). MSDN Library. Microsoft. Архивировано из первоисточника 3 марта 2012. Проверено 31 октября 2009.
    Подсистема GDI+ доступна как «плоский» набор из 600 функций, реализованных в gdiplus.dll. Эти функции «обёрнуты» в 40 классов C++. Microsoft не планирует оказывать поддержку для кода, который обращается к плоскому набору напрямую, а не через классы и методы C++. .NET Framework предлагает набор альтернативных C++ обёрточных классов, входящих в пространство имен System.Drawing.
  2. MS04-028: Buffer overrun in JPEG processing (GDI+) could allow code execution

Ссылки

GDI — это… Что такое GDI?

У этого термина существуют и другие значения, см. GDI (значения).

GDI (Graphics Device Interface, Graphical Device Interface) — один из трёх основных компонентов или «подсистем», вместе с ядром и Windows API составляющих пользовательский интерфейс (оконный менеджер GDI) Microsoft Windows.

GDI — это интерфейс Windows для представления графических объектов и передачи их на устройства отображения, такие как мониторы и принтеры.

GDI отвечает за отрисовку линий и кривых, отображение шрифтов и обработку палитры. Он не отвечает за отрисовку окон, меню и т. п., эта задача закреплена за пользовательской подсистемой, располагающейся в user32.dll и основывающейся на GDI. GDI выполняет те же функции, что и QuickDraw в Mac OS.

Одно из преимуществ использования GDI вместо прямого доступа к оборудованию — это унификация работы с различными устройствами. Используя GDI, можно одними и теми же функциями рисовать на разных устройствах, таких как экран или принтер, получая на них практически одинаковые изображения. Эта возможность лежит в центре всех WYSIWYG-приложений для Windows.

Простые игры, которые не требуют быстрой графики, могут использовать GDI. Однако GDI не обеспечивает качественной анимации, поскольку в нём нет возможности синхронизации с кадровым буфером. Также, в GDI нет растеризации для отрисовки 3D-графики. Современные игры используют DirectX или OpenGL, что даёт программистам доступ к большему количеству аппаратных возможностей.

Краткое описание

Для определения атрибутов текста и изображения, которые выводятся на экран или принтер, используется программный объект под названием «контекст устройства» (Device Context, DC). DC, как и большинство объектов GDI, инкапсулирует подробности реализации и данные в себе и к ним нельзя получить прямой доступ.

Для любого рисования нужен объект HDC (хэндл DC). При выводе на принтер HDC получается вызовом CreateDC, и на нем зовутся специальные функции для перехода на новую страницу печатаемого документа. При выводе на экран также можно использовать CreateDC, но это приведет к рисованию поверх всех окон вне их границ, потому обычно для рисования на экране используются вызовы GetDC и BeginPaint, принадлежащие уже не GDI, а USER, и возвращающие контекст, ссылающийся на регион отсечения окна.

Функционал:

  • вывод одними и теми же вызовами на экран, принтер, «экран в памяти» (доступный приложению по указателю и созданный им bitmap в памяти, также возможно выделение bitmapов в памяти видеокарты — CreateCompatibleBitmap — и рисование на них, такие битовые карты не доступны по указателю, но дальнейшая перерисовка с них на физический экран происходит очень быстро без нагрузки процессора и шины, и особенно быстро в случае Remote Desktop).
  • вывод в метафайл — запоминание последовательности команд рисования в файле, можно проиграть заново, векторный графический файл .wmf есть именно этот метафайл с небольшим дополнительным заголовком в начале.
  • вывод текста различными шрифтами, в т. ч. TrueType и OpenType, а также шрифтами, вшитыми в принтер (при изображении документа на экране используется ближайший похожий программно реализованный шрифт). Буквы всегда заливаются одним цветом («текущий цвет»), промежутки между ними либо остаются прозрачными, либо же заливаются другим цветом («текущий цвет фона»). Не поддерживается расположение букв по кривой.
  • богатый набор операций с bitmapами, включая масштабирование, автоматическое преобразование из стандартных форматов в текущий формат экрана без усилий со стороны программиста (StretchDIBits), рисование на bitmapах нескольких стандартных форматов, находящихся в памяти, и огромное количество логических операций комбинирования цветов 2 bitmapов — уже имеющегося на устройстве назначения и вновь рисуемого.
  • богатый набор операций векторной графики (примерно тот же, что в PostScript, но используется другой вид сплайнов). Проводимая линия имеет атрибуты — толщину, рисунок пунктира и цвет (собраны вместе в т. н. объекте PEN) и способ сглаживания углов многоугольников. Заливка может быть одноцветной, одной из стандартных штриховок или же bitmapом 8 на 8 (эти атрибуты собраны в «объекте BRUSH»). В Windows NT также появились сплайны Безье.
  • все цвета в вызовах — всегда в RGB, независимо от системы цветов текущего устройства. Исключение — отдельные пикселы внутри bitmapов, которые могут быть и в виде, определенном устройством.
  • поддержка регионов отсечения и всех основных логических операций над ними. Координаты в них — 16-битные целые (что ограничивало размер экрана Windows, даже довольно поздних версий, до 32K пикселов).
  • поддержка матрицы поворотов/растяжений — World Transform, не поддерживается для регионов отсечения, только для векторной графики.

Реализация

В Windows 9x и более ранних реализована в 16-битной GDI.DLL, которая в свою очередь подгружает выполненный в виде DLL драйвер видеокарты. Драйвер видеокарты первоначально и был обязан реализовать вообще все рисование, в т. ч. рисование на bitmapах в памяти в формате экрана. Позже появилась DIBENG.DLL, в которой было реализовано рисование на bitmapах стандартных форматов, драйвер был обязан пропускать в нее все вызовы, кроме тех, для которых он задействовал аппаратный ускоритель видеокарты.

Драйвер принтера подгружался таким же образом и имел тот же интерфейс «сверху», но «снизу» он вместо рисования в памяти/на аппаратуре генерировал последовательности команд принтера и отсылал их в объект Job. Эти команды как правило были либо бинарные и не читаемые человеком, либо PostScript.

В Windows NT GDI была полностью переписана с нуля заново, причем на Си++ (по слухам, у Microsoft тогда не было компилятора этого языка и они использовали cfront). API для приложений не изменился (кроме добавления кривых Безье), для драйверов — обертки на языке Си вокруг реализованных на Си++ внутренностей (вроде BRUSHOBJ_pvGetRbrush).

Сама GDI была размещена сначала в WINSRV.DLL в процессе CSRSS.EXE, начиная с NT4 — в win32k.sys. Драйверы загружались туда же. DIBENG.DLL была переписана заново и перенесена туда же как совокупность вызовов EngXxx — EngTextOut и другие. Логика взаимодействия драйвера-GDI-DIBENG осталась примерно та же.

GDI32.DLL в режиме пользователя реализована как набор специальных системных вызовов, ведущих в win32k.sys (до NT4 — как обертки вокруг вызова CsrClientCallServer, посылавшего сообщение в CSRSS.EXE).

В Windows Vista появилась модель драйверов WDDM, в которой была отменена возможность использования аппаратуры двухмерной графики. При использовании WDDM все GDI-приложения (т. е. все обычные системные части Windows UI — заголовки и рамки окон, рабочий стол, таскбар и другое) используют GDI-драйвер cdd.dll (Canonical Display Driver), который рисует на некоторых bitmapах в памяти, своих для каждого окна (содержимое окна стало запоминаться в памяти, до того Windows никогда так не делала и всегда перерисовывала окна заново, кроме неких специальных окон с флагом CS_SAVEBITS). Изображения из cdd.dll извлекаются процессом dwm.exe (Desktop Window Manager), который является Direct3D-приложением и отрисовывает «картинки окон» на физическом экране через Direct3D.

Сам же WDDM-драйвер поддерживает только DirectDraw и Direct3D и не имеет отношения ни к GDI, ни к win32k.sys, сопрягаясь с модулем dxgkrnl.sys в ядре.

Критика

Крайне сильно критикуется подсистема печати Windows, особенно в случае сравнения ее с CUPS.

Причины: бинарный формат потока задания печати (в CUPS это PostScript), и реализация обработки этого потока в виде нескольких DLL внутри одного процесса SPOOLSV.EXE (CUPS вместо этого использует обычный конвейер из нескольких процессов вроде pstoraster | rastertoepson | parallel, который можно при желании запустить из обычного UNIX shell). Таким образом, CUPS поддерживает разработку фильтров заданий печати (например, для платных принтеров в отелях) даже на скриптовых языках вроде Perl.

Однако тут речь скорее о компонентах, лежащих ниже GDI.

Однако CUPS имеет серьёзные проблемы с поддержкой WinPrinterов вроде всех дешевых лазерных принтеров Hewlett-Packard. Так как они не поддерживают стандартный формат PCL, для них надо ставить огромные, сложные в настройках и построении пакеты, такие как HP OfficeJet (порт «hpoj» во FreeBSD). При этом CUPS прекрасно поддерживает струйные принтеры, дорогие модели лазерных принтеров Hewlett-Packard и принтеры PostScript.

Примерные аналоги

Нижние уровни технологии X11, используемой в UNIX-подобных ОС, таких как Linux.

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

GDI+

С выходом Windows XP появился потомок подсистемы, GDI+, основанной на C++[1].

GDI+ является улучшенной средой для 2D-графики, в которую добавлены такие возможности, как сглаживание линий (antialiasing), использование координат с плавающей точкой, градиентная заливка, внутренняя поддержка таких графических форматов, как JPEG и PNG, куда лучшая поддержка регионов отсечения с возможностью использовать в них координаты с плавающей точкой (а не 16-битные целые) и применения к ним World Transform, преобразования двумерных матриц и т. п. GDI+ использует ARGB-цвета. Эти возможности используются в пользовательском интерфейсе Windows XP, а их присутствие в базовом графическом слое облегчает использование систем векторной графики, таких как Flash или SVG.

Динамические библиотеки GDI+ могут распространяться вместе с приложениями для использования в предыдущих версиях Windows.

GDI+ схож с подсистемой Quartz 2D у Apple и библиотеками с открытым кодом libart и Cairo.

GDI+ есть не более чем набор оберток над обычной GDI. В Windows 7 появился новый API Direct2D, который есть примерно то же, но реализован «сверху донизу» вплоть до драйвера видеокарты (точнее, использует некие возможности Direct3D в этом драйвере), и может использовать аппаратное ускорение — т. е. трехмерный видеопроцессор для рисования некоторых двухмерных объектов (antialiasing и т. д.)

Уязвимости

14 сентября 2004 года была обнаружена уязвимость в GDI+ и других графических API, связанная с ошибкой в коде библиотеки JPEG. Эта ошибка позволяла выполнить произвольный код на любой системе Windows. Патч для исправления уязвимости был выпущен 12 октября 2004 года[2].

Примечания

  1. GDI+ Flat API  (англ.). MSDN Library. Microsoft. Архивировано из первоисточника 3 марта 2012. Проверено 31 октября 2009.
    Подсистема GDI+ доступна как «плоский» набор из 600 функций, реализованных в gdiplus.dll. Эти функции «обёрнуты» в 40 классов C++. Microsoft не планирует оказывать поддержку для кода, который обращается к плоскому набору напрямую, а не через классы и методы C++. .NET Framework предлагает набор альтернативных C++ обёрточных классов, входящих в пространство имен System.Drawing.
  2. MS04-028: Buffer overrun in JPEG processing (GDI+) could allow code execution

Ссылки

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *