Споредба на OpenGL и DirectX

Главната цел на оваа семинарска работа, како и што кажува самиот наслов е да се даде споредба на овие 2 API колекции, се со цел кога некој ќе сака да избере со која од овие 2 да работи, да има предвид што секоја од нив може да направи, како и тоа кои се предносите и недостатоците на секоја од нив.

Во минатото, се до појавата на поуспешните DirectX, а тоа е верзијата 8 па наваму, употребата на OpenGL била далеку поголема и DirectX бил во сенка на OpenGL. Оттогаш на наваму тоа е доста сменето, посебно со промената на политиката која започна да ја води Microsoft. Microsoft е практично монопол во светот во многу области на комјутерската технологија. Иако за тоа многу често бил казнуван, сепак политиката и поставеноста која ја има на тоа поле не е многу сменета. Веројатно една од причините поради кои форсирањето на ОpenGL е многу намалено и се повеќе се намалува е поголемата негова прифатеност помеѓу луѓето, како поради некои негови подобри карактеристика, така и поради фактот дека е бесплатен. Microsoft начинот на кој сака да го пробие на пазарот токму својот производ е прилилно нечесен. Саботирањето на OpenGL во полза на DirectX со оглед на влијанието кое го има Microsoft во голема мерка придонесе се помалку и помалку да се користи OpenGL. Освен тоа, последните изданија на OpenGL, OpenGL 3.0 и DirectX, DirectX 11 уште повеќе одат во корист на Microsoft. 3.0 целосно разочара и покрај неговото доцно појавување, до тој степен што не е доволно конкурентен ни со DirectX 10, а уште помалку со DirectX 11, кој иако не понуди ништо револуционерно сепак голем дел од проблемите со кој се соочува и кој ги содржи OpenGL 3.0 се веќе минато за DirectX.

Да ги споредиме DirectX и OpenGL во неколку категории.


Преносливост

DirectX e официјално имплементиран само на Microsoft Windows оперативните системи, вклучувајќи и вградени верзии употребени во Xbox во видеоигри итн. Неколку делумно функционални API од DirectX се направени и од Wine, проект во кои неколку Windows API се поврзуваат со Unix-like оперативни системи. ОpenGL има имплементации достапни за многу платформи вклучувајќи и Microsoft Windows, UNIX-базирани системи како Mac OS X, Linux, како и за PlayStation 3 играчки конзоли. Варијации на ОpenGL има и на Nintendo GameCube и Wii. OpenGL е избран како примарна графичка библиотека за iPhone, платформа за мобилни уреди) и Symbian OS. Слободно може да се каже дека со исклучок на Windows и Xbox, сите оперативни системи каде е дозволена хардверска забрзана 3D графика го користат ОpenGL како примарен 3D графички API. Леснотија при користење

DirectX

Првата верзија на DirectX беше проследена со голема критика бидејќи и при наједноставни операции, како промена на состојби, морало да се креираат објекти наречени “извршувачки бафери”. Колку за споредба во OpenGL тоа се правело со единствен функциски повик. Тоа фрустрирало многу програмери. Тоа отишло до тој степен што неколку познати личности како John Carmack и Chris Hecker побарале од самиот Microsoft да го користи OpenGL пред DirectX. Иако ова било сменето кај DirectX, сепак целото користење сѐ уште се сметало за недоволно лесно. Тоа се сменило во јануари 2007 со DirectX 9 кога многу работи еволуриле во вистински правец, така што веќе DirectX бил во најмала рака на исто ниво со OpenGL. Некои особини сепак останале исти, како на пример користењето на COM (Component Object Model), каде предност е тоа шео може да се користат сите објекти јазици, како C++, Delphi, C# и Visual Basic .NET.

OpenGL

OpenGL е спецификација базирана на програмскиот јазик C. Направен е по концептот на машина на состојби, иако во денешно време тоа е сменето со систем кој работи со објекти. Иако е изграден на основа на C, сепак може да биде имплементиран и во други јазици. Како API, OpenGL не е зависен од ниедно својство на некој програмски јазик и може да биде користен од секој јазик кој ги има соодветните и потребните карактеристики, а такви се VB, Ada, Pascal, Delphi, Python, Perl, Java, C# итн.


Споредба на двете API

Генерално DirectX е дизајниран да биде 3D посредник за хардвер. Сетот од опции што ги нуди DirectX е изведен од сетот од опции што самиот хардвер го дозволува. OpenGL од друга страна, е дизајнуран да биде 3D рендерирачки систем кој може хардверски да биде забрзан. И двете API се направени со сосема различна основа, така што фактот дека станале многу слични во функционалноста покажува како хардверот се развива во правец на што поголема функционалност за корисникот. Но, и покрај тоа, има многу разлики во начинот на кој работат. DirectX очекува апликацијата да ги управува хардверските ресурси, додека пак OpenGL прави имплементацијата да го прави тоа. Додека ова значи дека во OpenGL се намалува тешкотијата при развивањето на соодветното API од една страна, од друга страна значи дека се зголемува комлексноста при креирање на имплентација (или драјверот) која би требало да работи добро. Во DirectX, програмерот мора сам и независно да ги управува харверските ресурси, но сепак тука имплементацијата е поедноставна, така што програмерите на апликацијата ја имаат слободата да ги алоцираат ресурсите така што ќе биде најефективно за апликацијата. Друга функционална разлика која постоела се до 2005 година била и начинот на кој тие ги рендерирале текстурите. Освен некои другои поситни разлики, и двете API ја нудат истото ниво на функционалност.


Перформанси

Набрзо по формирањето на DirectX и OpenGL како графички библиотеки, Microsoft и SGI се вклучија во таканаречената “Војна на API”. Најголемиот судир бил во тоа кој нудел подобар перформанс во работата. Прашањето било многу битно бидејќи графичките акцелератори биле многу скапи во тоа време, што значело дека клиентите користеле софтверски рендери имплементирани од Microsoft и за DirectX и за OpenGL.

Во почетокот, Microsoft го рекламирал DirectX како побрз API. Но тоа се сменило во 1996 година кога SGI сами издале софтверска имплементација на OpenGL во Windows, со што ја достигнале па можеби и надминале истата на Microsoft. Со тоа покажале дека причината поради која не можело OpenGL да го достигне DirectX е во имплементацијата што ја нудел Microsoft, а не во самиот OpenGL. Сепак рендерирањето од 3D API и не било толку важно со тек на време, бидејќи сето тоа било правено на друг начин.

Многу поголема разлика во перформансот настанала поради структурата на хардверските драјвери направени од развивачите на хардвер. Во DirectX, IHV драјверите се kernel-mode драјвери инсталирани во оперативниот систем. Корисничкиот дел на API-то е управуван од софтверот на DirectX кој е направен од Microsoft. Во OpenGL, IHV драјверот е поделен на двата дела на следниов начин: 1. Кориснички дел кој го имплентира OpenGL API 2. Кernel-mode драјвер кој се повикува од корисничкиот дел.

Причината поради која ова е проблем е тоа што kernel-mode операциите од корисничкиот дел бараат извршување на системски повик, што значи промена на CPU во kernel-mode. Ова е бавен процес во времетраење од неколку микросекунди за да се комплетира и во тоа време процесорот е оневозможен да прави какви било други операции. На ова следува дека системската оптимизација би била намалување на бројот на овие системски повици. На пример, доколку командниот бафер на графичката процесирачка единица е полн со податоци, API-тo да може да да ги смести рендерирачките повици во некој привремен бафер, така што кога командниот бафер би бил празен, сите повици што се во привремениот да се повикаат оддеднаш и само еднаш да се повика да се направи таа промена во kernel-mode. Со оглед на тоа дека двата дела на секој API кај DirectX не се во рацете на IHV драјверот, овој процес и оптимизација не е можен кај DirectX, што не е случај со OpenGL, каде само во најлошиот случај времетраењето е подеднакво исто со DirectX, а во сите други случаи е побрзо. Дури во DirectX 10, изданието компатибилно со Windows Vista е овозможено тоа, така што DirectX не заостанува повеќе во однос на OpenGL.


Структура

OpenGL, оригинално дизајниран за тогашните моќни SGI работни станици, вклучува голем број на карактеристики, како стерео рендерирање и “подсетови од слики”, кои се од ограничена корист за игри. Целото API како целина има околу 250 функции, од кои помала колекција од околу 100 се користат за правење на игри. Сепак, досега официјално нема специфицирано подсет од функции само за игри, иако MiniGL кој се користел за glQuake, би можело да биде нешто што би се користело како пример, иако неколку додатни функции како stencil (сито, матрица) биле подоцна усвоени за игри и подршката за целиот OpenGL стандард продолжила. Денес работните станици и клиентските машини ја користат истата архитектура и оперативни системи, и модерните верзии на OpenGL сѐ уште ги користат некои од тие опции, иако само специјална класа на видео карти во работните станици ги забрзуваат нив.


Екстензии

Механизмот за наставка кај OpenGL е веројатно најголемата разлика што постои помеѓу овие две API. OpenGL има таков механизам каде секој драјвер може да биде вклучен со свои наставки на API-то, и со тоа воведувајќи нови функционалности како блендирање, нови начини на префрлување податоци до графичката процесирачка единица, како и други начини на поврзување со текстури. Ова дозволува од една страна тие да бидат применети брзо, но од друга страна може да доведе до конфузија ако различни производители имплементираат слични проширувања со различни API. Поради тоа голем дел од овие екстензии, проширувања периодично се стандардизираат од OpenGL Architecture Review Board (ARB), така што голем дел се и ќе бидат јадрото на идните OpenGL верзии. Од друга страна, DirectX е специфициран само за еден производител (Microsoft), што води до далеку поконзистентен API, но го спречува влезот на некои опции кои се специфицирани од некој друг производител. На пример, ултра-сенка технологијата (за покомлексни и пореални сенки) на NVIDIA не е достапна во пакетот опции кој ги нуди DirectX. DirectX дозволува само наставки за форматирање на текстури (преку FourCC). Кога на графичките картички беше додадена подршка за pixel shaders (додавање на 3D сенки и светлечки ефекти на пикселите) (во OpenGL познато како фрагментирани програми), DirectX издаде единствен “Pixel Shader 1.1” (PS1.1) стандард кој е компатибилен со сите верзии понови од GeForce 3 и Radeon 8500. Истото ова во OpenGL е овозможено со варијација од неколку екстензии.

Во теорија, пристапот на Microsoft дозволува еден пат да е доволен за подршка на двата типа картици, додека програмер на OpenGL мора тоа да го напише за два различни системи. Сепак во целина земено тоа и не било многу поразлично и предноста не била воопшто значајна. Оваа ситуација за среќа и не траела многу долго, бидејќи втората генерација на pixel shading картици биле многу послични во функционалноста, со секоја архитектура еволуирајќи кон истиот тип на процесирање на пиксели. Како таков, Pixel Shader 2.0 дозволил унифициран пат во кодот во DirectX. Во речиси исто време OpenGL ги претстави наставките за точкаст и pixel shader, така што и двата типа на графички картици се компатибилни со овој стандард.