# مباحث متفرقه برنامه نویسی > طراحی و ساخت بازی‌های کامپیوتری >  مقایسه سرعت DX و OpenGL در C#‎ و C++‎

## benyamin_pc

لطفا" یه مقایسه علمی بین سرعت اجرای کدهای مشابه دایرکت ایکس و اپن جی ال در سی شارپ و سی پلاس پلاس انجام بدین
نمونه گدیی که من از سی شارپ دیدم که 100% یه سی پی یو 2.7 را به کار می گرفت مشابه سی پلاس پلاسش 2% سی پی یو رو به کار میگرفت البته در کار با دایرکت ایکس !

----------


## pswin.pooya

سلام
از نظر عملی OpenGL تو پردازش 19700 اندی مثلث رو میتونه در عرض 180ms و DirectX اینکار رو در عرض 270ms انجام میده.دایرکت ایکس به علت اینکه بر مبنای com هست نسبتا از OpenGL که API خالی بدون وابستگی هست کندتره. (این مطالب برگرفته از کتاب OpenGL game dev هست و سرعت cpu 1.8 فرض شده.)

----------


## pswin.pooya

سلام
عملا شما نمی تونید از دات نت برای ساخت بازی استفاده کنین.چون دات نت کندتر از اونی هست که بتونه بازیها رو جواب بده (البته در مقابل سی ++) و علت اینکه cpu شما به 100% میرسه میتونه از کد شما و نا سازگاری اون با C#‎ باشه.اما اگر میخوایین با C#‎ اینکار رو انجام بدین میتونین کتاب های مربوط به برنامه نویسی گرافیکی داخل سی شارپ رو بخونین که داخل سایت ..... چند تا کتاب برای داونلود وجود داره

----------


## Asad.Safari

pswin.pooya عزیز , 
اولا اینکه #C جزوی از خانواده دات نت هست .
دوما : الانه ثابت شده است بهترین گزینه برای طراحی موتور های گیم ,  #C هست (به علت سرعت ترسیم تصاویر )

سوما : شما با معرفی اون سایت کتاب ,  فعالیت Warez  انجام دادید.

موفق باشید

----------


## benyamin_pc

> pswin.pooya عزیز , 
> دوما : الانه ثابت شده است بهترین گزینه برای طراحی موتور های گیم , #C هست (به علت سرعت ترسیم تصاویر )


اگه ممکنه این حرفتون رو مستدل بیان کنین

----------


## benyamin_pc

> سلام
> از نظر عملی OpenGL تو پردازش 19700 اندی مثلث رو میتونه در عرض 180ms و DirectX اینکار رو در عرض 270ms انجام میده.دایرکت ایکس به علت اینکه بر مبنای com هست نسبتا از OpenGL که API خالی بدون وابستگی هست کندتره. (این مطالب برگرفته از کتاب OpenGL game dev هست و سرعت cpu 1.8 فرض شده.)


این تو ورژن های اخیر دایرکت ایکس هم صادقه؟
اگه این طور باشه پس سرعت open gl خیلی بهتره::این که میگن امکانات DirectX بیشتر از چه لحاظ؟

----------


## pswin.pooya

سلام
فکر نکنم معرفی وب سایت و کتاب خلاف قوانین باشه! (من بازهم قوانین رو مطالعه میکنم).
این مساله توی همه ورژنهای دایرکت هستش و همیشه OpenGL سرعت بیشتری داشته.اما همراه اون دقت بیشتری رو هم هنگام طراحی میخواسته که اگر بعضی از موارد رو رعایت نکنین موجب میشه که سرعت برنامه به شدت کاهش پیدا کنه.مثلا اگه شما بیشتر از 4 تا light رو تعریف کنین می بینین که سرعت برنامتون کاملا و بطور واضح کاهش پیدا کرده و توصیه برنامه نویسان حرفه ای اینه که هر وقت نور دینامیک احتیاج داشتین از اون استفاده کنین و در غیر اون صورت fakelight رو استفاده کنین. به هر حال OpenGL شاید امکانات کمتری نسبت به دایرکت داشته باشه اما همراه با کتابخونه های همراهش هر کاری رو میشه کرد (میتونین به nvidia SDK 10 برای OpenGL مراجعه کنید). فرق OpenGL و DirectX بیشتر شبیه فرق مابین سی و دلفی میمونه!!.

من سی شارپ رو بلدم و میدنم جز مجموعه دات نت هست.

دایرکت ایکس یکسری توابع آماده رو مثلا مثل توابع بار کردن فایلهای bitmap و یا x داره.اما داخل OpenGL این عمل رو خودتون باید انجام بدین به عنوان مثال مشکل بار کردن فایلهای گرافیکی رو میشه با کتابخونه DevIL برطرف کرد. یا مثلا دایرکت ایکس شامل DirectSound هم میشه که کارهای صدا رو انجام میده اما داخل OpenGL همچین موردی وجود نداره و شما باید از رابط OpenAL استفاده کنید

----------


## benyamin_pc

> اگه ممکنه این حرفتون رو مستدل بیان کنین


تو کتاب introduction to 3D game engine design using directX9 & C#‎.net
نوشته بهترین زبان برای ساخت موتور بازی ها سی شارپ و در کل دات نت بر خلاف اون چیزی که همه فکر می کنن سی شارپ بهترین محیطه حتی از سی پلاس پلاسم بهتر این به دلیل سرعت بالای این نرم افزار همراه با امکانات پیشرفته Oop هست البته این به این معنا نیست که سرعتش از سی پلاس پلاس بیشتره .

----------


## pswin.pooya

سلام
توی کتاب ویژوال بیسیکم از خودش تعریف میکنه و این دلیل نمیشه که vb خوبه.یه نگاه ساده به 10 موتور برتر بازی نشون میده که بهترین زبون C++‎ هست و مساله مهم دیگه اینه که سی شارپ به خاطر اینکه از زبون واسط استفاده میکنه نسبتا کند تره و تسلط کمتری میتونه روی سیستم داشته باشه.

----------


## anubis_ir

زمانیکه کار اصلی در موتورهای دایرکت ایکس و یا اپن جی ال انجام میشه استفاده از vb6 هم شاید زیاد تفاوت خاصی به همراه نداشته باشه.

----------


## pswin.pooya

سلام 
یه چیز جالب اینجا هست:
اگه قرار باشه API برای یک زبون تبدیل بشه باید قبل از اون به استانداردهای اون زبون در بیاد و کتابخونه هاش برای آون زبون کامپایل شن (مثل VBOGL که اصولا از فایل OpenGL32.dll) استفاده نمیکنه.
مساله بعدی سرعت ارسال توابع و پردازش هایی که تویه تابع رندر انجام میگیره 50% سرعت رو تعیین میکنه و به خاطر اینه که شما تفاوت سرعت مابین OpenGL و دایرکت ایکس رو که عملا کندتره چندان متجه نمیشین و توی محاسبات سنگین تا حدودی این قضیه رو میشه.

----------


## anubis_ir

vbogl دقیقا از opengl32.dll استفاده میکنه. در حقیقت این فایل یک type library‌ است که در تمامی زبانهای برنامه نویسی تحت ویندوز قابل استفاده است.

----------


## سپول

> زمانیکه کار اصلی در موتورهای دایرکت ایکس و یا اپن جی ال انجام میشه استفاده از vb6 هم شاید زیاد تفاوت خاصی به همراه نداشته باشه.


کار اصلی در موتور توسط این توابع انجام می شه ؟!! شما مگه موتور نوشتی که این حرف رو می زنی ؟ در برنامه های دمویی که مثلا یک مکعب رو می چرخونه حرف شما درسته تا حدودی، ولی در موتورهای بازی قدرتمند که چند صد هزار خط کد دارند و شامل سیستم های مختلف مثل هوش مصنوعی، فیزیک، اسکریپت، مدیریت صحنه و هزار تا چیز دیگه هستند سرعت C#‎ یا vb.net به مراتب کمتر هست.

----------


## anubis_ir

من منظورم موتور دایرکت ایکس بود نه موتور ابداعی شخصی. بله مسلما اگر قسمت پردازشی عمده طرف شما باشد سرعت کمتر است. 
زمانیکه پردازش‌های نمایشی و غیره توسط موتور دایرکت ایکس انجام میشه، زبان و کامپایلر مورد استفاده آنچنان فرقی نمیکنه.

----------


## seyedof

سلام
ِDirectx موتور نیست فقط یک API است. موتور بازی در لایه های بالاتر قرارداره و شامل خیلی مباحث است که فقط یکیش گرافیکه. به همین علت سرعت زبان در یک بازی یا موتور خیلی مهمه.
ممنون علی

----------


## ra64gh

ببین داش من، زبون برنامه نویسی اصلاً چی؟ مهم نی. تو اگه می تونی تو هرچی دلت می خواد بنویس. اصلاً برو با فرترن 77 بنویس مشکلی نی داش. هر زبون مزایا و معایب خودش رو داره لوتی. اگه نظر منو می خوای من می گم آدم باید آپتودیت ِ آپتودیت باشه. من که ادعایی نرم، ولی دارم با XNA یه موتور توپ می نویسم. بحث در مورد زبون برنامه نویسی وقت تلف کردنه. فقط آدمای بیکار این کار رو می کنند وگرنه اگه کسی سرش تو حساب و کتاب باشه اینجور آدما رو مسخره می کنه.
خلاصه از ما گفتن داش، خواه پند گیر و خواه ملال.
کرتم، عزت زیاد

----------


## gbg

خوب یک مثال معروف که چندتا از معایب و مزایای ای دو کتابخونه رو نشون میده اینه
نتیجه گیری با خودتون

 
OPEN GL:
gl_Begin(GL_TRIANGLES);
gl_Vertex(0,0,0);
gl_Vertex(1,1,0);
gl_Vertex(2,0,0);
glEnd();


و

 
DirectX:
v=&buffer.vertexts[0];
v->x=0;
v->y=0;
v->z=0;
v++;
v->x=1;
v->y=1;
v->z=0;
v++;
v->x=2;
v->y=0;
v->z=0;
c=&buffer.commands;
c->operation=DRAW_TRIANGLE;
c->vertexts[0]=0;
c->vertexts[1]=1;
c->vertexts[2]=2;
IssueExeuteBuffer(buffer);

البته لازم به ذکره که کد دایرکت اکس به صورت سودوکد نوشته شده و کد واقعی نیست

----------


## سپول

> این مساله توی همه ورژنهای دایرکت هستش و همیشه OpenGL سرعت بیشتری داشته.
> ز نظر عملی OpenGL تو پردازش 19700 اندی مثلث رو میتونه در عرض 180ms و DirectX اینکار رو در عرض 270ms انجام میده.


opengl و directx فقط API هستند، هیچ ربطی به سرعت نداره ! اون هم اون چیز خفنی که شما نوشتنی (180 به 270 میلی ثانیه) جالبه منبعی که شما به اون استناد کردین کاملا اشتباه کرده، از اونجا که فکر کنم ضعیف ترین کارت ها پردازش 20 هزار مثلث رو در زمانی بسیار کمتر انجام می دهند (180 میلی ثانیه می شه تقریبا 5.5 فریم بر ثانیه) ، و حتی معیار اندازه گیری سرعت هم نیست ... 

فرق این دو تا API صرفا توی ساختار، سرعت و پشتیبانی درایور کارت گرافیک، documentation و همه گیر بودنشون هست.
اگه می خواهید بازی برای ویندوز (و احیانا xbox360) بسازید قطعا بهترین انتخاب directx هست، درایورهای nvidia و ATI با dx کاملا سازگار هست (درایور ATI با opengl مشکلات زیادی داره)، help های زیادی تو internet موجود هست، برنامه نویسی با اون تمیزتر هست و سازگاری بیشتری با سخت افزارها داره. در مورد سرعت هم که اگه کمتر بود یا مشکلی داشت مطمئن باشید 99.9% بازی های تجاری رو باهاش نمی ساختن.

اگه واسه طراحی های CAD یا سیستم عامل های دیگه مثل mac و linux می خواهید بازی درست کنید انتخاب باز هم واضحه که OpenGL هست چون انتخاب دیگه ای نیست. 

در مورد مثالی که کاربر gbg از تفاوت opengl و Dx زد باز هم اشتباه هست چون در dx عملا یک برنامه نویس درست حسابی چنین کاری انجام نمی ده.




> دایرکت ایکس به علت اینکه بر مبنای com هست نسبتا از OpenGL که API خالی بدون وابستگی هست کندتره.


تفاوت لایه COM با API بدون لایه در پردازنده های جدید اینقدر کم هست که به حساب نمیاد.
احتمالا اگر شما تستی انجام دادید و سرعت کمتری گرفتید به خاطر اینه که لایه میانی directx فعال بوده، Direct3d یک لایه بین API و درایور داره که تمام RenderState ها و دیگر توابعی که شما اجرا می کنید رو نگه می داره و از تکراری بودن اونها جلوگیری می کنه که ممکنه بعضی مواقع سرعت رو کم کنه.
موقع ساختن device ، در تابع CreateDevice فلگ D3DCREATE_PUREDEVICE را اضافه کنید تا اون لایه غیر فعال بشه، بعد می تونید هر تستی خواستید انجام بدید.

----------


## pswin.pooya

سلام
میتونین به کتاب آموزش ساخت موترهای بازی از سری game development سایت gamedev نگاه بندازید. و ما خودمون شاهد تفاوت سرعت پردازش دو رندر متفاوت OpenGL با دایرکت داخل موتور KGE هستیم و به همین علت تو بازی بیلیارد تصمیم گرفتم از رندر OpenGL استفاده کنم.
تقریبا دیگه همه به وضوح روشنی روز میدونن که سرعت OpenGL ببیشتر از دایرکت هست. و مطلبی رو که شما به اون دقت نمی کنین این هستش که OpenGL یک درایور سخت افزاری هستش اما DirectX یک رابط سخت افزاری و دیگه فکر نمی کنم لازم باشه بگم که سخت افزار همیشه از نرم افزار سریعتر عمل میکنه!

----------


## gbg

OpenGl به سورت تابعی نوشته شده ولی پیاده سازی DX به صورت ابجکت ارینتد هستش
حالا می خوام یه کلاس ایجاد کنی چندتا پارامتر رو بهش پاس بده بعد رویداد های لازم رو صدا کن آخر سر هم شی رو آزاد کن بنویس ببینم چند خط میشه

----------


## Nima_NF

من هم اکثر حرف های جناب *سپول* را تایید می کنم .

این اولین مکانی هست که می بینم افرادی بحث انتخاب بین OpenGL و DirectX را با مقایسه تفاوت سرعت اجرای آن دو دنبال می کنند و تا کنون در هیچ کتاب یا منبعی چنین مقایسه هایی ندیدم، پس با تفاسیر سایر دوستان ، ما بهتر از این همه شرکت سازنده بازی برای ویندوز در دنیا می دانیم و همه آن ها اشتباه می کنند که با DirectX بازی می سازند !

وقتی در مورد *بازی های کامپیوتری* در محیط ویندوز صحبت می شود و یا Xbox360 ، آنگاه directX اولین انتخاب برنامه نویسان است و آن هم به خاطر حمایت شدید شرکت های سازنده سخت افزار از directX و update ها و حمایت های شرکت قدرتمند مایکروسافت پشت آن است که باعث می شود هر چند مدت شاهد ظهور یک جلوه یا تکنولوژی خاص در بازی ها و سخت افزار ها باشیم.
اما اگر شرکت ها برای *سایر پلتفرم ها* هم قصد ارائه داشته باشند و یا برای port آن ها به برخی از  دستگاه های کنسول مثل PS3 (که بر خلاف ویندوز سخت افزار ثابتی دارند)  داشته باشند، openGL تنها راه و بهترین راه آن ها می باشد (و این بزرگترین مشکل DirectX می باشد) ولی مطمئن باشید با وجود استفاده از OpenGL باز هم از DirectX برای نسخه ویندوز در کنار آن استفاده خواهند کرد و هر دو انتخاب را برای کاربران قرار می دهند (چرا ؟ حتما اشتباه می کنند یا پول اضافی دارند !)

OpenGL در نرم افزار ها ، کاربرد بسیار وسیع تری دارد و DirectX در بازی های PC که اکثرا تحت ویندوز هستند و سیستم های مایکروسافتی کاربرد وسیع دارد همانطور که از ابتدا هدف اصلی توسعه آن برای بازی بود .
حتی اگر در بخش OpenGL Overview سایت رسمی آن هم نگاه کنید می بینید که تمامی توضیحات به طراحی نرم افزارها گرافیکی ،  CAD و غیره اشاره می کند و فقط در 2 خط در انتها برای بازی صحبت می کند ، هر چند که نسخه بعدی OpenGl برای بازی پا به پای قابلیت های DX کنونی حتما به پیش خواهد رفت.

در همه جا در تفسیر آن ها با این جمله شروع می کنند "اساسا  هر دو یک چیز هستند با برخی تفاوت ها ...".*
یک برنامه نویس بازی خوب ، کسی هست که هر دو مورد را بداند و به کار ببرد و انتخاب را به کاربرانش بسپارد.
*



> حالا می خوام یه کلاس ایجاد کنی چندتا پارامتر رو بهش پاس بده بعد رویداد های لازم رو صدا کن آخر سر هم شی رو آزاد کن بنویس ببینم چند خط میشه


پس بنابر پاسخ شما ، هر جا که برنامه نویسی سخت باشد ، نشاندهنده بد بودن آن هست و به هیچ چیز دیگری هم کار نداریم ، فقط آسان باشد !  

بله یکی دیگر از ضعف های directX سختی کار با COM است ولی این دلیل نمی شود که کلا همه چیز زیر سوال برود ، ساخت بازی آنقدر سخت هست که این در مقابلش چیزی نباشد.

قبل از بیان دلیلی روی آن بیشتر فکر کنید.




> مطلبی رو که شما به اون دقت نمی کنین این هستش که OpenGL یک درایور سخت افزاری هستش اما DirectX یک رابط سخت افزاری و دیگه فکر نمی کنم لازم باشه بگم که سخت افزار همیشه از نرم افزار سریعتر عمل میکنه!


این مورد واقعا جای تعجب دارد !
نمی دانم واقعا منبع شما کجاست ؟

به دوستانی که می خواهند دلایل معقولانه تری برای انتخاب پیدا کنند ، پیشنهاد می کنم از بزرگترین مرجع آن یعنی سایت http://www.gamedev.net  استفاده کنند.

----------


## pswin.pooya

سلام
نیما جان اینم منابع من:
قسمت پنجم از فصل دو ، کتاب OpenGL Shading language (second edition) 

فصل هشت (OpenGL Extensions) کتاب Beginning OpenGL game programming

من کتاب اول رو تا نیمه و کتاب دوم رو به صورت کامل خوندم جالبتر اینجاست که توی کتاب اول و کتاب More OpenGL Game Programming دلایل خوبی برای برتری OpenGL مخصوصا از لحاظ شیدر نسبت به بقیه موارد اشاره شده. نویسنده کتاب Begingin و More آقای Dave Astle هست که دیگه فکر نمی کنم لازم باشه ایشون رو معرفی کنم.

دلیل شما برای استفاده بیشتر کاملا غیر منطقی هست میتونین به تفاوت قدرت ویندوز و لینوکس فکر کنین. با اینکه لینوکس قویتر هست اما رفدارهای کمتری داره و شاید اگر ابزارهای اون زیاد بود و راحتی کار با اون مثل ویندوز بود به طور کل ویندوز منقرض می شد.

علت اینکه ازOpenGL بیشتر برای CAD استفاده میشه اینه که OpenGL فوقالعاده دقیق عمل می کنه و کلا جاهایی که دقت بالا نیاز هست از اون استفاده میشه از جمله این موارد میشه به هواپیماهای بوئینگ اشاره کرد که داخل اونها از OpenGL embeded system یا همون OpenGL ES استفاده میشه که داخل PS 2 و PS 3 هم نصب هستش. 

من خودم روز اول که میخواستم برنامه نویسی گرافیکی رو شروع کنم به شدت نسبت به این مساله تردید داشتم اما کم کم با گذشت زمان مطمئن شدم.

----------


## Nima_NF

> توی کتاب اول و کتاب More OpenGL Game Programming دلایل خوبی برای برتری OpenGL مخصوصا از لحاظ شیدر نسبت به بقیه موارد اشاره شده.


شما داخل کتاب های OpenGl دنبال این می گردید که از DirectX تعریف کنند ؟
برای این کار باید به مراجع بی طرف مخصوص به این کار مراجعه کرد تا حداقل مزایا و معایب هر دو را ذکر کنند و انتخاب را به شما بسپارند. نه اینکه مثلا چند کتاب windows مایکروسافت بخریم بعد داخلش همش از linux بد بگویند و از خودشان فقط تعریف کنند.

بله برخی از این کتاب ها را دارم ولی مطالب چند پست قبل تر شما را در آن ها ندیدم ! ، کتاب ها همیشه چند سال از  آخرین تکنولوژی گرافیک عقب هستند (حتی بهترین کتاب انتشار سال 2006  را که خریدم ) و نباید انتظار داشته باشید مقایسه ها همیشه درست باشد ، در حال حاضر DirectX 10 بالاترین نسخه DirectX است و برای مقایسه باید به مراجع مختلف رجوع کرد و هیچ وقت داخل کتاب های خاص یک موضوع دنبال چنین چیز هایی نگردید.

ضمنا هنوز سوال من برای این جمله غیر علمی باقی هست:



> مطلبی رو که شما به اون دقت نمی کنین این هستش که OpenGL یک درایور سخت افزاری هستش اما DirectX یک رابط سخت افزاری و دیگه فکر نمی کنم لازم باشه بگم که سخت افزار همیشه از نرم افزار سریعتر عمل میکنه!


هر چند که امیدوارم بحثی که به کسی فایده ای نمی رساند ، ادامه پیدا نکند.

----------


## pswin.pooya

> شما داخل کتاب های OpenGl دنبال این می گردید که از DirectX تعریف کنند ؟
> برای این کار باید به مراجع بی طرف مخصوص به این کار مراجعه کرد تا حداقل مزایا و معایب هر دو را ذکر کنند و انتخاب را به شما بسپارند. نه اینکه مثلا چند کتاب windows مایکروسافت بخریم بعد داخلش همش از linux بد بگویند و از خودشان فقط تعریف کنند.


من فکر کنم گفتم که نویسنده astle هست و این آقا با هر دوی این APIها آشنایی داره و هیچ وقت موقعیت خودشو به خاطر یه بحثی که فایده هم نداره به خطر نمی‌ندازه. و تا اونجا که یادمه قبلا یه مرجع بی طرف هم اعلام کرده بو دم




> هر چند که امیدوارم بحثی که به کسی فایده ای نمی رساند ، ادامه پیدا نکند.


شما مرجه خواسته بودید من هم معرفی کردم. این طور نیست!




> مطلبی رو که شما به اون دقت نمی کنین این هستش که OpenGL یک درایور سخت افزاری هستش اما DirectX یک رابط سخت افزاری و دیگه فکر نمی کنم لازم باشه بگم که سخت افزار همیشه از نرم افزار سریعتر عمل میکنه!
> 			
> 		
> 
> این مورد واقعا جای تعجب دارد !
> نمی دانم واقعا منبع شما کجاست ؟


امیدوارم مورد تعجب برطرف شده باشه!

به هر حال این جور بحث ها هیچ وقت به پایان نرسیده و هیچ وقت نتیجه نداشته. و جالبتر اینجاست اکثرا افرادی وارد بحث میشن که در مورد API دیگه اندازه سر سوزن اطلاعاتی ندارن ( مثل خودم که اطلاعاتم در مورد دایرکت خیلی کمه و فقط میتونم کارهای ساده رو با اون انجام بدم). من فقط اطلاعاتی رو دارم میگم که قبلا توی کتابهای دیگه خوندم

من که بیخیال شدم و میگم حق باشماست. یا حق

----------


## gbg

> مطلبی رو که شما به اون دقت نمی کنین این هستش که OpenGL یک درایور سخت افزاری هستش اما DirectX یک رابط سخت افزاری و دیگه فکر نمی کنم لازم باشه بگم که سخت افزار همیشه از نرم افزار سریعتر عمل میکنه!


این یعنی اینکه OPENGL استانداردی هستش که توسط خود کارت گرافیک پشتیبانی می شه
و کارت های گرافیکی که از این قابلیت پشتیبانی مکنند برای دستورات گرافیکی OG رو سریع تر اجرا می کنن؟
چرا DX هر سال نسخش تغییر میکنه؟
برای اینکه با سخت افزار های جدید خودش رو مچ کنه و بتونه از قابلیت های اون ها استفاده کنه وظیفه DX اینه که مشکل ویندوز رو در گرافیک رفع کنه ( به تاریخچه و لزوم ایجاد DX یه نگاهی بندازین ) سالها بود که ویندوز به بازار اومده بود ولی بازی تحت داس اجرا میشدن و سرعت پردازش گرافیک در سیستم عامل ویندوز بسیار وحشتناک بود، اینجا بود که ماکوسافت به این فکر افتاد که ابزاری رو تدارک ببینه که برنامه نویس بدون واسطه به سخت افزار دست رسی داشته باشه ولی ویندوز دوست نداشت این اتفاق بیفته ( چون مدریت منابع سیستم از دست ویندوز خارج می شد ) به همین دلیل ماکروسافت ابزاری DX رو معرفی کرد که به واسطه اون بشه با سخت افزار ارتباط داشت

----------


## pswin.pooya

آخ. یادم رفت فرق رابط با درایور گرافیکی رو بگم:

بازم سلام 

یه رابط عملا یک API هست که توابعی رو جهت کار با یه دستگاه فرهم میکنه. این توابع میتونن گاهی برای کنترل یک دستگاه و گاهی ترکیبی از چند دستور دیگه باشن که به صورت نرم افزاری پیاده میشن.

یه درایور : یه کنترل کننده سخت افزار هست که بعد از سوئیچ و فعال شدن اون حالتها (state)های یک دستگاه رو کنترل میکنه . به عنوان مثال با تابع glEnable (GL_DEPTH_TEST_ تست بافر عمق فعال میشه اما این به منزله استفاده و کنترل بافر عمق نیست و ... 

راستی تا یادم نرفته. OpenGL هم از API (رابط سخت افزار) و هم از درایور سخت افزاری تشکیل شده. مثلا بعضی از اعمال سخت افزای که انجام میده کامپایل کردن سخت افزاری شیدرها هستش. 

توضح بیشتر رو در مورد فرق یه رایط و یه درایور رو میتونین داخل بخش پنجم فصل دوم  کتاب OpenGL Shading language بخونین.

----------


## gbg

> پس بنابر پاسخ شما ، هر جا که برنامه نویسی سخت باشد ، نشاندهنده بد بودن آن هست و به هیچ چیز دیگری هم کار نداریم ، فقط آسان باشد !


دقیقا
برنامه می نویسیم که کارها آسون تر انجام بشه
اگه قرار بود سخت باشه از DX یا OG استفاده نمی کردن ، خودشون برای هربار برنامه نویسی همه چی رو از اول ، و به سلیقه خودشون می نوشتن
چطوره برای استفاده از موس و کی بورد هم برنامه بنویسیم و از امکانات OS استفاده نکنیم
کارا هم سخت تر انجام میشه ، ولی مطمعن نیستم بهتر انجام بشه

این رو هم اضافه کنم که این مقاله به دوستان توصیه می کنم بخونن بین DX و OG مقایسه انجام داده و نتیجه گیری رو به خواننده مقاله واگذار کرده http://www.gamedev.net/reference/art...rticle1775.asp
موفق باشید

----------


## Nima_NF

من در مورد برنامه نویسی سال های اخیر  DirectX9/10  و OpenGl 2/1.1  صحبت می کنم ، بسیاری از مطالبی که شما دوستان بیان می کنید بر می گردد *به سال ها قبل** و کارت های گرافیکی قدیمی،* که از مراجع و کتاب های قدیمی و سال های قبل چنین برداشت هایی کرده اید و البته که در آن زمان اکثر مطالب شما درست بودند.

امیدوارم این را درک کنید که حتی 1 سال عقب بودن نیز در دنیای گرافیک بسیار است. ما در حال حاضر بر روی تکنولوژی Pixel Shader 4.0 هستیم ، چیزی متفاوت از نسخه های 5 سال قبل با Pixel Shader 1 .
جناب *gbg* مقاله ذکر شده را قبلا خوانده ام ؛ مقاله برای سال 2002  است ، ما الآن در سال 2008  هستیم !
به جای این مقاله بهتر هست یک تاپیک در فروم GameDev باز کنید و ببینید پاسخ توسعه دهندگان بازی در سال 2008 به شما چه هست.

دوستان گرامی ، اگر می بینید اینجا صحبتی مطرح کردم فقط برای این است که دیدم در حالی که در چند سال اخیر مقایسه بین  DirectX و OpenGl  با توافق نظر اکثر برنامه نویسان دنیا حل شده  و به این نتیجه رسیده اند که performance در هر دو بسیار نزدیک به هم شده است، ولی شما دوستان هنوز از آن پیشرفت ها اطلاع ندارید :




> البته لازم به ذکره که کد دایرکت اکس به صورت سودوکد نوشته شده و کد واقعی نیست





> که توی کتاب اول و کتاب More OpenGL Game Programming دلایل خوبی برای برتری OpenGL مخصوصا از لحاظ شیدر نسبت به بقیه موارد اشاره شده


این هم یک تاریخچه برای اینکه ببنید در سال های اخیر چطور تغییر کرده اند:



> In theory, the Microsoft approach allows a single code path to support both brands of card, whereas under OpenGL the programmer had to write two separate systems. In reality, though, because of the limits on pixel processing of those early cards, *Pixel Shader 1.1* was nothing more than a *pseudo-assembly* language version of the NVIDIA-specific OpenGL extensions. For the most part, the only cards that claimed PS 1.1 functionality were NVIDIA cards, and that is because they were built for it natively. When the Radeon 8500 was released, Microsoft released an update to Direct3D that included *Pixel Shader 1.4*, which was nothing more than a *pseudo-assembly* language version of the ATI-specific OpenGL extensions. The only cards that claimed PS 1.4 support were ATI cards because they were designed with the precise hardware necessary to make that functionality happen. In terms of early pixel shaders, Direct3D's attempt at a single code path fared no better than the OpenGL mechanism.
> 
> Fortunately, this situation only existed for a short time under both APIs. Second-generation pixel shading cards were *much more similar in functionality*, with each architecture evolving towards the *same kind of pixel processing conclusion*. As such, *Pixel Shader 2.0* allowed a unified code path under Direct3D. Around the same time OpenGL introduced its own ARB-approved vertex and pixel shader extensions (GL_ARB_vertex_program and GL_ARB_fragment_program), *and both sets of cards supported this standard as well*.






> DirectX doesn't support any unofficial features. But OpenGL has an 'extensions' mechanism that allows you to play with certain features of the card before it's been agreed how it officially works. Also *since DirectX8's* programmable pipeline (Vertex shader and pixel shader), DirectX was *almost equivalent* with Open GL in terms of 3D Graphics Performance. *Developers play a leading role in deciding who will ultimately win in this API war.*



بله ، مایکروسافت در directX 9 به شدت به سمت برنامه نویسی shader رفت و در directX 10 دیگر شیوه fixed pipeline وجود ندارد و تمام توجه بر روی vertex and pixel shader می باشد.

نمونه این تکنولوژی کتاب Introduction to 3D Game Programming with DirectX 9.0  محصول سال 2003 هست که با تغییرات بسیار زیاد و جدید به کتاب جدید با نام:
Introduction to 3D Game Programming with DirectX 9.0c: A shader approach تغییر پیدا کرد و در سال 2006 دوباره منتشر شد تا همگان تفاوت دنیای گرافیک جدید با shader ها را لمس کنند تا در نسخه DX 10 (که شیوه عوض شده است) مطالب قابل استفاده باشد.

تمام حرف بنده این است که جمله آخر را که در همه جا بیان می شود به دیگران بگویید و انتخاب را به خودشان بسپارید ، نه اینکه اطلاعات قدیمی را با  تکنولوژی جدید این مسائل مخلوط کنید و موجب گمراهی کاربران شوید و یا آن ها را به این شکل فقط علاقه مند به یکی از این دو محصول کنید  :



> Developers play a leading role in deciding who will ultimately win in this API war

----------


## pswin.pooya

گفتم که فایده نداره.

قبل از دلیل اوردن برای قدیمی بودن مطالب لطفا مطالب خودتون رو محک بزنید و اونها رو آپدیت کنید.( آخرین ویرایش OpenGL سه هستش و الان سه نوع شیدر داریم : vertex، فرگمنت یا پیکسل و geometry)

و یادم رفت بگم OpenGL1.1 برای سال 1997 هست که تعجب میکنم چرا اونو مطرح کردید. چون حتی داخل ویندوز هم حداقل 1.2 موجوده.

آخرین ویرایش شیدر مدل هم شیش هست نه چهار

پست رو به خاطر این به روز کردم که یادم رفت بگم که fixed piple شیوه نیست. به کانال پردازشی ثابتی که روی همه gpuها وجود داره fixed piple گفته میشه و امکان نداره از روی هیچ gpuای حذف بشه. در مورد دایرکت 10 نظری ندارم اما تقریبا مطمئنم که از fixed piple باید پشتیبانی کنه چون عملا مکانیزیم کار باشیدرهاش باید به هم بخوره.

----------


## Nima_NF

هدف فقط روشن کردن مطالب هست ، و اصلا قصد ناراحت کردن کسی را ندارم و اگر این طور شده است عذر خواهی می کنم ؛ فقط می خواستم اطلاعاتی را برای آن سری از دوستان که بیشتر بر روی openGL کار کرده اند قرار دهم . شاید که این گفتگو ها برای سایر دوستان مفید باشد.




> آخرین ویرایش OpenGL سه هستش


بله ؛ آخرین ویرایش directX هم 10.1 هست که سخت افزار جدید می خواهد ولی تا زمانی که واقعا کاربردی و نهایی نشدند ، وارد موضوع نمی شوند.
حتی در سایت های مختلف گفته می شود با آمدن OpenGL 3 به احتمال زیاد می تواند 10.1 DirectX را بگیرید و حتی از آن جلو هم بزند ، که جای خوشحالی خواهد داشت ، چون من طرفدار هر دو هستم.




> و یادم رفت بگم OpenGL1.1 برای سال 1997 هست که تعجب میکنم چرا اونو مطرح کردید. چون حتی داخل ویندوز هم حداقل 1.2 موجوده.


  این مورد یک اشتباه تایپی بود ، منظورم 2/2.1 بود نه 1.1




> آخرین ویرایش شیدر مدل هم شیش هست نه چهار


 من در مورد Shader Model برای DirectX داشتم صحبت می کردم (و همین طور آن مقاله) ، که  آخری آن 4 و به زودی 4.1 می باشد.

برای دیدن لیست  Shader Model ها و کارت های گرافیکی موررد پشتیبانی  DX لینک زیر را نگاه کنید: 
http://en.wikipedia.org/wiki/Pixel_shader

برای 2 نمونه کارت گرافیک پیشرفته و اخیر هم این دو لینک را :

ATI Radeon HD 3800 Serie : Microsoft® DirectX® 10.1 support - Shader Model 4.1

GeForce 8800 GT: Full support for Microsoft DirectX 10 - Shader Model 4.0




> در مورد دایرکت 10 نظری ندارم اما تقریبا مطمئنم که از fixed piple باید پشتیبانی کنه چون عملا مکانیزیم کار باشیدرهاش باید به هم بخوره.


fixed function pipeline حذف و به pro-grammable pipeline انتقال یافته و تغییراتی در معماری pipeline ایجاد شده که خودتان از این لینک ها مطالعه کنید تا متوجه تغییرات شوید:

The Direct3D® 10 System  - by microsoft

DirectX 10 & the Future of Gaming - with pictures

An Overview of Microsoft's Direct3D 10 API




> All traditional fixed-function capability that is expressible in terms of programmable constructs has been eliminated from the pipeline and the core API. This includes vertex transform and lighting, point sprites, fog, and alpha testing.
> 
> The transition to the pro-grammable pipeline and removal of redundant fixed-function has dramatically simplified API and runtime
> 
> and with Direct3D 10 it becomes the only choice. That's right – the fixed function pipeline is history!
> 
> Despite mentioning that the fixed-function methodology was dead ...
> 
> With Direct3D 10 we have a new programmable unit – giving three in total: Vertex Shaders (VS), Geometry Shaders (GS) and Pixel Shaders (PS). All three form "Shader Model 4.0".



موفق باشید

----------


## pswin.pooya

خیلی خوب میدونیم که ویکی همیشه آپدیت نیست و شیدر مدلها اصلا مربوط به پلت فرم نیستند مربوط به ساختار اسمبلی و سخت افزار هستن. تمامی شیدرها از جمله HLSL در نهایت تبدیل به اسمبلی میشن و این جزء ضعفهای دایرکت هستش که نمی تونه شیدر مدل چهار و به بالا رو تویه دایرکت 9 کنه و همینطور تویه دایرکت 10 که فقط چهار هست ( البته فکر کنم)

اگر سخت افزاری پشتیبانی نکنه دلیل بر نبود OpenGL 3 و یا غیر قابل استفاده بودن اون نیست.

OpenGL احتیاجی به جلو زدن از دایرکت نداره همنطور که لینوکس به این مساله احتیاجی نداره.

در مورد دایرکت 10 بازم میگم نظری ندارم.

----------


## سپول

خوب بحث BMW vs Benz ، PS3 vs Xbox360، Windows vs Linux و OpenGL vs DirectX دوباره از سر گرفته شد...




> تقریبا دیگه همه به وضوح روشنی روز میدونن که سرعت OpenGL ببیشتر از دایرکت هست. و مطلبی رو که شما به اون دقت نمی کنین این هستش که OpenGL یک درایور سخت افزاری هستش اما DirectX یک رابط سخت افزاری و دیگه فکر نمی کنم لازم باشه بگم که سخت افزار همیشه از نرم افزار سریعتر عمل میکنه!


آقای pswin ، کی می دونه ؟ الان تقریبا تمام بازی های PC رو با DX می سازن، در حالی که زمانی همه بازی ها رو تحت GL می نوشتند ! آخه یه ذره شواهد دور و ورتون هم نگاه کنید، شما حرفهای نویسنده یه کتاب آموزشی OpenGL رو بهش استناد می کنید ولی انتخاب برنامه نویسان بازی هایCrysis - half-life2 - call of duty4 - GTA - Unreal Engine3 و بقیه رو نادیده می گیرید ؟! 

در ضمن DirectX و OpenGL به خدا جفتشون رابط سخت افزاری هستند، سازنده کارت گرافیک درایور مخصوص جفتشون رو درست می کنه، ولی توابع GL مستقیم از توی همون درایور (که یک نرم افزار است) صدا می کنه، ولی DX اول تابع COM فراخوانی می شه سپس درایور ... اینکار برای اینه که کار سازنده های درایور راحت تر بشه و ورودی توابع روی هر کارت گرافیک به طور استاندار اجرا بشه. باز هم گفتم اگه D3D رو با PURE_DEVICE و همینطور HAL راه اندازی کنید این رابطه مستقیم انجام می شه و فرقی از نظر سرعت نمی کنه.




> من کتاب اول رو تا نیمه و کتاب دوم رو به صورت کامل خوندم جالبتر اینجاست که توی کتاب اول و کتاب More OpenGL Game Programming دلایل خوبی برای برتری OpenGL مخصوصا از لحاظ شیدر نسبت به بقیه موارد اشاره شده. نویسنده کتاب Begingin و More آقای Dave Astle هست که دیگه فکر نمی کنم لازم باشه ایشون رو معرفی کنم.


هیچ فرقی با هم ندارند فقط از لحاظ تکنولوژی شیدر OpenGL یک مقدار عقب تر هست، به خاطر اینکه هر تکنولوژی که قرار هست در GL قرار بگیره اول سازنده های کارت گرافیک Extension های مخصوصش رو به صورت Exclusive درست می کنند، سپس مدتی طول می کشه در ARB به صورت یک استاندارد در بیاد تا در هر کارت گرافیک یکسان عمل کنه. در حالی DX هر نسخه ای که تولید می کنه از همون ابتدا کارت های گرافیک باهاش سازگار هستند. به عنوان مثال وقتی Direct3D10 معرفی شد شرکت nVidia و ATI کارت هاشون رو بر اون مبنا درست کردند، در حالی D3d10 یک API بیشتر نیست در نتیجه تمام امکانات سخت افزار (مثل Geometry Shaders) در یک API دیگه مثل opengl هم قابل استفاده هست، ولی چون استاندار (یا همون Spec) هنوز مشخصی تعیین نشده، زمان می بره تا GL بتونه خودش به استاندارد های D3D10 برسونه در حالی که برنامه نویس ها همین الان شروع به بازی سازی در D3D10 کردند.




> قبل از دلیل اوردن برای قدیمی بودن مطالب لطفا مطالب خودتون رو محک بزنید و اونها رو آپدیت کنید.( آخرین ویرایش OpenGL سه هستش و الان سه نوع شیدر داریم : vertex، فرگمنت یا پیکسل و geometry)


آخرین ویرایش OpenGL نسخه 2.1 هستند، و نسخه 3 مدت ها هست که تاخیر می خوره ... لطفا سری به سایت opengl.org بزنید.




> من خودم روز اول که میخواستم برنامه نویسی گرافیکی رو شروع کنم به شدت نسبت به این مساله تردید داشتم اما کم کم با گذشت زمان مطمئن شدم.


ببخشید از اونجا که همه ما تو ایران یه جورایی بی تجربه هستیم، متاسفانه خیلی زود هست که شما مطمئن باشید راجع به اینجور مسائل (از اونجا که خودتون هم گفتید در Direct3d تجربه ای ندارید و حتی در OpenGL هم تجربه کافی ندارید)




> آخرین ویرایش شیدر مدل هم شیش هست نه چهار


!!!!!!!!!! آقا اینجور مطالب رو از کجا پیدا می کنی ؟




> این جزء ضعفهای دایرکت هستش که نمی تونه شیدر مدل چهار و به بالا رو تویه دایرکت 9 کنه و همینطور تویه دایرکت 10 که فقط چهار هست


ضعفش نیست، Direct3d10 روی کارت های D3d10 مثل Geforce8800 و ATI2xxx اجرا می شه، ساختار D3d10 کلی عوض شده و بهینه تر شده و فقط شیدر نیست. شما برای  d3d10 باید یک رندرر جدید بسازی که روی کارت های جدید هم کار می کنه. ضعفش در واقع اینه که روی WindowsXP نیومده ...




> علت اینکه ازOpenGL بیشتر برای CAD استفاده میشه اینه که OpenGL فوقالعاده دقیق عمل می کنه و کلا جاهایی که دقت بالا نیاز هست از اون استفاده میشه از جمله این موارد میشه به هواپیماهای بوئینگ اشاره کرد که داخل اونها از OpenGL embeded system یا همون OpenGL ES استفاده میشه که داخل PS 2 و PS 3 هم نصب هستش.


دقیق عمل می کنه چون امکان عدد دهی به صورت Double رو داره. و همینطور کارت هایی هستند مخصوص اینجور کارها مثل FireGL و غیره که به طور تخصصی روی نرم افزارهای خاص و با GL عمل می کنند. در حالی که شما در "بازی" نه از اون کارت ها استفاده می کنید، نه از Double.




> و ما خودمون شاهد تفاوت سرعت پردازش دو رندر متفاوت OpenGL با دایرکت داخل موتور KGE هستیم و به همین علت تو بازی بیلیارد تصمیم گرفتم از رندر OpenGL استفاده کنم.


ببخشید ولی اشکال از شماست نه DirectX

----------


## kochol

سلام
قبل از هر چیز معذرت می خوام که این تاپیک رو دوباره می یارم بالا.

پویا جان گفتند که در KGE هم سرعت OpenGL بیشتره من می خواستم یه توضیحی در این مورد بدم.

دلیل اینکه سرعت OpenGL در KGE بیشتره این بود که ما نتونسته بودیم Anti Aliasing را در OpenGl پیدا سازی کنیم و رندر دایرکت ایکس با ضد دندانه ای 8x بود و رندر اپن جی ال با بدون ضد دندانه ای که می دونید خیلی تو سرعت تاثیر می زاره.

اما حالا که ضد دندادنه ای رو برای اپن جی ال هم پویا نوشته من تست کردم و در یک صحنه ی مشابه KGE با دایرکت ایکس 280 فریم در ثانیه و با اپن جی ال 240 فریم در ثانیه رندر می گرفت حالا من دقیقا نمی دونم مشکل از چی هست ولی واقعا خوشحالم که رندر DX و OGL در KGE یکسان هستند و فرقی بینشون نیست ولی خوب نورپردازی هاشون کمی فرق داره و روی fixed دقیقا یکی نمیشن ولی با شیدر که دیگه کاملا خروجی یکی خواهد بود.

البته این اختلاف سرعت ممکنه از کارت گرافیک من باشه من رو ATI X1400 Mobility که برای لپ تاب هست تست گرفتم و شاید هم برنامه نویسی ما. من فکر کنم چون که ما از VBO در اپن جی ال استفاده نکردیم این مشکل پیش اومده و شاید هم یه چیز های دیگه.

به نظرم بعضی ها تو این تاپیک تعصبی رفتار می کردند ولی به نظر من که فرقی نداره من خودم شخصا از OpenGL به خاطر cross platform بودنش خیلی خوشم می یاد و از dx به خاطر شی گرا بودنش هم خوشم می یاد.

----------


## Nima_NF

> ولی خوب نورپردازی هاشون کمی فرق داره و روی fixed دقیقا یکی نمیشن ولی با شیدر که دیگه کاملا خروجی یکی خواهد بود.


تشکر
نکته ای که باید به آن توجه کنید این هست که در حال حاضر دیگر تمامی موتور ها باید از fixed function به سمت   programmable pipeline کوچ کرده باشند و موتور خود را همانند تمامی بازی های سال های اخیر بر اساس shader ها پیاده سازی کرده باشند (نور ، Texturing و bump و  غیره ...)
در غیر این صورت نباید انتظار داشته باشید برنامه شما به درستی از سرعت GPU و یا مثلا از همه قابلیت های directX بهرمند شود و تفاوت های چشمگیری نیز مشاهده خواهید کرد.(چه بر اساس DX9  یا OpenGL )

همانطور هم که قبلا گفتم در DX 10 نیز دیگر fixed function pipeline وجود ندارد و در نسخه بعدی openGL یعنی 3 نیز مانند DX10 قرار است که fixed function pipeline حذف و جایگزین programmable pipeline  شود که نشان دهنده اهمیت این موضوع هست...

----------


## kochol

سلام
من هم با شما موافقم و این جزو بدهیجات هست که موتور ما هم باید رندرش بر اساس شیدر بشود. حداقل تغییری که می کنه تو سرعت هست چون مثلا یه کارت 8800 فکر کنم 46 تا پروسسور داره 12 تا برای ورتکس و 34 تا هم برای پیکسل البته شاید تعداد شو اشتباه گفته باشم ولی همین نشون میده که وقتی رندر با شیدر باشه به خاطر همین موضوع که پیکسل ها با هم محاسبه می شن سرعت کلی بالا می ره.

ولی خودت می دونی که شیدرها سخت هستند به خاطر همین نمی خوام یک دفعه وارد بحث شیدر بشم و به موتور اضافه کنم. اول خودم می خوام خوب یاد بگیرم بعد با یه دیزاین خوب به موتور اضافه کنم.

----------


## AR nekoo

سلام دوستان!
ببخشید من تازه اومدم و می خواهم بدونم برای شروع کار با Open GL از کجا باید شروع کنم و شما چه کتابی را پیشنهاد می کنید؟
با تشکر

----------


## pswin.pooya

سلام
برای شروع کار با OpenGL میتونید از کتاب Begining OpenGL game programming استفاده کنید. البته یه جزوه فارسی هم هستش که دکتر مهری اونو نوشته و اگه روی سایت دانشگاه تبریز سرچ بزنی میتونی پیداش کنی.

----------

