View Full Version : سوال: اپدیت نشدن خودکار صفحه OpenGl
orache
شنبه 17 فروردین 1392, 16:43 عصر
سلام یه سوالی داشتم البته خیلی وقته یعنی حدود 1 ماهه که کار نکردم این سوالم برا همون موقع هست که به چند نفر چ.خ دادم ولی جوابی ندادند . بگذریم
صفحه ی بازی که با اپن جی ال ساختم اپدیت نمیشه یعنی هیچ تغییری ایجاد نمیشه تا وقتی که کلیک چپ موس فشار داده شه خیلی برام عجیبه مثلا وقتی دکمه ی اسپیس رو میزنم باید یک گلوله ایجاد شه یا هرچی ولی وقتی میزنم این کار صورت نمیگیره تا وقتی کلید چپ موس رو میزنم یهو ساخته میشه
اگه متوجه نشدین یه مثال بهتر
فرض کنین یه مربع تو صفحه قرار داره که با کلید r رنگش قرمز با g رنگش سبز با b رنگش ابی میشه ما برنامه رو اجرا میکنیم و وقتی b رو میزنیم رنگش همون سفیده تا کلیک چپ موس رو میزنیم یهو سبز میشه و همینطور بقیه ی رنگ ها
کد هام هم معمولی هستن یعنی من از کد خارجی استفاده نکردم کد هام یه خورده زیادن چون مربوط به یه بازی میشن برا همین اینجا نذاشتم
حالا جواب بدین من امتحان کنم اگه بازم خراب بود یه پروژه ی ساده میسازم و کدشو میذارم
ممنون
mohamad1370
یک شنبه 18 فروردین 1392, 00:18 صبح
اول اینکه اینجور کار به نوعی انیمیشن محسوب میشه و وقتی بحث انیمیشن پیش میاد باید از بافر دوگانه استفاده کنید
اگه از glut استفاده می کنید این دوتابع رو فراخوانی بکنید فکر کنم مشکلتون حل بشه
glutSwapBuffer
glutPostRedisplay
orache
یک شنبه 18 فروردین 1392, 12:44 عصر
از اولی استفاده کرده بودم ولی خراب بود از دومی ولی تاحالا استفاده نکردم تو main یا نه تو تابع display
pswin.pooya
یک شنبه 18 فروردین 1392, 23:07 عصر
ه چند نفر چ.خ دادم ولی جوابی ندادند
در مورد این مساله بارها متذکر شدیم که پیام خصوصی برای جواب دادن به سوال نیست و همچنان هم جواب نخواهد داده شد.
در مورد سوالت هم فقط کافیه فصل یک یا دو هر کتاب آموزش OpenGL رو بخونی. تا متوجه موضوع شی. اما انگار قصد خوندن نداری (بارها دوستان این رو بهت گفتن). زمینه بازی سازی بسیار سخت و پیچیده هست در حقیقت یه نرم افزار بلادرنگ نرم طراحی میشه و کسی هم که همچین نرم افزاری رو خلق میکنه باید در حرفه خودش یک باشه. یعنی همه چی رو بدونه، برای این هم مطالعه زیاد لازمه. بذار یه مثال خوب بزنم :
فرض کن تابع ABS رو میخوای برای یه گیم انجین برای خانواده x86 بنویسی. خب توی حالت عادی از همچین کدی استفاده میشه
int abs ( int _val )
{
if ( _val < 0 ) return -1 * _val;
return _val;
}
به نظر این تابع خیلی ok هست و خوب نوشته شده. اما یه برنامه نویس حرفه ای بازی یه همچین پیاده سازی رو شاید ترجیح بده: (کد زیر قسمتی از گیم انجین ایرانی kge هست)
inline int absi(int _val)
{
int tmp = _val >> 31;
return ( (_val ^ tmp) - tmp );
}
فرق این دو تا کد می تونه حدود 40 درصد روی کارایی این تابع تاثیر بذاره. خب من عاملهای افزایش کارایی رو میگم (البته درک این عاملها به دونستن جزئیات سخت افزاری و موارد زیادی بستگی داره):
1. تعداد دستور العملها کمتر شده پس برنامه سریعتر میشه
2. تابع if یک پرش شرطی غیر قابل پیش بینی داره که در صورت پرش منجر به خالی شدن کانال پایپ لاین پردازنده و کند شدن تابع میشه. ( بسته به اندازه و نوع پایپ لاین امکان داره حتی چند برابر بیشتر از اندازه خود تابع کارها عقب بی افته )
3. یک دستور ضرب داریم در صورتی که پردازنده ضرب کننده آرایه ای نداشته باشه چندین سیکل ماشین هم اونجا هدر میره با اینکه تمام اعمال شیفت و تفریق و xor توی همه پرازنده ها توی یک کلاک ماشین انجام مبشه.
4. تابه بصورت inline تعریف شده. خود این مساله توی اغلب موارد از یک پرش شرطی و برگشت و استفاده از پشته جلوگیری میکنه. ( همین موضوع خودش به تنهایی برای سرعت برنامه کافیه )
خب ببین این موضوعاتی هست که به هیچ عنوان با تست و خطا به دست نمیاد و سالها مطالعه مکرر لازم داره. (و البته تلاش). به هیچ عنوان انتظار نداشته باش با این وضعی که داری پیش میری و اتکا به بقیه حتی توی 10 سال آینده هم بتونی به این مرحله برسی
مشکل از درج نکردن حالت idle داحل glut هست.
orache
دوشنبه 19 فروردین 1392, 16:27 عصر
مرسی از این امید دادن و انگیزه :لبخند:
نمیدونستم چه کدی رو باید پیاده کنم مثلا تو سمپل ها دیدم که از چه کد هایی استفاده میکردند همونو کپی میکردم یعنی کد هارو پاک میکردم که فقط یک صفحه ی خالی سیاه باشه بعد خودم کد های اصلی رو مینوشتم یه بار خاستم خودم همه رو بنویسم که به این مشکل برخوردم
ممنون
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.