3.5. ВИДЕОСИСТЕМА КОМПЬЮТЕРА

ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ

 

Итак, еще один способ работы в SVGA режиме для разработчиков игр появился с выходом Windows 95. Каким же способом ограничение преодолевалось здесь? Сразу скажу, что наличие/отсутствие VESA для Windows не имело ни какого значения. Всё достаточно просто - для работы с графикой в Windows используются функции ОС, а то как её отрисовка будет выполнена в самой системе уже не ваша проблема. Таким образом, в Windows программист вообще лишился возможности напрямую обращаться к видеокарте. Это проблема Windows, которая в свою очередь обращается к драйверу.

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

Драйвер обеспечивает ряд стандартных функций для доступа к аппаратной части, в то же время Windows абсолютно безразлично каким образом эта самая аппаратная часть реализована. Таким образом, разработчику "железа" предоставляется значительная гибкость по сравнению с VGA и VESA, правда теперь ему также нужно писать и драйвер для своей видеокарты.

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

Однако первое время всё было не так радужно... Во-первых работа в графическом режиме Windows была очень медленной и реализовать что-то более динамичное чем известные "Сапер" и "Косынка" было, мягко говоря, сложновато. Связано это было в первую очередь с тем, что самый быстрый, прямой доступ к видеопамяти из Windows был невозможен. Поэтому применить наработанные в MS-DOS графические библиотеки для работы в режимах VGA и VESA было нельзя. В итоге пусть и не оптимальные в плане аппаратного ускорения игры под VGA/VESA режимы MS-DOS были быстрее чем с аппаратной акселерацией под Windows.

Принцип работы видеокарты в графическом режиме Windows с использованием драйвера:

 

Принцип работы видеокарты под управлением Windows с использованием 
драйвера

 

Работа в графическом режиме Windows была удобной, но очень медленной из-за участия всей "махины" Windows в каждой операции рисования и отсутствия прямого доступа к видеокарте. Для решения этой проблемы Microsoft в срочном порядке выпускает пакет DirectX.

 

Интерфейсы

Однако прежде чем приступить к описанию DirectX разберемся с тем, что же такое "интерфейс". Интерфейс в самом общем смысле это некоторый стандарт по коммуникации. Он может быть как аппаратным, например шина USB, определяющим способ общения между устройствами, так и программным - определяющим способ общения между программами, а также множество других интерфейсов в числе которых и оконный интерфейс Windows (Windows GUI [Graphical User Interface - графический интерфейс пользователя]). Существуют также интерфейс прикладного программирования (Application Programming Interface - API) которые представляет собой интерфейс между программистом пишущим программу и возможностями предоставляемыми ему операционной системой. Так вот, все рассматриваемые в статье интерфейсы являются в первую очередь интерфейсами прикладного программирования. Для того чтобы тот или иной интерфейс прикладного программирования появился в системе, его функции (библиотеки подпрограмм) должны быть тем или иным способом установлены в системе - в Windows 2000 например по умолчанию уже установлены DirectX 7.0 и OpenGL. Кроме того, средства разработки программ для данной операционной системы должны быть оснашены заголовочными файлами описывающими эти функции и (опционально) дополнительными библиотеками для облегчения разработки программ. Например Microsoft регулярно выпускает свои DirectX SDK (Software Development Kit - Набор для разработки программ) для своего инструмента разработки Windows приложений - Microsoft Visual Studio. В свою очередь уже операционная система с помощью драйвера видеокарты может связать программные вызовы этих функций приложением (например, игрой) с её аппаратной частью.

Схематично это можно представить следующим образом:

 

Принцип работы интерфейса (на примере DirectX)

 

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

 

Интерфейс Microsoft DirectX

Идея DirectX была проста - предоставить разработчикам низкоуровневый доступ к аппаратному обеспечению (в нашем случае к видеокарте), в стиле MS-DOS, в независимом от конечного устройства виде, т.е. сохранив все преимущества "драйверного" подхода. В первую очередь DirectDraw и Direct3D (два графических интерфейса DirectX) были нацелены на достижение максимально высокой скорости работы с графикой и на обеспечение максимальной совместимости. При этом они также предоставляли массу дополнительных высокоуровневых функций облегчавших создание графики и анимации. Для обеспечения совместимости все базовые функции были продублированы программной эмуляцией, таким образом, даже если устройство не могло выполнять какую-либо функцию, она эмулировалась программно. Например я помню как играл в игру "Gorky-17" на Pentium-200MMX с S3 Trio64 V+ 1 Мб в режиме программной эмуляции Direct3D (шестой, кажется, версии). Таким образом первое время всё то дикое множество самых разнообразных карт было более-менее счесано под одну гребенку DirectX и игрописатели были более менее уверены, что их детище запустится на большинстве компьютеров.

Затем начали появляться DirectX совместимые карты. Такая карта на уровне своего драйвера поддерживала все или часть функций DirectX на аппаратном уровне, причем драйвер мог сообщать DirectX что он "умеет", а что - нет. Разработчики видеокарт сотрудничали с Microsoft предлагая включить в DirectX те или иные новые функции - таким образом DirectX потихоньку рос и расширялся. Но всё же на данный момент представляется другая, довольно строгая зависимость: то что заложено в будущую версию DirectX аппаратно реализуется в следующем поколении видеокарт. Вызвано это следующим - положим некоторая фирма реализовала новую возможность, но Microsoft отказалась включить её в DirectX - усилия пропали даром. В качестве примера можно привести печальную историю с шейдерами на GeForce2 GTS. Таким образом гораздо безопаснее сообща с Microsoft и сообществом производителей видеокарт обговорить будущие спецификации и затем приступить к их реализации. Хотя порой Microsoft считает лишним советоваться просто решая: "В будущем Windows это должно быть" и точка. Впрочем для нас это не так и плохо - это заставляет производителей суетиться - лейбл "DirectX N Compatible" в нынешнее время стоит в игровом мире очень много. В частности из-за того что программная эмуляция сейчас практически лишена смысла по двум причинам:

  1. скорость будет неадекватной современным потребностям;
  2. сейчас уже нет DirectX несовместимых карт.

 

Приложение использующее DirectX "общается" с любой видеокартой практически напрямую, посредством универсального Direct3D интерфейса работающего в обход большей части Windows. Схема работы Direct3D, части DirectX интерфейса предназначенного для создания 3D графики, представлена на рисунке:

 

Принцип работы видеокарты с использованием интерфейса Direct3D

 

Интерфейс DirectX появился вскоре после выхода Windows 95, и после этого все операционные системы начиная с Windows 95 OSR 2 несли у себя на борту ту или иную версию интерфейса DirectX. Также вместе с DirectX в Windows 95 OSR 2 появилась поддержка графического интерфейса OpenGL и это не случайно. Интерфейс DirectX принципиально состоит из двух независимых частей:

  1. низкоуровневой работающей с аппаратной частью;
  2. высокоуровневой работающей с программными вызовами.

 

Такая организация позволяет легко расширять вторую часть не меняя или минимально меняя первую, кроме того, первая часть может быть использования для "прикручивания" к ней других интерфейсов. Например вышеупомянутый OpenGL в Windows функционирует именно так, то есть поверх DirectX. Многие из вас должно быть помнят появившиеся именно в OSR 2 трехмерные хранители экрана написанные с использованием OpenGL.

 

Интерфейс 3dfx Glide

Однако наиболее популярным интерфейсом для 3D-графики, первое время, был, известный многим, Glide фирмы 3dfx. Популярность Glide была вызвана тем, что карты поддерживающие его на аппаратном уровне целиком и полностью, в отличие от DirectX и OpenGL, появились сразу же (правда это были только карты 3dfx). Популярность же самих карт была вызвана тем, что они были в общем-то первыми картами 3D-ускорителями поддерживающими не только собственный Glide, но и Direct3D с OpenGL (начиная с Voodoo2). Glide будучи разработанным для вполне специфических карт показывал на них непревзойденную скорость. Однако по мере того как количество и популярность конкурентов росли, популярность Glide падала. 3dfx отчасти погубила собственная жадность - она не стала "открывать" Glide тем самым закрыв возможность встроить поддержку Glide в карты других производителей. Когда она приняла таки решение открыть Glide было уже слишком поздно. Естественно, что производители игр не могли выпускать игру только с поддержкой Glide (хотя наличие такой поддержки долгое время было правилом хорошего тона), но как минимум с поддержкой Direct3D и/или OpenGL. Если же ресурсы команды были ограничены то игра выпускалась обычно только под Direct3D или OpenGL. В числе недостатков Glide - отсутствие программной эмуляции, хотя это скорее было запланированным ходом 3dfx чем недоработкой.

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

 

Принцип работы 3dfx видеокарты с использованием интерфейса Glide

 

В системе Windows никогда не было встроенной поддержки Glide, поэтому необходимые библиотеки входили в состав дистрибутива драйвера. Расширениями Glide как и непосредственным их воплощениями в "железе" единолично занималась 3dfx.

 

Интерфейс OpenGL

OpenGL это промышленный стандарт интерфейса для 2D и 3D графики разработанный в начале 80-х годов фирмой Silicon Graphics. В отличие от Glide, OpenGL является открытым, так что любая фирма при желании может встроить его поддержку в свою операционную систему или видеокарту. В отличие от DirectX существующем только в мире Windows, OpenGL существует почти на всех системах, таким образом портирование (перенос) OpenGL игры на различные платформы было относительно простым. OpenGL как и DirectX предусматривал режим программной эмуляции (сколько "Quake 2" было в нем пройдено). В общем-то когда OpenGL появлялся он и был чисто программным, его основной целью было создание удобного интерфейса для создания реалистичной 2D/3D графики, а идея о его аппаратном ускорении возникла уже позже.

Принципиальных различий в принципе работу между Direct3D и OpenGL нет. Приложение использующее OpenGL "общается" с любой видеокартой практически напрямую, посредством нижнего слоя DirectX интерфейса, и работает в обход большей части Windows.

 

Принцип работы видеокарты с использованием интерфейса OpenGL

 

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

В отличие от DirectX где тон в плане расширения возможностей задает Microsoft и градация возможностей карт осуществляется по версии DirectX, то в OpenGL расширения добавляются по большей части разработчиками "железа" и реализуются в собственных же драйверах, а уже программист решает использовать их или нет. Причем решение это может выбираться по ходу как например сжатие текстур. Таким образом если две DirectX 8 совместимые видеокарты будут выглядеть равными для режима Direct3D, то в области расширений OpenGL эти же видеокарты могут различаться гораздо более существенно.

Поддержка OpenGL в Windows появилась вместе с выходом DirectX и присутствует в системе во всех версиях начиная с Windows 95 OSR 2.

 

"Итого" по интерфейсам

Может показаться невероятным, но в этоху бума 3D на ПК 1996-1997 годы, за право быть стандартным боролись до 40 (!) различных 3D интерфейсов. Победили имевшие неоспоримые преимущества. DirectX имел поддержку Microsoft, Glide имел превосходную аппаратную поддержку со стороны собственного "железа", OpenGL - признанный патриарх влияние которого на мир 3D к тому времени уже было весьма значительным. Кстати, так хорошо известные нам карты, работая на компьютерах Macintosh фирмы Apple, поддерживают совсем неизвестный нам интерфейс QuickDraw 3D. Вот она - универсальность драйверного подхода!

В общем и целом все эти три интерфейса DirectX, OpenGL и Glide преследовали одну и ту же цель создание удобного интерфейса для 2D и 3D графики. Тем не менее, мы видим насколько они различны:

 

Интерфейс

OpenGL

DirectX

Glide

Разработчик

Silicon Graphics

Microsoft

3dfx

Год появления

1980

1996

1996

Открытость

Да

Да

Нет

Кросс-платформенность

Да

Нет

Да

Программная
эмуляция

Да

Да

Нет

Встроенные
высокоуровневые
возможности

Нет

Да

Да

Расширяемость

Версиями интерфейса,
Расширениями драйвера

Версиями интерфейса

Версиями интерфейса

 

И снова драйверы

Вернемся к драйверам и взглянем, что же из себя представляет Windows драйвер современного 3D-ускорителя коими по праву могут считаться и все карты фирмы NVIDIA. Итак, типичный драйвер состоит из четырех частей:

  1. собственно драйвер, отвечающий за самый низкий уровень коммуникаций с видеокартой;
  2. драйвер для работы с интерфейсом Direct3D;
  3. драйвер для работы с интерфейсом OpenGL;
  4. всё остальное, включающее в себя всевозможные средства настройки режимов работы видеокарты.

 

С точки зрения конечного пользователя, именно 4 часть представляет наибольший интерес, предоставляя доступ к всевозможным галочкам-ползуночкам-кнопочкам, позволяя пользователю настроить драйвер или режим функционирования видеокарты. Потому что настройки драйвера можно разделить на две принципиально разные части:

  1. те, что отвечают непосредственно за аппаратные возможности видеокарты, например антиалиасинг;
  2. те, что отвечают за функции, влияющие на конечное изображение, но выполняемые на уровне драйвера.