ورود

View Full Version : سوال: پایه ریاضی برای ساخت بازی ها



ehsan3554
سه شنبه 03 اسفند 1389, 22:39 عصر
با سلام به همه ی دوستان عزیزم در سایت
سوالمو از بازی سازای سایت و مدیران محترم و کلا کسایی که تجربه ی بیشتری دارن می پرسم من طی این چند مدت که به بازی سازی علاقه پیدا کردم متوجه شدم که بیشتر بازی سازای ما رو گرافیک کارا فوکوس می کنند و جای بحث های منطقی و هوش مصنوعی تو این تاپیک ها یکم کمرنگه
و سوالم اینه که تو این مدت متوجه شدم تو بعضی از شرایط تو بازی در صحنه خاصی محاسبات ریاضی سصح بالا و کاملا بهینه ای لازمه و performanc بازی کاملا به این محاسبات ریاضی گره خورده می خواستم بپرسم واقعا این محاسبات کار برنامه نویسه اگه نه که با این شرایط باید یه مشاور ریاضی دان هم تو تیممون داشته باشیم!! یا نه ما مجبوریم بریم کار با کواترنیون ها و انواع و اقسام ماتریس های project و scal و rotato و معادلات و طریقه بهینه کردن اونا و ...... رو یاد بگیریم؟؟ در ضمن این رو هم می دونم که یه انجین قوی این کارا رو اسون میکنه ولی من چند مورد رو دیدم که واقعا این محاسبات اجتناب ناپذیره خوب حالا این مشکلو چه جوری حل میکنند
با تشکر

pswin.pooya
چهارشنبه 04 اسفند 1389, 00:17 صبح
تمام انجینها کلاسها و یا متدهایی رو برای اعمال ریاضی فراهم میکنن به غیر از اون خود دایرکت ایکس هم توابعی رو برای ریاضیات مثل ماتریسها و بردارها و ... داره که کاملا بهینه شده هستن. همینطور OpenGL هم کتابخونه ای به اسم glm داره که این کارها رو انجام میده با این حال انجینها برای سازگاری بیشتر قسمتهاشون مثل فیزیک و هوش مصنوعی خودشون ریاضیاتی رو که لازمه پیاده سازی میکنن. مثلا hmr engine که برای یکی از کاربرهای سایت به اسم سپول هست خودش ریاضیات رو پیاده سازی کرده که تقریبا در سطح دایرکت و یا شاید هم بهتر باشه. (از SSE4 و SSE2 استفاده کرده) و یا خود من از SSE2 برای بالا بردن کارایی اعمال ریاضی استفاده کردم. (توی کد من تقریبا باعث افزایش دو برابری سرعت شد.) اما من تا حالا چیزی به اسم مشاور ریاضی و یا ... نشنیدم چون برنامه نویسهای گرافیک بازیها به اندازه کافی برای ریاضیاتی که لازم دارن تسلط دارن مخصوصا برنامه نویسهای انجین.

البته این رو هم باید اضافه کنم که شما توی همه صحنه ها از ریاضیات استفاده می کنین (حداقل اون ضرب بردارها در ماتریسهایی مثل انتقالات و یا پروجکشن هست) اما افزایش کارایی باید توی هر صورتی باشه این نه تنها شامل گرافیک بلکه شامل مواردی مثل صوت و فیریک و هوش مصنوعی و حتی IO هم میشه.

مواردی مثل هوش مصنوعی و فیزیک و ... واقعا جاشون توی فروم خالیه.

سپول
چهارشنبه 04 اسفند 1389, 19:43 عصر
@ehsan: بله برنامه نویس بازی باید با خیلی از مفاهیم ریاضی آشنایی کامل داشته باشه. برای دونستن ماتریس و چیزهای دیگه بازی هم به ریاضی دان احتیاجی نیست.

@pswin : البته تحصیح کنم که در hmrEngine برای محاسبات ریاضی از توابع SSE و SSE4 استفاده شده نه SSE2. در ضمن اون هم نه در همه عملیات ریاضی.
در مورد SSE2 در کار خودتون، برام جالبه که بدونم در چه توابع ریاضی موتورتون از SSE2 استفاده کردین که سرعتش دو برابر شده ؟

asghar mahdavi
چهارشنبه 04 اسفند 1389, 20:46 عصر
سلام
من خودم یک بازی ساخته ام وفقط یکم هندسه تحلیلی نیاز داره برای تشخیص تصادم

pswin.pooya
چهارشنبه 04 اسفند 1389, 22:34 عصر
@pswin : البته تحصیح کنم که در hmrEngine برای محاسبات ریاضی از توابع SSE و SSE4 استفاده شده نه SSE2. در ضمن اون هم نه در همه عملیات ریاضی.
در مورد SSE2 در کار خودتون، برام جالبه که بدونم در چه توابع ریاضی موتورتون از SSE2 استفاده کردین که سرعتش دو برابر شده ؟

سلام فکر کنم اشتباه متوجه شدین. من سرعت توابع ریاضی مد نظرم بود. سرعت توابع ریاضی مثل ضرب ماتریس ها در مقایسه با کامپایلرهایی مثل اینتل و یا GCC به چهار برابر و کامپایلر MSVC10 به دو برابر رسیده.

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

شاید هم از کدهای شما برای اینکار استفاده کردم :لبخند:. چند روز پیش که کد انجینتون رو download کردم دیدم شما از هدرها مربوطه به جای _asm قدیمی استفاده کردین.

ehsan3554
چهارشنبه 04 اسفند 1389, 22:53 عصر
ممنون از دوستای گلم مخصوصا جناب pswin ......... مطالبتون وافعا کمکم کرد و فهمیدم باید دنبال چی بگردم
حالا میشه راجع به sse و sse2 و sse4 توضیح بدین :قلب:

pswin.pooya
پنج شنبه 05 اسفند 1389, 01:54 صبح
MMX، SSE، SSE2، SSE3 و SSE4 همه از یک نوع معماری به نام SIMD پیروی میکنن. مساله مهمی که این معماری مطرح میکنه اینه که بر روی چندین داده به صورت موازی یک عمل انجام شه. مثلا توی این معماریها ثباتها (register) به جای 32 بیتی 128 بیتی هستن و در نتیجه میشه چهار داده مثلا چهار تا عدد اعشاری 32 بیتی رو قرار داد و با استفاده از مجموعه دستورهای (istruction set) مربوطه یک نوع عملیات رو به صورت موازی بر روی همه انواع این داده انجام داد. مثلا عمل تفریق که دستور اسمبلی اون subps هست و دستور C/C++ اون که داخل هدر emmintrin.h (برای SSE2) (و یا هدرهای مربوطه دیگه برای مابقی موارد مثل SSE4 تعریف شده) _mm_sub_ps هست. به هر حال توی استفاده از این معماری باید به دو نکته دقت داشته باشین:

1. باید بررسی کنید که آیا ارزش این رو داره که از این معماری استفاده بکنید یا نه (چون بارگذاری ریجیسترها می تونه توی مواردی باعث کاهش سرعت بشه)
2. تمامی پلتفرمهای سخت افزاری ازش پشتیبانی نمی کنن مثلا امکان داره یه CPU قدیمی از SSE2 پشتیبانی نکنه و نتیجه یک GPF (General protection fault باشه که یا باعث ریستارت CPU و یا خارج شدن از برنامه میشه. اما آمار گرفته شده از سیستمهای کسایی که بازی میکنن نشون میده که بیشتر از 95 درصد کامپیوترها از این الحاقیهای پردازنده پشتیبانی می کنن.

معماری GPU به صورت ذاتی SIMD هست اما این قضیه برای CPU صدق نمیکنه و شما باید از این مساله اطمینان حاصل کنید. داخل معماری x86 دستور اسمبلی CPUID میتونه توی گرفتن یک لیست از الحاقی ها به شما کمک کنه اما متاسفانه خود این دستور هم یک الحاقی بر روی معماری اصلی هست که بعدا اضافه شده و ممکنه یک سیستم مبتی بر x86 از اون پشتیبانی نکنه. فقط این قدر رو کافیه بگم که اگر پردازنده از این دستور پشتیبانی نکنه می تونید مطمئن باشید که بازی شما هم اجرا نمی شه. چون این دستور توی تمام پردازندهای 486 به بعد موجود هست مگر اینکه یه شرکت اقدام به ساخت پردازنده ای بکنه که این دستور رو نداشته باشه (میتونی مطمئن باشی همچین شرکتی یا ایرانی میشه یا افغانی)

MMX و SSEها برای شرکت اینتل هستن و AMD هم 3DNOW! رو معرفی کرده که البته رنج گسترده ای از پردازندهای AMD از MMXو SSE پشتیبانی میکنن:

http://en.wikipedia.org/wiki/Streaming_SIMD_Extensions

بیشترین استفاده ای که SIMD داخل بازیسازی داره به ضربهای ماتریسی بر میگرده که واقعا باعث افزایش چشم گیر سرعت (عمل ضرب) میشه.

سپول
پنج شنبه 05 اسفند 1389, 13:46 عصر
@pswin:

تمام عملیات هم محدود به ضربها و استفاده اون توی بعضی از موارد سنگین مثل معکوس ماتریس هست. و بعضی از عملیات دیگه. و می خوام کدهای تمام collision های کلاسها رو هم پورت کنم. فعلا مواردی مثل AABB فقط از SIMD استفاده میکنن.
SSE2 بیشتر در واقع جایگزینی برای MMX هست و توابعی داره برای محاسبات متغیرهای Integer و Double و یک سری توابع خاص دیگه ... در واقع با SSE2 نمی شه محاسبات معمولی ریاضی سه بعدی که با float هستند رو انجام داد. مگر اینکه در موتور شما به جای Float از double استفاده کرده باشید.


شاید هم از کدهای شما برای اینکار استفاده کردم . چند روز پیش که کد انجینتون رو download کردم دیدم شما از هدرها مربوطه به جای _asm قدیمی استفاده کردین.
خوشحال می شم، البته در صورتی که به لایسنس موتور احترام بگذارید.