وقتی مدیریت حافظه اندروید را درک کردید و ابزارهایی را برای اندازهگیری میزان استفاده از حافظه بازی خود تنظیم کردید، قدم بعدی کاهش و بهینهسازی فعال آن است. رعایت محدودیتهای سختگیرانه اندروید به جلوگیری از بسته شدن بازی توسط سیستم، توقف زمان طولانی راهاندازی و تضمین اجرای خوب بازی در همه دستگاهها کمک میکند.
این راهنما تکنیکهای عملی برای کاهش مصرف حافظه بازی شما ارائه میدهد، به طور خاص بر بهینهسازی سطح دارایی، پیکربندیهای خاص موتور و بهترین شیوههای مدیریت حافظه تمرکز دارد.
کاهش حافظه در یونیتی
با توجه به طراحی معماری Unity، پس از گسترش تخصیصدهندههای بلوک بومی و هیپ مدیریتشده، موتور تمایل دارد آن صفحات حافظه را برای استفاده مجدد نگه دارد تا اینکه آنها را بلافاصله به سیستم عامل (OS) بازگرداند، حتی پس از انتشار داراییها. به طور خاص، فضای آدرس مجازی (حافظه رزرو شده) برای طول عمر فرآیند رزرو شده باقی میماند و حافظه فیزیکی (RSS) بلافاصله پس از وقوع چندین چرخه جمعآوری زباله (GC) و اصلاح، بازپس گرفته نمیشود. در نتیجه، یک اوج حافظه موقت میتواند باعث شود حافظه ساکن حتی پس از کاهش واقعی استفاده، برای مدت طولانی متورم باقی بماند. این رفتار خطر خرابیهای خارج از حافظه (OOM) را در دستگاههای رده پایین افزایش میدهد و پایداری کلی زمان اجرا را کاهش میدهد.
بنابراین، بهینهسازی حافظه یونیتی باید از طریق سه رکن اصلی متناسب با این رفتارهای موتور انجام شود:
- برای جلوگیری از افزایش ناگهانی و ناگهانی حافظه در همان وهله اول، میزان استفاده از حافظه فعال را کنترل کنید.
- فرمتهای بافت و انواع سایهزن را مدیریت کنید تا مطمئن شوید که منابع و دادههای بومی غیرضروری نمونهسازی نمیشوند.
- ساختارهای کد زمان اجرا را اصلاح کنید تا تخصیصهای غیرضروری روی هیپ مدیریتشده را حذف کنید تا فرکانس GC و گسترش هیپ به حداقل برسد.
برای اطلاعات بیشتر، به بهینهسازی حافظه در یونیتی مراجعه کنید.
بهینهسازی چند فرآیندی
استفاده از حافظه توسط فرآیندهای ذخیره شده در حافظه پنهان (cache) از محاسبه محدودیتهای حافظه مستثنی است زیرا هیچ تاثیری بر برنامههای فعال ندارد. اجرای سرویس در یک فرآیند جداگانه و ایزوله به فرآیند اصلی کمک میکند تا در اسرع وقت به حالت ذخیره شده در حافظه پنهان منتقل شود و در نتیجه سلامت بازی شما را بهبود بخشد.
برای اطلاعات بیشتر، به نحوه ردیابی وضعیت فرآیند و حافظه ، نحوه جداسازی یک فرآیند سرویس با Unity و نحوه جداسازی یک فرآیند سرویس با Unreal مراجعه کنید.