مدیریت قدرت و عملکرد دستگاههای Android میتواند به اجرای یکنواخت و یکنواخت برنامهها در طیف وسیعی از سختافزار کمک کند. در Android 7.0 و بالاتر، OEM ها می توانند از نکات عملکرد پایدار پشتیبانی کنند که برنامه ها را قادر می سازد عملکرد دستگاه را ثابت نگه دارند و یک هسته انحصاری را برای بهبود عملکرد برای برنامه های پیش زمینه فشرده CPU مشخص کنند.
عملکرد پایدار
برای برنامههای طولانیمدت (بازی، دوربین، RenderScript ، پردازش صدا)، عملکرد میتواند بهطور چشمگیری متفاوت باشد، زیرا به محدودیتهای دمای دستگاه رسیده و موتورهای سیستم روی تراشه (SoC) کاهش مییابند. توسعهدهندگان برنامههایی که برنامههای با کارایی بالا و طولانیمدت ایجاد میکنند، محدود هستند، زیرا وقتی دستگاه شروع به گرم شدن میکند، قابلیتهای پلتفرم زیرین هدف متحرکی است.
برای رفع این محدودیتها، Android 7.0 پشتیبانی از عملکرد پایدار را معرفی کرد، و به OEMها اجازه میدهد نکاتی در مورد قابلیتهای عملکرد دستگاه برای برنامههای طولانیمدت ارائه دهند. توسعهدهندگان برنامهها میتوانند از این نکات برای تنظیم برنامهها برای یک سطح قابل پیشبینی و ثابت از عملکرد دستگاه در دورههای زمانی طولانی استفاده کنند.
معماری
یک برنامه اندرویدی میتواند از پلتفرم درخواست کند تا به حالت عملکرد پایدار وارد شود که در آن دستگاه Android میتواند سطح عملکرد ثابتی را برای مدت زمان طولانی حفظ کند.
پیاده سازی
برای پشتیبانی از عملکرد پایدار در Android نسخه 7.0 و جدیدتر، OEM ها باید:
- تغییرات خاص دستگاه را در پاور HAL ایجاد کنید تا حداکثر فرکانسهای CPU/GPU را قفل کنید یا بهینهسازیهای دیگری را برای جلوگیری از انقباض حرارتی انجام دهید.
- راهنمایی جدید
POWER_HINT_SUSTAINED_PERFORMANCE
را در برق HAL اجرا کنید. - با برگرداندن TRUE از طریق API
isSustainedPerformanceModeSupported()
پشتیبانی را اعلام کنید. -
Window.setSustainedPerformanceMode
را پیاده سازی کنید.
در پیادهسازی مرجع Nexus، اشاره قدرت حداکثر فرکانسهای CPU و GPU را در بالاترین سطوح پایدار محدود میکند. به خاطر داشته باشید که پایین آوردن نوار MAX در فرکانس CPU/GPU، نرخ فریم را کاهش می دهد، اما این نرخ کمتر در این حالت به دلیل پایداری آن ترجیح داده می شود. به عنوان مثال، دستگاهی که از حداکثر ساعت معمولی استفاده می کند ممکن است بتواند برای چند دقیقه با سرعت 60 فریم در ثانیه رندر بگیرد، اما پس از گرم شدن دستگاه، ممکن است در پایان 30 دقیقه به 30 فریم در ثانیه کاهش یابد. برای مثال، هنگام استفاده از حالت پایدار، دستگاه میتواند برای کل 30 دقیقه با سرعت 45 فریم در ثانیه رندر کند. هدف، نرخ فریم در هنگام استفاده از حالت است که به همان میزان (یا بالاتر) از نرخ فریم در صورت عدم استفاده از حالت باشد، و در طول زمان ثابت باشد تا توسعهدهندگان مجبور نباشند هدف متحرک را تعقیب کنند.
ما اکیداً توصیه میکنیم که حالت پایدار را به گونهای اجرا کنید که دستگاه به بالاترین عملکرد پایدار ممکن دست یابد - نه فقط حداقل مقادیر مورد نیاز برای گذراندن آزمایش (مثلاً حداکثر حداکثر فرکانس ممکن را انتخاب کنید که باعث نمیشود دستگاه در طول زمان از نظر حرارتی گاز بگیرد).
توجه : برای اجرای حالت پایدار نیازی به محدود کردن حداکثر نرخ ساعت نیست.
اعتبار سنجی
OEM ها می توانند از تست CTS (اندروید 7.0 و جدیدتر) برای تأیید اجرای API عملکرد پایدار استفاده کنند. این تست یک بار کاری را برای تقریبا 30 دقیقه اجرا می کند و عملکرد را با و بدون فعال بودن حالت پایدار مشخص می کند:
- با فعال بودن حالت پایدار، نرخ فریم باید نسبتاً ثابت بماند (آزمایش درصد تغییر نرخ فریم را در طول زمان اندازهگیری میکند و نیاز به تغییر <5٪ دارد).
- با فعال کردن حالت پایدار، نرخ فریم نباید کمتر از نرخ فریم در پایان 30 دقیقه با حالت غیرفعال باشد.
علاوه بر این، میتوانید پیادهسازی خود را بهصورت دستی با چندین بار کاری فشرده CPU و GPU آزمایش کنید تا مطمئن شوید که دستگاه پس از 30 دقیقه استفاده بهصورت حرارتی گاز نمیگیرد. در آزمایش داخلی، از حجمهای کاری نمونه از جمله بازیها و برنامههای محک (مثلا gfxbench ) استفاده کردیم.
هسته های انحصاری
برای بارهای کاری فشرده و حساس به زمان، استفاده از یک رشته دیگر می تواند تفاوت بین تعیین مهلت فریم یا عدم آن باشد. برای برنامه هایی که الزامات تأخیر و نرخ فریم سختی دارند (مانند برنامه های صوتی یا واقعیت مجازی)، داشتن یک هسته CPU انحصاری می تواند سطح قابل قبولی از عملکرد را تضمین کند.
دستگاههایی که Android 7.0 یا بالاتر دارند، اکنون میتوانند یک هسته را به طور واضح برای برنامه پیشزمینه برتر رزرو کنند، عملکرد همه برنامههای پیشزمینه را بهبود میبخشند و به برنامههایی با بار کاری با شدت بالا کنترل بیشتری بر نحوه تخصیص کارشان در هستههای CPU میدهند.
برای پشتیبانی از یک هسته انحصاری در یک دستگاه:
-
cpusets
فعال کنید و یکcpuset
پیکربندی کنید که فقط شامل برنامه پیشزمینه بالایی باشد. - اطمینان حاصل کنید که یک هسته (این هسته انحصاری است) برای رشته های این
cpuset
رزرو شده است. - برای برگرداندن شماره هسته هسته انحصاری، getExclusiveCores API را پیاده سازی کنید.
برای تعیین اینکه کدام فرآیندها بر روی کدام هستهها برنامهریزی شدهاند، از systrace
در حین اجرای هر بار کاری استفاده کنید و بررسی کنید که هیچ رشته فضای کاربری از برنامههایی غیر از برنامه پیشزمینه بالا در هسته انحصاری برنامهریزی نشده است.
برای مشاهده پیاده سازی مرجع برای Nexus 6P، به android//device/huawei/angler/power/power.c
مراجعه کنید.