Видеопамять, видеокарты, мониторы
1)Основные характеристики видеокарт
Современные графические процессоры содержат множество функциональных блоков, от количества и характеристик которых зависит и итоговая скорость рендеринга, влияющая на комфортность игры. По сравнительному количеству этих блоков в разных видеочипах можно примерно оценить, насколько быстр тот или иной GPU. Характеристик у видеочипов довольно много, в этом разделе мы рассмотрим самые важные из них.
Тактовая частота видеочипа
Рабочая частота GPU измеряется в мегагерцах, в миллионах тактов в секунду. Эта характеристика прямо влияет на производительность видеочипа, чем она выше, тем больший объем работы чип может выполнить в единицу времени, обработать большее количество вершин и пикселей. Пример из реальной жизни: частота видеочипа, установленного на плате RADEON X1900 XTX равна 650 МГц, а точно такой же чип на RADEON X1900 XT работает на частоте в 625 МГц. Соответственно будут отличаться и все основные характеристики производительности. Но далеко не только рабочая частота чипа однозначно определяет производительность, на его скорость сильно влияет и архитектура: количество различных исполнительных блоков, их характеристики и т.п.
В последнее время участились случаи, когда тактовая частота для отдельных блоков GPU отличается от частоты работы всего остального чипа. То есть, разные части GPU работают на разных частотах, и сделано это для увеличения эффективности, ведь некоторые блоки способны работать на повышенных частотах, а другие — нет. Из последних примеров можно назвать семейство GeForce 8800 от NVIDIA, видеочип модели GTS работает на частоте 512 МГц, но универсальные шейдерные блоки тактуются на значительно более высокой частоте — 1200 МГц.
Скорость заполнения (филлрейт)
Скорость заполнения показывает, с какой скоростью видеочип способен отрисовывать пиксели. Различают два типа филлрейта: пиксельный (pixel fill rate) и текстурный (texel rate). Пиксельная скорость заполнения показывает скорость отрисовки пикселей на экране и зависит от рабочей частоты и количества блоков ROP (блоков операций растеризации и блендинга), а текстурная — это скорость выборки текстурных данных, которая зависит от частоты работы и количества текстурных блоков.
Например, пиксельный филлрейт у GeForce 7900 GTX равен 650 (частота чипа) * 16 (количество блоков ROP) = 10400 мегапикселей в секунду, а текстурный — 650 * 24 (кол-во блоков текстурирования) = 15600 мегатекселей/с. Чем больше первое число - тем быстрее видеокарта может отрисовывать готовые пиксели, а чем больше второе - тем быстрее производится выборка текстурных данных. Оба параметра важны для современных игр, но они должны быть сбалансированы. Именно поэтому количество блоков ROP в чипах семейства G7x, на которых построено семейство GeForce 7, меньше количества текстурных и пиксельных блоков.
Количество блоков пиксельных шейдеров (или пиксельных процессоров)
Пиксельные процессоры — это одни из главных блоков видеочипа, которые выполняют специальные программы, известные также как пиксельные шейдеры. По числу блоков пиксельных шейдеров и их частоте можно сравнивать шейдерную производительность разных видеокарт. Так как большая часть игр сейчас ограничена производительностью исполнения пиксельных шейдеров (см. технологические обзоры игр), то количество этих блоков очень важно! Если одна модель видеокарты основана на GPU с 8 блоками пиксельных шейдеров, а другая из той же линейки — 16 блоками, то при прочих равных вторая будет вдвое быстрее обрабатывать пиксельные программы, и в целом будет производительнее. Но на основании одного лишь количества блоков делать однозначные выводы нельзя, обязательно нужно учесть и тактовую частоту и разную архитектуру блоков разных поколений и производителей чипов. Чисто по этим цифрам прямо можно сравнивать чипы только в пределах одной линейки одного производителя: AMD(ATI) или NVIDIA. В других же случаях нужно обращать внимание на тесты производительности в интересующих играх.
Количество блоков вершинных шейдеров (или вершинных процессоров)
Аналогично предыдущему пункту, эти блоки выполняют программы шейдеров, но уже вершинных. Данная характеристика важна для некоторых игр, но не так явно, как предыдущая, так как даже современными играми блоки вершинных шейдеров почти никогда не бывают загружены даже наполовину. И, так как производители балансируют количество разных блоков, не позволяя возникнуть большому перекосу в распределении сил, количеством вершинных процессоров при выборе видеокарты вполне можно пренебречь, учитывая их только при прочих равных характеристиках.
Количество унифицированных шейдерных блоков (или универсальных процессоров)
Унифицированные шейдерные блоки объединяют два типа перечисленных выше блоков, они могут исполнять как вершинные, так и пиксельные программы (а также геометрические, которые появились в DirectX 10). Впервые унифицированная архитектура была применена в видеочипе игровой консоли Microsoft Xbox 360, этот графический процессор был разработан компанией ATI. А в видеочипах для персональных компьютеров унифицированные шейдерные блоки появились не так давно, с появлением плат NVIDIA GeForce 8800. И, похоже, что все DirectX 10 совместимые видеочипы будут основаны на подобной унифицированной архитектуре. Унификация блоков шейдеров значит, что код разных шейдерных программ (вершинных, пиксельных и геометрических) универсален, и соответствующие унифицированные процессоры могут выполнить любые программы из вышеперечисленных. Соответственно, в новых архитектурах число пиксельных, вершинных и геометрических шейдерных блоков как бы сливается в одно число — количество универсальных процессоров.
Блоки текстурирования (TMU)
Эти блоки работают совместно с шейдерными процессорами всех указанных типов, ими осуществляется выборка и фильтрация текстурных данных, необходимых для построения сцены. Число текстурных блоков в видеочипе определяет текстурную производительность, скорость выборки из текстур. И хотя в последнее время большая часть расчетов осуществляется блоками шейдеров, нагрузка на блоки TMU до сих пор довольно велика, и с учетом упора некоторых игр в производительность блоков текстурирования, можно сказать, что количество блоков TMU и соответствующая высокая текстурная производительность являются одними из важнейших параметров видеочипов. Особое влияние этот параметр оказывает на скорость при использовании трилинейной и анизотропной фильтраций, требующих дополнительных текстурных выборок.
Блоки операций растеризации (ROP)
Блоки растеризации осуществляют операции записи рассчитанных видеокартой пикселей в буферы и операции их смешивания (блендинга). Как мы уже отмечали выше, производительность блоков ROP влияет на филлрейт и это — одна из основных характеристик видеокарт всех времен. И хотя в последнее время её значение несколько снизилось, еще попадаются случаи, когда производительность приложений сильно зависит от скорости и количества блоков ROP (см. технологические обзоры игр). Чаще всего это объясняется активным использованием фильтров постобработки и включенным антиалиасингом при высоких игровых настройках.
Нужно еще раз отметить, что современные видеочипы нельзя оценивать только числом разнообразных блоков и их частотой. Каждая серия GPU использует новую архитектуру, в которой исполнительные блоки сильно отличаются от старых, да и соотношение количества разных блоков может отличаться. Компания ATI первой применила архитектуру, в которой количество блоков пиксельных шейдеров было в разы больше числа блоков текстурирования. Это было сделано немного преждевременно, на наш взгляд, но в некоторых приложениях пиксельные блоки используются более активно, чем остальные и для таких приложений подобное решение будет неплохим вариантом, не говоря уже о будущем. Также, в предпоследней архитектуре AMD(ATI) нет отдельных пиксельных конвейеров, пиксельные процессоры не «привязаны» к блокам TMU. Впрочем, у NVIDIA в GeForce 8800 получилось еще сложнее...
Рассмотрим ситуацию на примере видеокарт GeForce 7900 GT и GeForce 7900 GS. Обе они имеют одинаковые рабочие частоты, интерфейс памяти и даже одинаковый видеочип. Но модификация 7900 GS использует GPU с 20 активными блоками пиксельных шейдеров и текстурных блоков, а видеокарта 7900 GT — по 24 блока каждого типа. Рассмотрим разницу в производительности этих двух решений в игре Prey:
Разница в количестве основных исполнительных блоков в 20% дала разный прирост скорости в тестовых разрешениях. Значение 20% оказалось недостижимо потому, что производительность в Prey не ограничена на этих видеокартах только скоростью блоков TMU и ROP. Разница в разрешении 1024x768 составила меньше 8%, а в более высоких достигла 12%, что ближе к теоретической разности в количестве исполнительных блоков.
Объем видеопамяти
Собственная память используется видеочипами для хранения необходимых данных: текстур, вершин, буферов и т.п. Казалось бы, что чем её больше — тем лучше. Но не всё так просто, оценка мощности видеокарты по объему видеопамяти — это наиболее распространенная ошибка! Значение объема памяти неопытные пользователи переоценивают чаще всего, используя его для сравнения разных моделей видеокарт. Оно и понятно — раз параметр, указываемый во всех источниках одним из первых, в два раза больше, то и скорость у решения должна быть в два раза выше, считают они. Реальность же от этого мифа отличается тем, что рост производительности растет до определенного объема и после его достижения попросту останавливается.
В каждой игре есть определенный объем видеопамяти, которого хватает для всех данных, и хоть 4 ГБ туда поставь — у нее не появится причин для ускорения рендеринга, скорость будут ограничивать исполнительные блоки, о которых речь шла выше. Именно поэтому почти во всех случаях видеокарта с 320 Мбайт видеопамяти будет работать с той же скоростью, что и карта с 640 Мбайт (при прочих равных условиях). Ситуации, когда больший объем памяти приводит к видимому увеличению производительности, существуют, это очень требовательные игры в высоких разрешениях и при максимальных настройках. Но такие случаи весьма редки, поэтому, объем памяти учитывать нужно, но не забывая о том, что выше определенного объема производительность просто не растет, есть более важные параметры, такие как ширина шины памяти и ее рабочая частота. Подробнее о выборе объема видеопамяти читайте во второй части статьи.
Ширина шины памяти
Ширина шины памяти является важнейшей характеристикой, влияющей на пропускную способность памяти (ПСП). Большая ширина позволяет передавать большее количество информации из видеопамяти в GPU и обратно в единицу времени, что положительно влияет на производительность в большинстве случаев. Теоретически, по 128-битной шине можно передать в два раза больше данных за такт, чем по 64-битной. На практике разница в скорости рендеринга хоть и не достигает двух раз, но весьма близка к этому во многих случаях с упором в пропускную способность видеопамяти.
Современные видеокарты используют разную ширину шины: от 64 до 512 бит, в зависимости от ценового диапазона и времени выпуска конкретной модели GPU. Для low-end видеокарт чаще всего используется 64- и (значительно реже) 128-бит, для среднего уровня 128-бит и иногда 256-бит, ну а high-end видеокарты используют шины от 256 до 512 бит шириной.
Частота видеопамяти
Еще одним параметром, влияющим на пропускную способность памяти, является её тактовая частота. А как мы поняли выше, повышение ПСП прямо влияет на производительность видеокарты в 3D приложениях. Частота шины памяти на современных видеокартах бывает от 500 МГц до 2000 МГц, то есть может отличаться в четыре раза. И так как ПСП зависит и от частоты памяти и от ширины ее шины, то память с 256-битной шиной, работающая на частоте 1000 МГц, будет иметь большую пропускную способность, по сравнению с 1400 МГц памятью с 128-битной шиной.
Рассмотрим относительную производительность видеокарт с разной пропускной способностью на примере видеокарт RADEON X1900 XTX и RADEON X1950 XTX, которые используют почти одинаковые GPU с одними характеристиками и частотой. Основные их отличия состоят в типе и частоте используемой памяти — GDDR3 на частоте 775(1550) МГц и GDDR4 на 1000(2000) МГц, соответственно.
Хорошо видно, как отстает карта с меньшей пропускной способностью памяти, хотя разница никогда не достигает теоретических 29%. Разница между достигнутой частотой кадров растет с увеличением разрешения, начинаясь с 8% в 1024x768 и достигая 12-13% в максимальных режимах. Но это сравнение видеокарт с небольшой разницей в ПСП, а особенное внимание на параметры ширины шины памяти и частоты ее работы следует уделять при покупке недорогих видеокарт, на многие из которых ставят лишь 64-битные интерфейсы, что сильно сказывается на их производительности. Вообще, покупка решений на базе 64-бит шины для игр вовсе не рекомендуется.
Типы памяти
На видеокарты устанавливают несколько различных типов памяти. Старую SDR память с одинарной скоростью передачи мы рассматривать не будем, её уже почти нигде не встретишь. Все современные типы памяти DDR и GDDR позволяют передавать в два раза большее количество данных на той же тактовой частоте за единицу времени, поэтому цифру её рабочей частоты зачастую указывают удвоенной (умножают на два). Так, если для DDR памяти указана частота 1400 МГц, то эта память работает на физической частоте в 700 МГц, но указывают так называемую «эффективную» частоту, то есть ту, на которой должна работать SDR память, чтобы обеспечить такую же пропускную способность.
Основное преимущество DDR2 памяти заключается в возможности работы на больших тактовых частотах, а соответственно — увеличении пропускной способности по сравнению с предыдущими технологиями. Это достигается за счет увеличенных задержек, которые, впрочем, не так важны для видеокарт. Первой платой, использующей DDR2 память, стала NVIDIA GeForce FX 5800 Ultra. По сути, на ней стояла GDDR2 память, которая не настоящая DDR2, а нечто среднее между технологиями DDR и DDR2. После применения GDDR2 в серии GeForce FX 5800, последующие видеокарты NVIDIA использовали DDR память, но эта память получила дальнейшее распространение в GeForce FX 5700 Ultra и в некоторых более поздних mid-end видеокартах. С тех пор технологии графической памяти продвинулись дальше, был разработан стандарт GDDR3, который близок к спецификациям DDR2, с некоторыми изменениями, сделанными специально для видеокарт.
GDDR3 — это специально предназначенная для видеокарт память, с теми же технологиями, что и DDR2, но с улучшениями характеристик потребления и тепловыделения, что позволило создать микросхемы, работающие на более высоких тактовых частотах. И опять же, несмотря на то, что стандарт был разработан в ATI, первой видеокартой, ее использующей, стала вторая модификация NVIDIA GeForce FX 5700 Ultra, а следующей стала GeForce 6800 Ultra.
Ну а GDDR4 — это последнее поколение "графической" памяти, работающее почти в два раза быстрее, чем GDDR3. Основными отличиями GDDR4 от GDDR3, существенными для пользователей, являются в очередной раз повышенные рабочие частоты и сниженное энергопотребление. Технически, память GDDR4 не сильно отличается от GDDR3, это дальнейшее развитие тех же идей. Первыми видеокартами с чипами GDDR4 на борту стали RADEON X1950 XTX, а у компании NVIDIA продукты на базе этого типа памяти еще не вышли. Преимущества новых микросхем памяти перед GDDR3 в том, что энергопотребление модулей может быть примерно на треть ниже. Это достигается за счет более низкого номинального напряжения для GDDR4.
Итак, видеопамять самых современных типов: GDDR3 и GDDR4, отличается от DDR некоторыми деталями, но также работает с удвоенной передачей данных. В ней применяются некоторые специальные технологии, позволяющие поднять частоту работы. Так, GDDR2 память обычно работает на более высоких частотах, по сравнению с DDR, GDDR3 — на еще более высоких, ну а GDDR4 обеспечивает максимальную частоту и пропускную способность.
2. Классификация разъемов на видеокартах
Первое препятствие к повышению быстродействия видеосистемы — это интерфейс передачи данных, к которому подключён видеоадаптер. Как бы ни был быстр процессор видеоадаптера, большая часть его возможностей останется незадействованной, если не будут обеспечены соответствующие каналы обмена информацией между ним, центральным процессором, оперативной памятью компьютера и дополнительными видеоустройствами. Основным каналом передачи данных является, конечно, интерфейсная шина материнской платы, через которую обеспечивается обмен данными с центральным процессором и оперативной памятью. Самой первой шиной использовавшейся в IBM PC была XT-Bus, она имела разрядность 8 бит данных и 20 бит адреса и работала на частоте 4,77 МГц. Далее появилась шина ISA (Industry Standart Architecture — архитектура промышленного стандарта), соответственно она имела разрядность 16/24 бит и работала на частоте 8 МГц. Пиковая пропускная способность составляла чуть больше 5,5 МиБ/с. Этого более чем хватало для отображения текстовой информации и игр с шестнадцатицветной графикой. Дальнейшим рывком явилось появление шины MCA (Micro Channel Architecture) в новой серии компьютеров PS/2 фирмы IBM. Она уже имела разрядность 32/32 бит и пиковую пропускную способность 40 МиБ/с. Но то обстоятельство, что архитектура MCI являлась закрытой (собственностью IBM), побудило остальных производителей искать иные пути увеличения пропускной способности основного канала доступа к видеоадаптеру. И вот, с появлением процессоров серии 486, было предложено использовать для подключения периферийных устройств локальную шину самого процессора, в результате родилась VLB (VESA Local Bus — локальная шина стандарта VESA). Работая на внешней тактовой частоте процессора, которая составляла от 25 МГц до 50 МГц и имея разрядность 32 бит, шина VLB обеспечивала пиковую пропускную способность около 130 МиБ/с. Этого уже было более чем достаточно для всех существовавших приложений, помимо этого возможность использования её не только для видеоадаптеров, наличие трёх слотов подключения и обеспечение обратной совместимости с ISA (VLB представляет собой просто ещё один 116 контактный разъём за слотом ISA) гарантировали ей достаточно долгую жизнь и поддержку многими производителями чипсетов для материнских плат и периферийных устройств, даже несмотря на то, что при частотах 40 МГц и 50 МГц обеспечить работу даже двух устройств подключенных к ней представлялось проблематичным из-за чрезмерно высокой нагрузки на каскады центрального процессора (ведь большинство управляющих цепей шло с VLB на процессор напрямую, безо всякой буферизации). И всё-таки, с учётом того, что не только видеоадаптер стал требовать высокую скорость обмена информацией, и явной невозможности подключения к VLB всех устройств (и необходимостью наличия межплатформенного решения, не ограничивающегося только PC), была разработана шина PCI (Periferal Component Interconnect — объединение внешних компонентов) появившаяся, в первую очередь, на материнских платах для процессоров Pentium. С точки зрения производительности на платформе PC всё осталось по-прежнему — при тактовой частоте шины 33 МГц и разрядности 32/32 бит она обеспечивала пиковую пропускную способность 133 МиБ/с — столько же, сколько и VLB. Однако она была удобнее и, в конце концов, вытеснила шину VLB и на материнских платах для процессоров класса 486.
С появлением процессоров Intel Pentium II и серьёзной заявкой PC на принадлежность к рынку высокопроизводительных рабочих станций, а также с появлением 3D-игр со сложной графикой стало ясно, что пропускной способности PCI в том виде, в каком она существовала на платформе PC (обычно частота 33 МГц и разрядность 32 бит), скоро не хватит на удовлетворение запросов системы. Поэтому фирма Intel решила сделать отдельную шину для графической подсистемы, несколько модернизировала шину PCI, обеспечила новой получившейся шине отдельный доступ к памяти с поддержкой некоторых специфических запросов видеоадаптеров и назвала этоAGP (Accelerated Graphics Port — ускоренный графический порт). Разрядность шины AGP составляет 32 бит, рабочая частота 66 МГц. Первая версия разъёма поддерживала режимы передачи данных 1x и 2x, вторая — 4x, третья — 8x. В этих режимах за один такт передаются соответственно одно, два, четыре или восемь 32-разрядных слов. Версии AGP не всегда были совместимы между собой в связи с использованием различных напряжений питания в разных версиях. Для предотвращения повреждения оборудования использовался ключ в разъёме. Пиковая пропускная способность в режиме 1x — 266 МиБ/с. Выпуск видеоадаптеров на базе шинах PCI и AGP на настоящий момент ничтожно мал, так как шина AGP перестала удовлетворять современным требованиям для мощности новых ПК, и, кроме того, не может обеспечить необходимую мощность питания. Для решения этих проблем создано расширение шины PCIE — PCI Express версий 1.0, 1.1 и 2.0. Это последовательный, в отличие от AGP, интерфейс, его пропускная способность может достигать нескольких десятков ГБ/с. На данный момент произошёл практически полный отказ от шины AGP в пользу PCI Express. Однако стоит отметить, что некоторые производители до сих предлагают достаточно современные по своей конструкции видеоплаты с интерфейсами PCI и AGP — во многих случаях это достаточно простой путь резко повысить производительность морально устаревшего ПК в некоторых графических задачах.
3. Назначение библиотеки DirectX и OpenGl
Многие годы в программистском сообществе идет дискуссия о преимуществах использования того или иного интерфейса для создания графики в компьютерных играх (и не только). Главные соперники в этой области – библиотеки OpenGL и DirectX.
Индустрия до сих пор так и не сделала однозначный выбор в пользу того или иного API. Для тех, кто не знает: API – это Application Programming Interface, то есть интерфейс прикладного программирования. Фактически – набор функций для выполнения различных задач. В нашем случае задача – это программирование трехмерной графики.
КАК ЭТО БЫЛО
OpenGL
Стандарт OpenGL (Open Graphics Library – открытая графическая библиотека) был создан и утвержден в 1992 году ведущими фирмами в области разработки программного обеспечения как эффективный аппаратно-независимый интерфейс, пригодный для реализации на различных платформах. Основой стандарта стала библиотека IRIS GL, изначально разработанная фирмой Silicon Graphics Inc (SGI). OpenGL была утверждена как открытый стандарт (не open source, как некоторые думают) и поэтому библиотека доступна на многих платформах.
Библиотека не может быть разработана раз и навсегда – она должна развиваться, отражая последние тенденции в области компьютерной графики, особенно эволюцию специализированных устройств (видеокарт) с аппаратной поддержкой графических функций.
Развитие стандарта OpenGL осуществляется специальной бюрократической структурой, известной как Architectural Review Board (ARB) – Комитет по пересмотру архитектуры. Комитет состоит из представителей основных компаний, заинтересованных в развитии и использовании библиотеки. В их числе 3D Labs, SGI, Apple, NVIDIA, ATI, Intel, id Software и, конечно, Microsoft.
Кстати, Microsoft поставляет реализацию OpenGL вместе со своими операционными системами. Она соответствует одной из ранних версий OpenGL и не использует возможности аппаратного ускорения. Этот недостаток восполняют драйверы видеокарт, которые предоставляют быстрые реализации OpenGL.
C начала 90-х годов прошлого века OpenGL используется в различных областях индустрии и науки. Архитектура библиотеки получилась настолько удачной, что уже на протяжении более десяти лет она остается стабильной и предсказуемой. OpenGL де-факто является стандартом в области программирования графики. Но в этом скрыт и ее недостаток. ARB работает довольно медленно – любое изменение стандарта требует множества согласований, документов и так далее.
В силу этого OpenGL развивается очень вяло. Правда, до последнего времени с этим не было проблем, поскольку изначально библиотека предназначалась для быстрых рабочих станций профессионального уровня, которые обновляют не так уж часто. Однако сейчас даже дешевые видеокарты за $100 превзошли уровень профессиональных монстров пятилетней давности стоимостью в тысячи долларов.
И при этом обновление их возможностей происходит в среднем раз в год. Фактически OpenGL не поспевает за индустрией, поэтому игровые разработчики вынуждены использовать так называемый механизм расширений (extensions), чтобы получить доступ к новейшим функциям видеокарт.
На данный момент OpenGL прошла путь от версии 1.0 до версии 1.4 (и это за десять лет!). Версия 2.0, обещающая революционные изменения, находится в процессе стандартизации.
DirectX
К моменту выхода Windows 95 большинство игр по-прежнему делалось под MS-DOS. Windows в те времена не предоставляла возможностей для программирования игр. Многочисленные уровни абстракции (введенные в целях совместимости и универсальности) делали доступ к звуковому и видеооборудованию весьма медленным и неприменимым для игровых приложений. Поэтому было решено разработать библиотеку, предоставляющую возможность прямого доступа к аппаратуре. Это позволило бы играм работать на приемлемой скорости (и увеличило бы продажи Windows 95).
Вместо создания собственного API Microsoft использовала разработку небольшой компании RenderMorphic. Говорят, что изначально API был выполнен авторами в рамках студенческого задания и в конечном итоге провалился на экзамене. Тем не менее Microsoft интегрировала эту библиотеку в свой Game SDK. Корпорация подавала это как идеальное решение для программирования игр.
Однако то, что позже стало называться DirectX 1.0., не приобрело широкой популярности. Библиотека оказалась медленной, с большим количеством ошибок, с неудобной архитектурой и, кроме того, чрезмерно сложной.
Разумеется, Microsoft не собиралась сдаваться и продолжила развитие библиотеки с учетом пожеланий разработчиков игр. Первой более или менее жизнеспособной версией была DirectX 3.0. Позже последовали версии 5, 6 и 7 (четвертой не было). Седьмая версия была воспринята разработчиками с интересом: она хорошо работала, ее интерфейсы были в меру разумны.
Восьмая версия не заставила себя ждать и принесла интересные нововведения – вершинные и пиксельные шейдеры (специальные, обычно короткие программы, предназначенные для выполнения на графическом процессоре; используются для расчета освещения, создания тех или иных спецэффектов и так далее). Недавно вышедший DirectX 9 также развивает эти перспективные направления.
Длительное время DirectX рассматривался как неудачная альтернатива OpenGL. Однако последние улучшения в API сделали эту библиотеку весьма мощной и стабильной. Поскольку она разрабатывается авторами ОС, можно быть уверенным, что скорость ее работы с графикой оптимальна. Многие считают, что именно DirectX, а не OpenGL, становится стандартом для программирования графики. Microsoft постоянно работает в тесном контакте с разработчиками «железа», обеспечивая поддержку новых возможностей аппаратуры. Более того, DirectX иногда предлагает различные возможности раньше, чем на рынке появляются видеокарты с их аппаратной реализацией.
Мы рассматриваем только графическую часть DirectX, но кроме графики DirectX также предлагает интерфейсы для работы со звуком, источникам ввода, мультимедиа и так далее. У OpenGL таких функций нет – это чисто графическая библиотека.
АРХИТЕКТУРА
Ключевая особенность OpenGL – простота. Ядро OpenGL контролирует процесс обработки примитивов (то есть треугольников). Для передачи данных используется процедурная модель, фактически – вызовы функций. В каждый момент времени состояние OpenGL определяется через набор переменных, задающих параметры обработки (например, накладывать текстуру или не накладывать).
Каждый новый переданный треугольник проходит обработку в соответствии с текущим состоянием. Такой механизм весьма эффективен, а код обычно короток и прост. Хотя ядро OpenGL процедурное, в использовании OpenGL совместно с объектно-ориентированными технологиями сложностей обычно не возникает: все зависит от выбора программиста.
Структура DirectX очень сильно отличается от OpenGL. DirectX основан на модели COM (Component Object Model). Тем, кто знает, что это такое, сама аббревиатура уже скажет многое. Для остальных заметим лишь, что в отличие от простого вызова функций эта модель предполагает выполнение некоторых дополнительных действий, связанных с компонентной архитектурой DirectX.
Такая архитектура имеет как достоинства, так и недостатки. В частности, код, в котором используются вызовы DirectX, обычно не является идеалом легко читаемого и понимаемого. Поэтому даже рисование простого треугольника требует огромного объема кода. Разработчики Microsoft, конечно, понимают это, поэтому для упрощения программирования ими создана отдельная библиотека DirectX Common Files, которая скрывает часто используемый код.
Хотя принципиально архитектура DirectX сильно отличается от OpenGL, в их развитии все более заметны тенденции к сближению. Такая ситуация возникает прежде всего потому, что обе библиотеки предназначены для эффективной работы с аппаратурой, и чем ближе их структура будет к «железу», тем меньше времени будет уходить на преобразование команд пользователя в команды аппаратуры.
ПРОИЗВОДИТЕЛЬНОСТЬ
Вопрос производительности настолько же важен, насколько запутан и неясен. Дебаты на тему «Что быстрее – OpenGL или DirectX?» не утихают. При этом, как ни парадоксально, cкорость обоих библиотек одинакова.
Иначе и быть не может, потому что сейчас большинство функций реализованы напрямую через аппаратные ускорители. Естественно, производительность может различаться в зависимости от степени оптимизации программного кода и используемой для тестирования аппаратной платформы.
Оптимизация аппаратных драйверов тоже может внести свой вклад в преимущество той или иной библиотеки. Такие вещи достаточно тяжело предвидеть, поэтому хорошие игровые «движки» часто имеют две версии: под OpenGL и под DirectX. Это не очень-то хорошо как для производителя, так и для пользователя (возрастает стоимость разработки игр, появляются ошибки и т.п.), но таковы реалии современного рынка видеоигр.
Пример: считается, что драйверы от фирмы ATI для серии видеокарт ATI Radeon хорошо оптимизированы под DirectX и значительно слабее поддерживают OpenGL. Однако специально написанные тесты не выявили значительной разницы в скорости работы программ. Кроме того, на недавней Конференции разработчиков игр (КРИ, www.kriconf.ru) автору довелось побеседовать на эту тему с представителем ATI. Точка зрения последнего такова: если драйверы OpenGL у ATI и хуже, чем у NVIDIA, то это лишь вопрос времени – ATI обязательно будет в поддерживать OpenGL в полном объеме.
СРАВНЕНИЕ
В чем же, если не в производительности, различие между библиотеками? Прежде всего – в удобстве интерфейса, функциях, гибкости, перспективах развития и области применения. Начнем с функций. Неоднократно приходилось слышать заявления типа: «DirectX 9 поддерживает пиксельные шейдеры, а OpenGL не поддерживает, поэтому все игры должны быть написаны под DirectX!» Такое мнение неверно только отчасти. Действительно, если посмотреть на стандарт OpenGL последней версии (1.4), в нем ни слова о шейдерах.
Изображение, получаемое в реальном времени на современном аппаратном ускорителе. Качество и скорость рисования не зависят от применяемой библиотеки: DirectX и OpenGL обладают схожими возможностями.
Много лет назад OpenGL разрабатывалась как библиотека, которая оставалась бы актуальной в далеком будущем. К сожалению, это будущее пришло и благополучно ушло в прошлое. При этом ARB остается весьма неповоротливым, и надеяться на оперативное включение новых опций не позволяет. Для решения этой проблемы в OpenGL существует механизм расширений, с помощью которого можно использовать различные функции, не входящие в базовую спецификацию, а поддерживаемые только реализацией OpenGL для конкретной видеокарты.
Этот процесс выглядит следующим образом: как только производитель выпускает видеокарту с поддержкой определенной полезной функции, он включает ее в свою реализацию OpenGL (которая обычно входит в поставку драйвера). Для программиста эта возможность становится доступной, если он специальным образом запросит данное расширение. Конечно, такой путь не универсален: на другой видеокарте сделать это не получится из-за различий в интерфейсе. Поэтому существуют расширения, одобренные ARB, – при их использовании можно надеяться, что они будут работать на видеокартах различных производителей. Такие расширения являются кандидатами на включение в последующие версии OpenGL.
Данный механизм выглядит (и на самом деле является) неудобным. В DirectX все проще: функциональность либо поддерживается данной версией библиотеки, либо не поддерживается. Если нет – придется надеяться и ждать следующей версии. Однако случаи, когда аппаратные функции не используются из-за того, что не были включены в версию DirectX, довольно редки – как уже говорилось, Microsoft тесно работает с производителями игрового (и не только) «железа». С другой стороны, ждать версий DirectX приходится около года, а в это время новые функции уже доступны через расширения OpenGL.
Таким образом, по поддержке аппаратных функций OpenGL и DirectX , в общем, эквиваленты. OpenGL новые функции доступны через механизм расширений, а в DirectX они появляются только в новых версиях.
DirectX очень удобен для любителей объектно-ориентированного программирования и COM в частности.
COM в DirectX используется для внесения изменений в библиотеку (в новых версиях) без изменения существующего кода. В OpenGL такого нет, но это вряд ли можно назвать серьезным недостатком.
Объем кода, необходимого для написания простой программы на DirectX, весьма велик (варьируется от 200 до 800 строк). Microsoft активно пытается уменьшить этот показатель, но он, тем не менее, достаточно велик. В OpenGL все существенно проще – для решения такой же задачи необходимо менее 50 строк кода.
OpenGL идеален для визуализации результатов научных исследований.
Серьезным достоинством OpenGL является прежде всего то, что это «открытый стандарт». Любая компания, имеющая аппаратную платформу, может купить лицензию у SGI и затем сделать собственную реализацию OpenGL. Изменения в OpenGL предлагаются, обсуждаются и утверждаются представителями различных компаний. Что касается DirectX, то здесь ситуация прямо противоположная. Только Microsoft может вносить какие-либо изменения в библиотеку. Иначе говоря, именно Microsoft в конечном итоге определяет все пути развития библиотеки, и если путь был выбран неверно, это может быть исправлено только в новой версии.
Итак, достоинства библиотек становятся наиболее очевидны при их использовании в разных (но в то же время пересекающихся) прикладных областях. DirectX идеален для профессиональной разработки игр и мультимедийных приложений на платформе Windows. OpenGL используется на высокопроизводительных рабочих станциях, в научной сфере, в образовании, а также в любых проектах, где требуется переносимость. Кроме того, OpenGL применяется и для написания игровых «движков», правда, в последнее время на этом поприще его теснит DirectX.
ЧТО ДАЛЬШЕ?
Появление графических процессоров (GPU – Graphics Processing Unit) нового поколения, позволяющих создавать доселе немыслимые спецэффекты в реальном времени, всколыхнуло индустрию, и вскоре стало ясно, что за ними будущее. Очевидно, что графические библиотеки должны соответствовать этой тенденции.
Начиная с восьмой версии, DirectX имеет встроенную поддержку программируемых шейдеров. В девятой версии эта поддержка была значительно улучшена и расширена. И в дальнейшем развитие DirectX наверняка будет связано с постепенным улучшением гибкости и удобства использования программируемого «железа». Каких-либо радикальных перемен пока не ожидается. Например, вряд ли стоит надеяться, что Microsoft сделает реализации DirectX на других платформах.
В OpenGL поддержка программируемой графической аппаратуры была добавлена на уровне расширений. Однако архитектура библиотеки изначально не была рассчитана на использование подобных конструкций, поэтому эти расширения выглядят инородно.
Игровые приложения чаще используют DirectX. Эта библиотека предоставляет больше возможностей для тонкой оптимизации и управления аппаратурой, а также, в отличие от OpenGL, содержит компоненты для работы с видео, звуком и устройствами ввода.
В то же время близится к завершению разработка нового стандарта библиотеки – OpenGL 2.0. Развитие графической аппаратуры вышло за пред
Дата добавления: 2016-05-30; просмотров: 4742;