یکی از چالشهای همیشگی توسعهدهندگان بازی، رسیدن به فریمریت پایدار بدون فدا کردن کیفیت گرافیکی است. در Unity، بسیاری از افتهای عملکرد ریشه در جزئیاتی دارند که در نگاه اول ساده به نظر میرسند، اما در مقیاس بزرگتر تاثیر جدی روی تجربه بازیکن میگذارند.
کاهش Draw Call
هر بار که موتور بازی یک آبجکت را رندر میکند، یک Draw Call ایجاد میشود. تعداد زیاد این فراخوانیها فشار زیادی روی CPU وارد میکند و باعث میشود GPU در انتظار دستورات بماند.
- از Static Batching برای آبجکتهای ثابت استفاده کنید
- متریالهای مشابه را در یک Atlas ادغام کنید
- از GPU Instancing برای آبجکتهای تکراری بهره بگیرید
- تعداد متریالهای مختلف روی هر مش را به حداقل برسانید
تفاوت Static و Dynamic Batching
Static Batching برای آبجکتهایی که در طول بازی حرکت نمیکنند مناسب است و در زمان Build انجام میشود، در حالی که Dynamic Batching در زمان اجرا و برای آبجکتهای کوچک متحرک فعال میشود. استفاده نادرست از Dynamic Batching میتواند خودش هزینه پردازشی اضافه ایجاد کند، پس باید با آگاهی از آن استفاده کرد.
مدیریت حافظه و Garbage Collection
تخصیص مکرر حافظه در طول اجرای بازی باعث فعال شدن Garbage Collector و افت ناگهانی فریم میشود. این افتها معمولاً بهصورت لحظهای و غیرقابل پیشبینی رخ میدهند و همین موضوع تشخیص و رفع آنها را دشوار میکند.
// اجتناب از تخصیص در Update
void Update() {
// بد: ایجاد آبجکت جدید در هر فریم
// Vector3 pos = new Vector3(x, y, z);
// خوب: استفاده از متغیر از پیش تعریفشده
tempVector.Set(x, y, z);
}
استفاده از Object Pooling
بهجای ساخت و نابودی مداوم آبجکتهایی مثل گلولهها یا افکتها، از یک استخر از پیش ساختهشده استفاده کنید تا فشار روی حافظه کاهش یابد. این تکنیک بهخصوص در بازیهای موبایل که حافظه محدودتری دارند اهمیت بیشتری پیدا میکند.
کش کردن ارجاعات کامپوننتها
فراخوانی مکرر GetComponent در هر فریم یکی از دلایل رایج افت عملکرد است. بهتر است ارجاع به کامپوننتها را یکبار در Awake یا Start ذخیره کنید و در ادامه از همان متغیر استفاده کنید.
بهینهسازی رندرینگ و بافتها
کیفیت بافتها و نحوه فشردهسازی آنها تاثیر مستقیمی روی مصرف حافظه گرافیکی و زمان بارگذاری دارد.
- از فرمتهای فشرده متناسب با پلتفرم هدف استفاده کنید
- از Mipmap برای آبجکتهای دوردست بهره بگیرید
- رزولوشن بافتها را متناسب با اندازه واقعی روی صفحه تنظیم کنید
- از LOD برای مدلهای پیچیده استفاده کنید تا جزئیات با فاصله کاهش یابد
بهینهسازی زودهنگام دشمن است، اما نادیده گرفتن کامل عملکرد هم بازی را در دستگاههای ضعیف غیرقابل بازی میکند.
پروفایلبندی، نه حدسزدن
ابزار Profiler در Unity این امکان را میدهد که بهجای حدس زدن درباره منبع افت فریم، دقیقاً ببینید کدام بخش از کد یا رندرینگ زمان بیشتری مصرف میکند. تست روی دستگاه واقعی، بهخصوص برای بازیهای موبایل، همیشه دقیقتر از تست در Editor است.
با ترکیب این تکنیکها، میتوان تجربهای روانتر برای بازیکنان فراهم کرد، حتی روی سختافزارهای میانرده، و از افتهای ناگهانی فریم که تجربه بازی را مختل میکنند جلوگیری کرد.
نظرات
برای ثبت نظر وارد شوید.