یک بازی کامپیوتری را روی کامپیوترتان اجرا میکنید. فعلاً کارت گرافیک شما روی اسلاتAGP سوار میشود، پردازشگر سلرون دارید و ... پس از چند ماه یا چند سال کامپیوتر جدیدی میخرید. اکنون اسلات کارت گرافیکی شما PCI Express است و یک پردازشگر 64 بیتی دارید. همان بازی را روی این کامپیوتر هم نصب و اجرامیکنید! شاید به نظر طبیعی میآید که همه چیز باید همینطور باشد. اما چگونه یک بازی روی کامپیوترهایی با تراشهها و سختافزارهای مختلف و گاه فناوری متفاوت اجرا میشود؟ APIهای گرافیکی یا همان رابطهای برنامهنویسی، بخش بزرگی از این مشکل را حل میکنند و امکانات گسترده دیگری را نیز در اختیار برنامهنویسان و توسعهدهندگان بازی و برنامههای چندرسانهای قرارمیدهند. OpenGL وDirectX، دو مجموعه API گرافیکی و صوتی هستند که برای آسانتر ساختن توسعه بازیها و نرمافزارهای چندرسانهای طراحی شدهاند.
API گرافیکی چیست؟
API درواقع بین برنامه و سختافزاری که برنامه روی آن اجرا میشود، نقش یک هماهنگکننده را دارد و مانند پلی میان سختافزار و نرمافزار ارتباط ایجادمیکند. یعنی برنامهنویس کدهایی مینویسد که دادههای گرافیکی خود را به وسیله دستورهای استانداردی به درایور API میفرستد نه مستقیماً به خود سختافزار. سپس درایوری که شرکت سازنده سختافزار تولیدکرده است، این کداستاندارد تولیدشده را به فرمت بومی و ویژهای که برای آن مدل خاص سختافزار قابل شناسایی است، ترجمه میکند.
Microsoft DirectX
شرکت مایکروسافت در سال 1995 DirectX را ساخته و توسعه دادهاست. این نرمافزار شامل مجموعه یکپارچهای از ابزارهای برنامهنویسی است که به توسعهدهندگان امکان میدهد انواع مختلف نرمافزارهای مالتیمدیا را روی پلتفرم ویندوز تولید کنند. DirectX به برنامهای که بر پایه آن طراحی شده امکان میدهد به آسانی قابلیتهای سختافزار کامپیوتر را شناسایی کند و پارامترهای برنامه را با آن هماهنگ سازد.
DirectX شامل APIهایی است که دسترسی به بخشهای ویژهای از سختافزار مانند تراشههای شتابدهنده گرافیک سهبعدی و کارت صوتی را میسرمیکند. این APIها کنترل توابع سطح پایین، یعنی نزدیک به سختافزار، شامل شتابدهنده گرافیکی دو بعدی، پشتیبانی از دستگاههای ورودی مانند دسته بازی، صفحهکلید و ماوس، و کنترل میکس و خروجی صدا را انجام میدهند.
DirectX 7.0 در سال 1999 با شش کامپوننت عرضه شد که عبارت بودند از: Direct3D،DirectDraw ،DirectSound ،DirectPlay ،DirectInput و DirectMusic.
در اواخر سال 2000 میلادی، DirectX 8.0 عرضه شد که در آن کامپوننتهای DirectSound و DirectMusic با هم ادغام شدند و با نام کامپوننت Direct Audio معرفی شدند.
Direct3D و DirectDraw نیز با هم ادغام شدند و یک کامپوننت با نام DirectX Graphics را ساختند. DirectShow نیز به صورت یک API جداگانه پیادهسازی شد و به یکی از کامپوننتهای DirectX تبدیل گردید.
DirectX 9.0 در ژانویه سال 2003 عرضه شد. ویژگیهای خاص این نسخه عبارتند از:
- قابلیتهای صوتی جدید در DirectSound
- سختافزار رندرکننده ویدیویی با شتاب بیشتر
- بهبود قابلیت برنامهریزی گرافیکی
APIهای همه کامپوننتهای DirectX برپایه COM یا Component Object Model هستند. در ادامه به بررسی هفت کامپوننت DirectX 9.0 میپردازیم که عبارتند از: DirectDraw ،Direct3D ،DirectShow ،DirectSound ،DirectMusic ،DirectInput و DirectPlay.
DirectDraw
DirectDraw، کامپوننتی ویژه طراحی دوبعدی است که به برنامهنویس اجازه میدهد مستقیماً به حافظه کارت گرافیک دسترسی یابد، صحنهها و فریمها را با هم ترکیب نماید یا bitmapها را در آنجا ذخیره کند. همچنین، برای برنامهها امکان دسترسی به سختافزارهای ویژه نمایش را مستقل از نوع سختافزار فراهم میکند.
هر برنامه کاربردی DirectDraw الگوی یکسانی دارد که عبارت است از:
- ایجاد یک شی
- شروع حلقه
- انتقال به مانتیور
- پایان حلقه
- پاک کردن آن شی
منظور از واژه <یک شی> میتواند هر تصویر دوبعدیای باشد و منظور از حلقه، حلقهای است که در برنامهنویسی هنگام تکرار منظم دستهای از دادهها یا دستورها به کار میبریم. تصویر ایجادشده پس از مدتی پاک میشود و جای خود را به تصویر دیگری میدهد.
2- Direct3D
این کامپوننت، دسترسی به توابع رندرکننده گرافیک سهبعدی تعبیه شده در بیشتر کارتهای گرافیک را فراهم میکند. Direct3D یک API سطح پایین سهبعدی است که به نرمافزار امکان میدهد مستقل از سختافزار، با سختافزار شتابدهنده ارتباط برقرار کند. لایهای که برای توسعهدهندگان بازی و گرافیک کامپیوتری امکان طراحی و ساخت بازیها را مستقل از سختافزار کامپیوترها فراهم میکند، لایهای به نام
Hardware Abstraction Layer) HAL) است.
HAL با قابلیتهایی که به صورت گسترده در سختافزارهای گرافیک سهبعدی پیادهسازی شدهاند ارتباط ایجاد میکند و به سازندگان امکانمیدهد درایورهایی را تولید کنند که لایه HAL را به سختافزار پیوند دهد. این کار باعث میشود برنامههای کاربردی Direct 3D بدون اینکه برای نوع خاصی از قطعه سختافزاری نوشته شده باشد، از ویژگیهای بخشهای خاص آن قطعه سختافزاری بهرهببرد. در شکل یک چگونگی ارتباط لایه HAL با سختافزار و نرمافزارهای مرتبط نشان داده شده است.
در سیستم رندر Direct3D، ساختار اشیای سهبعدی پیش از آنکه شتابدهنده سهبعدی، یک صحنه سهبعدی را رندر نماید و آن را به مانیتور منتقل کند، به وسیله CPU پردازش میشود. نسخه ششم کامپوننت Direct3D از قابلیتهای کارتهای گرافیک جدیدتر پشتیبانی مینماید و در هر گذر، چندین بافت را با هم رندر میکند.
کاهش زمان رندر به استفاده از نقشه بافتها نیاز دارد. این نسخه تکنیکهایی برای افزودن جلوهای واقعیتر به صحنههای سه بعدی را نیز دربردارد.
مانند anistropic filtering که عنصر عمق را به trilinear filtering و نقشه برجستهسازی میافزاید که موجب ایجاد شباهت بیشتر بافتها و نیز منابع نور تابیده شده بر سطوح مسطح با نمونههای واقعی آنها میشود.
نسخه هفتم DirectX نسبت به نسخههای پیش از خود بیست درصد سریعتر و شامل چند ویژگی دیگر بود. مهمترین آنها پشتیبانی از تغییرات شتاب سختافزاری و نوردهی (T&L) به وسیله اغلب کارتهای گرافیک سهبعدی آنزمان به ویژه کارتهایی است که برپایه تراشههای nVidia Geforce 256 و S3 Savage 2000 ساخته شدهاند. از زمانی که T&L عرضه شد، وقتگیرترین وظیفه CPU هنگام اجرای بازیهای پیشرفته به شتابدهنده سهبعدی داده شد و بخش بزرگی از ظرفیت پردازنده اصلی به کارهای دیگر مانند هوشمصنوعی بازی اختصاص داده شد و توسعهدهندگان بازی توانستند رندر را با جزئیات بیشتر انجام دهند و جلوههای ویژه پیچیدهتری را در بازیها بهکار ببرند.
3- DirectShow
این کامپوننت از بسیاری از فرمتهای صوتی و ویدیویی شامل AVI ،MPEG ،ASF ،WMA/WMV ،DV و MP3 و DirectX پشتیبانی میکند و روی ویندوزهای 98، 2000، اکسپی و نرمافزار اینترنت اکسپلورر عرضه شده است.DirectShow پروسه کارهای مالتیمدیا مانند نمایش فایل ویدیویی را به مجموعهای از مراحل که با نام
filter شناخته میشوند تقسیم میکند.
ها تعدادی pin ورودی و خروجی دارند که آنها را به هم متصل میکند. طراحی کلی سازوکار اتصال به این صورت است که ها میتوانند به روشهای مختلف به هم متصل شوند که هر نوع از این اتصالها به معنی انجام دادن یک کار است و توسعهدهندگان نرمافزار میتوانند افکتهای خود یا های دیگری را به بخشی از این گراف برای انجام کار ویژهای بیفزایند. گراف DirectShow به صورت گسترده در ضبط صدا و فیلم، و ویرایش آنها به کار میرود.
دادههای چند رسانهای در این گراف (در حالی که کارها به وسیله برنامه کاربردی کنترل میشوند) از فایل منبع به سمت مقصد که میتواند یک قطعه سختافزاری باشد حرکت میکنند.
ولی در برخی مواقع، برنامه کاربردی علاوه بر کنترل گراف، دریافتکننده یا فرستنده داده نیز هست.
هر گره این گراف، همانگونه که گفته شد، یک است و کار ویژه خود را انجام میدهد. source، دادهها را از یک فایل یا URL میخواند. Parser، بخشهایی از دادههای صوتی و ویدیویی را به رمزگشای مناسب میفرستد. رمزگشاها، دادههای صوتی و ویدیویی را رمزگشایی مینمایند یا از حالت فشردگی خارج میکنند.
رندرکننده، دادههای دریافت شده صوتی و ویدیویی از رمزگشا را پخش میکند یا آنها را نمایش میدهد.
4- DirectSound
این کامپوننت همزمان با ساخت ویندوز 95، زمانی که درایورهای صوتی از نوع VXD بودند به DirectX افزوده شد. در این کامپوننت APIهای ویژهای ایجاد شد که نویسندگان درایورهای صوتی میبایست آنها را به محصولات خود، که فرمت VXD داشت، میافزودند تا به درستی با DirectSound کار کند.
برنامههای چندرسانهای با این کامپوننت به سختافزارهای صوتی مانند کارت صوتی دسترسی پیدامیکنند. از مهمترین ویژگیهای این API، ترکیب صدا و کنترل سطح آن است.
DirectSound همچنین اجازه میدهد چندین برنامه کاربردی، بدون پیش آوردن وقفه، همزمان به کارت صوتی دسترسی داشته باشند. ایجاد افکتهای صوتی از دیگر تواناییهای DirectSound است. پس از سالها توسعه، اکنون DirectSound یک API پخته و کامل است و بسیاری قابلیتهای دیگر را نیز فراهم میکند؛ مانند قابلیت پخش صداهای چند کاناله با وضوح و دقت بالا.