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

از چه روش هایی برای جلوگیری از Garbage Collection استفاده می‌کنید؟

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

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

علی افروغه
مدیر پروژه/فنی بازی باغ نگار

من یه قانونی برای خودم گذاشتم که هرجا قراره از کلمه کلیدی new استفاده کنم بررسی می‌کنم که آیا راه بهینه تری وجود داره ؟

اگر امکانش باشه از stackalloc استفاده می‌کنم. اگر نباشه می‌بینم آیا میشه متغیر رو یکبار به عنوان یک private member تعریف کرد و دیگه هر بار داخل یک تابع new نکرد.

سعی می‌کنم اگر از List استفاه می‌کنم، هنگام ساختش یه عددی که فکر می‌کنم مناسبه به عنوان capacity به constructor بدم تا وقتی Add می‌کنم لازم نباشه آرایه درونی منتقل بشه به یک آرایه بزرگتر.

سعی می‌کنم اگر امکانش هست به جای Class از struct استفاده کنم تا دیتا رو نگه داری کنم.

برای ساخت string از concat کردن string‌ ها خود داری می‌کنم و از StringBuilder استفاده می‌کنم.

از for تا جای ممکن به جای foreach استفاده می‌کنم.

در حلقه‌ها و جاهایی که تکرار زیاده از Linq استفاده نمی‌کنم.

 

همه این‌ها باعث میشه Garbage کمتر تولید بشه و در نتیجه نیاز به Garbage Collection کمتر. 

علی تقریباً همه رو گفت...
این چند مورد هم به ذهنم می‌رسه:
- اگر لازمه در برنامه زود به زود روی فایل بنویسم و بخونم اون رو باز نگه می‌دارم تا هر بار با بستن FileStream ایجاد Garbage نکنه.
- (توی بازی شبکه) هیچ‌وقت از Text serialization مثل JSON استفاده نمی‌کنم.
- با هر بار Subscribe / Unsubscribe کردن به یه Event یه مقدار Garbage تولید می‌شه. برای همین ترجیح می‌دم Event system خودم رو بنویسم.
- اگر هم بستری که کار می‌کنی یونیتی هست. هیچ وقت یه object یونیتی رو حین بازی Destroy نمی‌کنم. این کار رو فقط حین جایی که loading دارم یا بین تغییر دو Scene انجام می‌دم و قسمتی که بازی اصلی در حال انجامه همه چیز رو که قراره به دفعات ساخته بشه یا از بین بره با ObjectPool مدیریت می‌کنم.