PDA

View Full Version : دوباره نویسی انجین



1485159
دوشنبه 10 خرداد 1389, 09:11 صبح
سلام
من تصمیم گرفتم که انجینم رو shift delete کنم و از اول بنویسمش:لبخند:
بنابراین میخوام از اول اصولی کار کنم و وسط کار دوباره با مشکل رو برو نشم.
چطوری شروع به نوشتن کنم؟ منظورم اینه که چطوری شروع کنم؟ اول چه چیز هایی رو پیاده سازی کنم؟ مراحل کار باید به چه صورت باشه؟
لازم میدونم که توضیحی در مورد انجینم بدم:
1- فعلا فقط گرافیکش مهمه.(فیزیک و صوت و هوش و... واسه بعد)
2- زیاد نمیخواد پیشرفته باشه. همین که بتونم مثلا اطلاعات رو از یه فایل بخونم و رسم کنم کافیه.(این اطلاعات زیاد هم پیچیده نیستن؛ مثلا از فلان پیکسل به فلان پیکسل یه خط قرمز بکش، دایره بکش و....)
3- حتی لود تسکچر هم برام مهم نیست!(همین لود فایل های bmp کافیه:لبخند:)
4- انجین قراره کاملا 2 بعدی باشه
منتظر راهنمایی هاتون هستم.:قلب:
ممنون.

SeganX
دوشنبه 10 خرداد 1389, 16:39 عصر
سلام
کار شجاعانه ای انجام دادی.
من خیلی تجربه ندارم. یه چیزایی میدونم و میگم که امیدوارم بدردت بخوره.

قبل از اینکه با عجله به سراغ رسم کردن چندتا پلان و قوری و ... بری سعی کن بدنه اصلی و الگوی (pattern) برنامه نویسیتو مشخص کنی. مثلا کلاس های جنرال و بیس رو طوری طراحی کنی که مدیریتشون برات آسونتر باشه و یا ارتباط اجزای اصلی به چه صورتی باشه و ...
بعد تصمیم بگیر با چه ابزارهایی می خوای کار کنی؟ stl, boost ... شاید هم اصلا بخوای خودت یک سری ابزارهارو بنویسی.
پیشنهاد من اینه که توی کد نویسیت مستقیما از هیچ ابزاری استفاده نکنی و یک سری helper class یا پرپروسسور واسه هر ابزاری درست کنی تا بعدا اگر خواستی ابزارتو عوض کنی مجبور نشی کل کد موتور رو جستجو کنی.
سعی کن تا اونجا که می تونی قابلیت هایی که می خوای موتورت ساپورت کنه رو توی یه کاغذ لیست کنی. اینکار تو دیزاین موتور خیلی می تونه کمکت کنه.
بعد اولویت های کاریت رو مشخص کن تا بتونی به ترتیب و با برنامه کارتو پیش ببری.

تا اینجا میرسیم به مرحله صفر. برای رفتن به مراحل بالاتر حسابی باید مطالعه و تحقیق کنیم. هنگام جستجو و تحقیق و بررسی کار دیگران، گاهی ایده ها و راهکارهایی می بینیم که خیلی میتونه کمکمون کنه.

1485159
دوشنبه 10 خرداد 1389, 16:57 عصر
بعد تصمیم بگیر با چه ابزارهایی می خوای کار کنی؟ stl, boost ... شاید هم اصلا بخوای خودت یک سری ابزارهارو بنویسی.
منظور از ابزار چیه؟

مثلا کلاس های جنرال و بیس رو طوری طراحی کنی که مدیریتشون برات آسونتر باشه و یا ارتباط اجزای اصلی به چه صورتی باشه و ...

چه کلاس هایی طراحی کنم؟

pswin.pooya
دوشنبه 10 خرداد 1389, 22:46 عصر
کلاسهای پایه به شکل خیلی زیادی بستگی به هدف، نوع انجین و انتظاراتت از انجین و همینطور زبان برنامه نویسی داره.

به عنوان مثال یکی از اهداف انجین من پشتیبانی از یونی کد هستش به همین خاطر به جای استفاده از std::string مجیور شدم که کلاس string خودم رو بنویسم. که از utf-8و 16 پشتیبانی می کرد و یا بعضی از موارد مثل ریسورس منیجر و Root تنها باید یه نمونه از روشون ساخته میشد پس من باید یه کلاس که معروف به singleton هستش رو طراحی کنم و یا توی خیلی قسمتهای انجین برای تست صحت کارکرد اون منجورم log بگیرم پس باید یه کلاس برای اینکار یعنی لوگر داشته باشم. تمامی انجینها به محاسبات ریاضی مخصوصا محاسبات برداری و ماتریسی نیاز دارن پس شما به کلاسهایی مثل Vector و یا Matrix هم نیاز داری تا بتونی کارهای اولیه ریاضیاتی گرافیکی مثل (انتقال و چرخش و ... ) را به کمک اونها انجام بدی.
یه مورد دیگه پر استفاده Picking هستش که بعضی از انجینها از روشهایی سنتی (بافر انتخاب) استفاده میکنن که کند و ناکارآمد هستش بعضی از انجینهای جدید دیگه که از شیدرها استفاده میکنن از یه تکسچر به کمک MRT استفاده میکنن که توی اون شماره اشیاء رو مثل بافر انتخاب ذخیره میکنن و پس اینجور انجینها به RTT هم نیاز دارن و. یکسری دیگه از Rayها استفاده میکنن (مثل kge) که اونها به کلاسهای ریاضی مثل Ray احتیاج دارن (این کلاس کلا توی گیم انجینها خیلی پرکاربرده)

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

همینطور سعی کن کد انجینهای اپن سورس رو نگاه کنی توی این کدها تجربیات برنامه نویسهای دیگه و راهکارهای اونها هستش من خودم مرتبا کدهای انجینهای Ogre، KGE و hmr رو نگاه میکنم و باید بگم که دو کد kge و hmr پر از موراد مفید برای یادگیری هستند و کد خوانا و راحت و در عین حال کارآمد (توی بعضی از موارد ) را دارند.

1485159
سه شنبه 11 خرداد 1389, 13:38 عصر
همینطور سعی کن کد انجینهای اپن سورس رو نگاه کنی توی این کدها تجربیات برنامه نویسهای دیگه و راهکارهای اونها هستش من خودم مرتبا کدهای انجینهای Ogre، KGE و hmr رو نگاه میکنم و باید بگم که دو کد kge و hmr پر از موراد مفید برای یادگیری هستند و کد خوانا و راحت و در عین حال کارآمد (توی بعضی از موارد ) را دارند.
آخه اکثر سورس ها حرفه ای هستند! من میخوام یه انجین خیلی ساده بنویسم. یه همچین انجین ساده ای به همراه سورسش سراغ دارین؟

pswin.pooya
سه شنبه 11 خرداد 1389, 13:50 عصر
یه لیست از انجینها اینجا هستش. میتونی در مورد خواصی که مد نظر داری سرچ بزنی. برای انجین دو بعدی هم فکر کنم GDI و دایرکت موثرتر از OpenGL باشن. معمولا OpenGL برای کارهای 3D بهتر جواب میده.

http://www.devmaster.net/engines/

1485159
سه شنبه 11 خرداد 1389, 14:05 عصر
برای انجین دو بعدی هم فکر کنم GDI و دایرکت موثرتر از OpenGL باشن. معمولا OpenGL برای کارهای 3D بهتر جواب میده.
آخه قراره در آینده رو سه بعدی هم کار کنم.
----------------
همانطور که گفتم میخوام انجینم کاملا ساده باشه ولی نمیدونم که کدوم امکاناتی رو باید حتما داشته باشه؟

1485159
سه شنبه 11 خرداد 1389, 14:15 عصر
این یعنی چی؟

Graphics API Software

pswin.pooya
سه شنبه 11 خرداد 1389, 18:49 عصر
سیستم رندرینگ رو خودشون نوشتن و به جای سخت افزار از نرم افزار استفاده میشه

1485159
سه شنبه 11 خرداد 1389, 20:00 عصر
سیستم رندرینگ رو خودشون نوشتن و به جای سخت افزار از نرم افزار استفاده میشه
یعنی چیزی شبیه به opengl نوشتن؟ میشه بیشتر توضیح بدین؟

pswin.pooya
سه شنبه 11 خرداد 1389, 23:37 عصر
یعنی چیزی شبیه به opengl نوشتن؟ میشه بیشتر توضیح بدین؟

بله. اگر الگوریتمهایی مثل الگوریتمهای رستری کردن رو بدونی میتونی یه همچین چیزی پیاده کنی اما هیچ وقت به پای OpenGL یا DX نمی رسن. هر دوی اینها از شتابدهندههای سخت افزاری استفاده میکنن که باعث میشه سرعت خیلی بالاتر بره.

1485159
چهارشنبه 12 خرداد 1389, 08:20 صبح
بله. اگر الگوریتمهایی مثل الگوریتمهای رستری کردن رو بدونی میتونی یه همچین چیزی پیاده کنی اما هیچ وقت به پای OpenGL یا DX نمی رسن. هر دوی اینها از شتابدهندههای سخت افزاری استفاده میکنن که باعث میشه سرعت خیلی بالاتر بره.
برای رسم از توابع ویندوز استفاده میکنن؟