بهینهسازی حافظه برای ارائه تجربیات بازی پایدار و با کارایی بالا در اندروید بسیار مهم است. این راهنما مروری بر اهمیت بهرهوری حافظه، نحوه مدیریت و اعمال محدودیتهای حافظه فرآیند توسط سیستم عامل اندروید و آستانههای جدید ارائه شده در کنسول گوگل پلی برای کمک به شما در نظارت و بهبود کیفیت فنی بازی شما ارائه میدهد.
اهمیت بهینهسازی حافظه
بهینهسازی حافظه بازی شما برای حفظ ماندگاری بازیکن، گسترش سازگاری دستگاه و مطابقت با استانداردهای کیفیت پلتفرم ضروری است:
- جلوگیری از شروع سرد (تجربه کاربری و حفظ کاربر) : وقتی یک بازیکن به طور موقت از بازی شما خارج میشود (مثلاً برای پاسخ به یک اعلان یا بررسی یک پیام)، سیستم عامل فرآیند بازی را در پسزمینه قرار میدهد. اگر میزان اشغال حافظه پسزمینه بازی خیلی زیاد باشد، Low Memory Killer (LMK) سیستم، خاتمه دادن به فرآیند بازی را برای بازیابی رم برای کارهای پیشزمینه در اولویت قرار میدهد. دفعه بعد که کاربر بازی را از سر میگیرد، به جای یک رزومه گرم یکپارچه و آنی، بازی باید یک شروع سرد طولانی را تجربه کند - فایلهای گرافیکی سنگین، صدا و فایلهای باینری موتور بازی را به طور کامل از حافظه بارگیری مجدد میکند. پایین نگه داشتن استفاده از حافظه پسزمینه از این خاتمههای بیصدا در پسزمینه جلوگیری میکند، وضعیت کاربر را حفظ میکند و اطمینان حاصل میکند که بازیکنان میتوانند بلافاصله جلسه خود را از سر بگیرند. برای جزئیات بیشتر در مورد رفتار LMK سیستم، به راهنمای Android Vitals - Low memory killers مراجعه کنید.
- پایداری اکوسیستم و دستگاه : استفاده ناکارآمد از حافظه و نشت حافظه، سلامت کلی سیستم را کاهش میدهد. وقتی حافظه سیستم کم باشد، سیستم با فشار شدیدی مواجه میشود که منجر به افت نرخ فریم، لکنت رابط کاربری و اشکالات صوتی میشود. اگر فشار حافظه خیلی شدید باشد، Low Memory Killer (LMK) سیستم به شدت فرآیندهای پسزمینه را خاتمه میدهد و سایر برنامهها را مجبور میکند هنگام جابجایی بین وظایف، شروع سرد کند و وضعیت کاربر را از دست بدهند.
- خاتمههای سطح پلتفرم : از اندروید ۱۷ (سطح API ۳۷)، سیستم در مورد خاتمه دادن به فرآیندهایی که از حافظه زیادی استفاده میکنند، پیشگیرانهتر عمل میکند. اگر ردپای بازی شما خیلی زیاد باشد، سیستم عامل میتواند فرآیند آن را بدون ایجاد یک ردپای استاندارد پشته، به طور ناگهانی خاتمه دهد.
- دیده شدن در فروشگاه و اقدامات اصلاحی : گوگل پلی در حال اجرای قوانین سختگیرانهای در مورد کیفیت بر اساس معیارهای حافظه در Android Vitals است. بازیهایی که به طور مداوم آستانههای حافظه را در دنیای واقعی نقض میکنند، با خطراتی مانند کاهش بازدید ارگانیک و نرخ تبدیل پایینتر مواجه میشوند.
- سازگاری دستگاهها : در حالی که دستگاههای پرچمدار از ۱۲ تا ۱۶ گیگابایت رم بهره میبرند، بخش عظیمی از مخاطبان جهانی بازی از دستگاههایی با ۴ یا ۶ گیگابایت رم استفاده میکنند. مدیریت صحیح حافظه تضمین میکند که بازی شما بدون نیاز به بستههای پیچیده و جداگانه، در تمام سطوح سختافزاری قابل دسترسی و پاسخگو باقی بماند.
آشنایی با حافظه در اندروید
برای طراحی استراتژیهای مؤثر بودجهبندی حافظه، توسعهدهندگان باید بدانند که پلتفرم اندروید چگونه حافظه فیزیکی را مدیریت میکند و چگونه میزان فضای فعال بازی شما را اندازهگیری میکند.
مفاهیم اصلی حافظه اندروید
برای مفاهیم بنیادی در مورد مدیریت حافظه در سطح پلتفرم، به مستندات رسمی Memory Management Overview مراجعه کنید. این منبع چهار حوزه معماری را پوشش میدهد:
- مرور کلی حافظه : اندروید از صفحهبندی و نگاشت حافظه (mmap) برای مدیریت رم استفاده میکند. این سیستم عامل از فایل swap سنتی روی دیسک پشتیبانی نمیکند؛ در عوض، برای آزاد کردن حافظه فیزیکی به فشردهسازی صفحه (با استفاده از zRAM) و بازیابی صفحه متکی است.
- تخصیص حافظه بین فرآیندها : اندروید رم را در کل سیستم به اشتراک میگذارد. این سیستم، هیپهای خاصی را برای اجرای ماشین مجازی Dalvik یا ART اختصاص میدهد، در حالی که به محیطهای توسعه بومی (مانند موتورهای بازی C++) اجازه میدهد تا از هیپ سیستم بومی درخواست حافظه کنند.
- مدیریت حافظه برنامه : اندروید که تحت یک مدل چند پردازشی عمل میکند، انتظار دارد برنامهها وضعیت چرخه عمر خود را به صورت پویا رصد کنند و به طور داوطلبانه منابع غیرضروری (مانند گرافیکها و بیتمپهای ذخیره نشده) را برای پشتیبانی از سلامت سیستم آزاد کنند.
- مرور کلی فرآیندها و نخها : سیستم، فرآیندها را بر اساس میزان دیده شدن و اهمیت فعلی آنها توسط کاربر، به صورت سلسله مراتبی دستهبندی میکند و تعیین میکند که در شرایط کمبود حافظه، کدام فرآیندها فعال میمانند و کدامها زودتر خاتمه مییابند.
معیار کل فضای اشغال شده توسط حافظه
محدودکننده حافظه اندروید ۱۷ در سطح پلتفرم، میزان مصرف فرآیند را با استفاده از کل ردپای حافظه به جای کل اندازه حافظه مقیم (RSS) یا اندازه حافظه مجازی ارزیابی میکند.
کل فضای اشغال شده توسط حافظه = RSS ناشناس (RssAnon) + فضای مبادله فشرده نشده (VmSwap)
برای جلوگیری از تجاوز بازیها از محدودیتهای اعمالشده توسط پلتفرم، توسعهدهندگان باید دقیقاً بدانند که این معیارها در سطح سیستم چه چیزی را نشان میدهند. برای اطلاعات بیشتر در مورد این معیارها، تخصیص رم فیزیکی و نحوه مدیریت صفحات پشتیبان فایل، به بخش «درک RSS و معیارهای Swap» در راهنمای استفاده از حافظه مانیتور مراجعه کنید.
محدودیتهای حافظه
برای حفظ پایداری سیستم و اطمینان از اینکه برنامهها منابع بیش از حد مصرف نمیکنند، پلتفرم اندروید محدودیتهای حافظه را برای فرآیندهای در حال اجرا اعمال میکند.
محدودکننده حافظه در اندروید ۱۷ و بالاتر
اندروید ۱۷ و بالاتر با استفاده از لینوکس cgroup نسخه ۲، محدودیتهای حافظه سختگیرانهای را برای هر برنامه اعمال میکنند تا از ایجاد بیثباتی در کل سیستم توسط برنامههای جداگانه جلوگیری شود. برای جزئیات بیشتر در مورد پیادهسازی فنی، به راهنمای محدودکننده حافظه AOSP و وبلاگ اولویتبندی بهرهوری حافظه: مراحل ضروری برای اندروید ۱۷ مراجعه کنید.
- مکانیزم : محدودکننده حافظه تمام فرآیندهای برنامه را رصد میکند و به صورت پویا محدودیتهایی را بر اساس وضعیت چرخه عمر فرآیند تعیین میکند:
- فرآیندهای قابل مشاهده (پیشزمینه) : انتظار میرود فرآیندهای برنامه که در حال حاضر رابط کاربری را نمایش میدهند، مجموعه کاری منابع بزرگتری را اجرا کنند و محدودیت بیشتری برای آنها فراهم شود.
- فرآیندهای غیرقابل مشاهده (پسزمینه یا سرویسها) : فرآیندهای برنامه که بدون نمایش رابط کاربری، کار فعال انجام میدهند، به بودجهی محدودتر و محدودتری محدود میشوند.
- ویژگیهای هسته : این سرویس به دو ویژگی اصلی متکی است:
-
memory.high: یک محدودیت نرم. وقتی از آن عبور شود، هسته پردازش را مسدود کرده و سعی میکند به طور تهاجمی حافظه را بازپس بگیرد. این بازپسگیری میتواند باعث شود بازی افت عملکرد را تجربه کند. -
memory.swap.max: محدودیت سختی را برای فضای swap یا zRAM که فرآیند میتواند استفاده کند، اعمال میکند.
-
- رفتار خاتمه : اگر یک فرآیند به تخصیص حافظه ناشناس فراتر از
memory.highادامه دهد و ظرفیت swap خود را تمام کند، تخصیصها با شکست مواجه میشوند و سیستم عامل به طور خاموش فرآیند را از بین میبرد. این خاتمه با استفاده ازApplicationExitInfoتحت دلیل خروج Memory Limiter ثبت میشود (از اندروید 17، 26Q4 به بعد موجود است).
نظارت بر میزان استفاده از حافظه
برای بهینهسازی مؤثر حافظه بازی خود، ابتدا باید بدانید که پلتفرم اندروید چگونه ردپای خود را اندازهگیری میکند. اندروید ۱۷ معیار اجرای حافظه را بهروزرسانی میکند تا مجموع RSS ناشناس (RssAnon) و Swap فشرده نشده (VmSwap) را ردیابی کند، به استثنای حافظه file-backed یا GPU-private. این راهنما نحوه استفاده از ابزارهای سطح سیستم مانند Perfetto و meminfo ، پیادهسازی APIهای تشخیصی مانند ProfilingManager و onTrimMemory و استخراج تخصیصهای دقیق حافظه در Unity و Unreal Engine را شرح میدهد. نحوه پروفایلبندی دقیق بازی خود و جلوگیری از وقفههای عملکردی مرتبط با نظرسنجی حافظه سنتی در زمان اجرا را بیاموزید.
برای اطلاعات بیشتر، به بخش «نظارت بر میزان استفاده از حافظه» مراجعه کنید.
راهکارهای کاهش حافظه
در حالی که موتورهای بازی توسعه چند پلتفرمی را ساده میکنند، مدیریت پیشفرض حافظه آنها میتواند محدودیتهای حافظه سطح سیستم عامل را ایجاد کند. این صفحه مراحل بهینهسازی عملی را که به طور خاص برای Unity و Unreal Engine طراحی شدهاند، شرح میدهد. درک کنید که چرا تکیه بر onTrimMemory مبتنی بر جاوا میتواند باعث ایجاد بنبست در Unity شود - و چگونه به جای آن از callbackهای چرخه عمر بومی استفاده کنید. همچنین بهینهسازیهای کلیدی سطح دارایی، مانند استفاده از فشردهسازی بافت ASTC 8x8 و پیکربندی تخلیه داراییها را برای اجرای روان بازی خود در تمام سطوح سختافزاری کشف خواهید کرد.