برو به محتوای اصلی
صادق برومند
برنامه نویس در Ubisoft Blue Byte
۲ سال پیش پرسیده شده

از چه روش هایی برای Optimize کردن بازی ها استفاده می‌کنید؟ (CPU\GPU Bottlenecks)

من کجام؟ اینجا کجاست؟

در جامعه بازی‌سازان ایران می‌تونید در مورد هر موضوعی سوال کنید، به سوالای بقیه جواب بدید و تجربه‌تون رو به اشتراک بگذارید!

شخصا، دو کار انجام می‌دم! ;)

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

مرحله دوم بعد از ساخته شدن راه حل، با توجه به اینکه از یونیتی استفاده می‌کنم با استفاده از Profiler دقیقا چیزی که باعث مشکل و bottleneck شده رو شناسایی می‌کنم و بعد راه حل مشخصی برای رفع اون مشکل مشخص طراحی یا جستجو می‌کنم.

منصور جوادی
همکار سابق و دوست فعلی تاد و از اعضای جعبه آبی

من بجای صرفا روش‌های بهینه سازی پس از تولید توضیح مبسوطی از روش‌های بهینه سازی فرآیند تولید نرم افزارها خواهم گفت که توضیح برای شما نیز در آن موجود است.

معمولا از سه راه موازی بصورت همزمان برای توسعه نرم افزار‌های بهینه بهره می‌برند.

تکنولوژی تولید
استفاده از الگوهای طراحی بجا
فعالیت‌های پساتولید مثل سمپلینگ و پروفایلینگ
 
تکنولوژی تولید:
اگر بهینه بودن کار برای شما اولویت بالایی دارد بسته به نوع پروژه تکنولوژی را انتخاب کنید. تکنولوژی‌هایی که خود بر بستر زبان‌های سطح پایین نوشته شده یا مترجم به زبان‌های سطح پایین دارند مثل تکنولوژی‌های مرتبط با CPP مثل GoDOT, Haxe، Cocos2dx و یونیتی IL2CPP راه‌حل مناسبی هستند.

استفاده از الگوهای طراحی بجا:
این راه تأثیرگذارترین بخش می‌باشد. چه بسا پروژه‌هایی که از بهترین تکنولوژی بهره مند هستند اما با عدم استفاده از الگوهای طراحی دچار مشکلات جدی خواهند شد. توجه کنید در این کار زیاده‌روی نکنید زیرا به تولید اسپاگتی خوشمزه بجای توسعه با کد خوانا خواهید رسید! همچنین تمرکز بسیار زیاد بر بهینه‌سازی حین توسعه معمولا نتیجه معکوس به بار می‌آورد.


فعالیت‌های پساتولید مثل سمپلینگ و پروفایلینگ:
معمولا برنامه‌نویسان به این بخش توجه زیادی نشان می‌دهند که متأسفانه بدون در نظر گرفتن دو راه بالا نتایج قابل ملاحظه‌ای عاید آن‌ها نمی‌شود. اما در توضیح این بخش این نکته بسیار ضروری است که اسیر روندهای رایج بهینه‌سازی نشوید. بطور مثال 7-8 سال پیش مسئله Draw Call در رندرینگ یا حجم داده در ارتباطات زمان زیادی از فرصت بهینه‌سازی تیم را اشغال می‌کرد قبل از اینکه «تحلیل جامعی از وضعیت موجود»، «دسته‌بندی و الویت‌بندی مشکلات» و «اقدام» را داشته باشیم.

من چندینتکنیکرو میگم که خودم تجربشون کردم . 
استخر اشیا یا object pooling که شما نیاز نیست یک آبجکت که قرارهمدام تولید ونابود بشه رو این کار رو انجام بدید و اون آبجکت رو در یک چرخه بازیابی قرار می دهید .

یک تکنیک کاهش تریس یا مثلث تهای ایجادشده در پروژه های سه بعدی هست که برای موبایل بهتره تا حد ممکن لو پولی تر باشه . 

unity occlusion culling  که نمیدونم توی یونیتی میدونم این نام رو داره 

سروش شهبازی
مدیر فنی استودیو بلوط گیمز

من در یک نوشته ای به صورت مقدماتی در مورد بهینه سازی توضیحاتی رو ارائه کردم که به زودی بخش دوم این نوشته هم به اشتراک میذارم
خوشحال میشم نظرات دوستان رو بدونم

لینک دسترسی به این نوشته۲۴۵