Итак,
еще один способ работы в 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 в каждой операции рисования и отсутствия прямого доступа к видеокарте. Для решения этой проблемы 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 была проста - предоставить разработчикам
низкоуровневый доступ к аппаратному обеспечению (в нашем случае к видеокарте),
в стиле 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" в
нынешнее время стоит в игровом мире очень много. В частности из-за того что программная эмуляция сейчас практически лишена
смысла по двум причинам:
Приложение использующее DirectX "общается" с любой видеокартой практически напрямую, посредством универсального Direct3D интерфейса работающего в обход большей части Windows. Схема работы Direct3D, части DirectX интерфейса предназначенного для создания 3D графики, представлена на рисунке:
Интерфейс
DirectX появился вскоре после выхода Windows 95, и после этого все операционные системы начиная с Windows 95 OSR 2
несли у себя на борту ту или иную версию интерфейса DirectX.
Также вместе с DirectX в Windows
95 OSR 2 появилась поддержка графического интерфейса OpenGL
и это не случайно. Интерфейс DirectX принципиально
состоит из двух независимых частей:
Такая
организация позволяет легко расширять вторую часть не меняя
или минимально меняя первую, кроме того, первая часть может быть использования
для "прикручивания" к ней других интерфейсов. Например
вышеупомянутый OpenGL в Windows
функционирует именно так, то есть поверх DirectX.
Многие из вас должно быть помнят появившиеся именно в OSR 2 трехмерные
хранители экрана написанные с использованием OpenGL.
Однако
наиболее популярным интерфейсом для 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 представлена на рисунке:
В
системе Windows никогда не было встроенной поддержки Glide, поэтому необходимые библиотеки входили в состав
дистрибутива драйвера. Расширениями Glide
как и непосредственным их воплощениями в "железе" единолично
занималась 3dfx.
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 при разработке был максимально
лишен каких-бы то ни было высокоуровневых функций,
он не имеет собственного формата файла, набор его примитивов весьма ограничен,
сам он не умеет работать ни с одной оконной системой. Все эти недостающие
компоненты необходимые для успешной разработки приложений реализуются в виде
различных программных расширений и библиотек.
В
отличие от 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. Итак, типичный драйвер состоит из
четырех частей:
С точки зрения конечного пользователя, именно 4 часть представляет
наибольший интерес, предоставляя доступ к всевозможным галочкам-ползуночкам-кнопочкам,
позволяя пользователю настроить драйвер или режим функционирования видеокарты.
Потому что настройки драйвера можно разделить на две принципиально разные части: