نرخ بازآوری چندگانه

Android 11 پشتیبانی از دستگاه‌های دارای چند نرخ بازآوری را اضافه می‌کند. این ویژگی سه بخش اصلی دارد:

  • میاناهای برنامه‌سازی کاربردی HAL جدید در android.hardware.graphics.composer@2.4 معرفی شده است.
  • کد پلاتفرم برای تجزیه پیکربندی‌های دستگاه برای نرخ‌های بازآوری مختلف و تنظیم نرخ بازآوری موردنظر
  • میاناهای برنامه‌سازی کاربردی جدید کیت توسعه نرم‌افزار و کیت توسعه بومی برای اینکه برنامه‌ها بتوانند نرخ فریم موردنظرشان را تنظیم کنند

پیاده‌سازی

پشتیبانی اختصاصی برای تعویض نرخ بازآوری به … اضافه شده است. توصیه می‌کنیم حتماً از این نسخه استفاده کنید زیرا نسخه‌های قبلی composer HAL پشتیبانی محدودی از تعویض نرخ بازآوری دارند.

گروه‌های پیکربندی

مشخصه جدیدی به‌نام CONFIG_GROUP به IComposerClient::Attribute اضافه شد که بااستفاده از getDisplayAttribute_2_4 API قابل‌پرسش است. این مشخصه به فروشندگان امکان می‌دهد پیکربندی‌های نمایشگر را با هم گروه‌بندی کنند. پیکربندی‌های موجود در یک گروه امکان جابه‌جایی یکپارچه بین آن‌ها را در اکثر موارد فراهم می‌کند. پلاتفرم از گروه پیکربندی برای تشخیص اینکه کدام پیکربندی‌ها می‌توانند بین نرخ‌های بازآوری جابه‌جا شوند استفاده می‌کند و نه دیگر مشخصه‌های پیکربندی.

مثال زیر را درنظر بگیرید که مزایای استفاده از گروه‌های پیکربندی را با دستگاهی که از چهار پیکربندی نمایشگر پشتیبانی می‌کند نشان می‌دهد:

  • ‫۱۰۸۰ پیکسل با ۶۰ هرتز
  • ‫۱۰۸۰ پیکسل با ۹۰ هرتز
  • ‫1080i@72Hz
  • ‫۱۰۸۰i@۴۸ هرتز

بااینکه دستگاه از نرخ‌های بازآوری ۴۸ هرتز، ۶۰ هرتز، ۷۲ هرتز، و ۹۰ هرتز پشتیبانی می‌کند، نمایشگر در حالت دیگری کار می‌کند و جابه‌جایی از ۶۰ هرتز به ۷۲ هرتز پیکربندی نمایشگر را از ۱۰۸۰p به ۱۰۸۰i تغییر می‌دهد که ممکن است رفتار مطلوبی نباشد. گروه‌های پیکربندی این مشکل را حل می‌کنند. با گروه‌بندی ۶۰ هرتز و ۹۰ هرتز در یک گروه پیکربندی و ۴۸ هرتز و ۷۲ هرتز در گروه پیکربندی دیگر، پلاتفرم می‌داند که می‌تواند بین ۶۰ هرتز و ۹۰ هرتز و بین ۴۸ هرتز و ۷۲ هرتز جابه‌جا شود، اما نمی‌تواند بین ۶۰ هرتز و ۷۲ هرتز جابه‌جا شود زیرا این کار منجر به تغییر پیکربندی می‌شود، نه صرفاً تغییر نرخ بازآوری.

به‌روزرسانی‌های Composer API

getDisplayVsyncPeriod
برای کنترل و پیش‌بینی بهتر هنگام تغییر نرخ‌های بازآوری، getDisplayVsyncPeriod اضافه شده است. getDisplayVsyncPeriod نرخ بازآوری فعلی (برحسب دوره همگام‌سازی عمودی) را که نمایشگر با آن کار می‌کند برمی‌گرداند. این امر به‌ویژه هنگام انتقال بین نرخ‌های بازآوری مفید است، و پلاتفرم برای تصمیم‌گیری درباره زمان شروع قاب بعدی به نرخ بازآوری فعلی نیاز دارد.
setActiveConfigWithConstraints
روش setActiveConfigWithConstraints افزونه جدیدی برای روش setActiveConfig موجود است و اطلاعات بیشتری درباره تغییر پیکربندی ارائه می‌دهد. محدودیت‌ها به‌عنوان بخشی از پارامترهای vsyncPeriodChangeConstraints ارائه می‌شوند و شامل پارامترهای زیر هستند.
    desiredTimeNanos
    زمان در CLOCK_MONOTONIC که پس‌از آن دوره همگام‌سازی عمودی می‌تواند تغییر کند (یعنی دوره همگام‌سازی عمودی نباید قبل‌از این زمان تغییر کند). این مورد زمانی مفید است که پلاتفرم بخواهد ازقبل برای تغییر نرخ بازآوری برنامه‌ریزی کند اما ازقبل چند بافر در صف برای ارائه داشته باشد. پلاتفرم این زمان را متناسب با این حاشیه‌ها تنظیم می‌کند و مطمئن می‌شود که گذار نرخ بازسازی تا حد امکان روان باشد.
    یکپارچه الزامی است
    اگر درست باشد، لازم است که تغییر دوره همگام‌سازی عمودی به‌طور یکپارچه و بدون آرتیفکت بصری قابل‌توجهی اتفاق بیفتد. وقتی تغییر نرخ بازسازی درنتیجه تغییر محتوا لازم باشد (برای مثال، دستگاه در حالت آماده‌به‌کار است و پویانمایی شروع می‌شود)، پلاتفرم از این پرچم استفاده می‌کند. این کار به فروشنده فرصت می‌دهد تا وقتی تغییرات پیکربندی خاصی ممکن است منجر به یک مصنوع دیداری قابل‌توجه شود، اجازه ندهد این تغییرات اعمال شود. اگر پیکربندی‌ها را نمی‌توان به‌طور یکپارچه تغییر داد و seamlessRequired روی true تنظیم شده است، انتظار می‌رود پیاده‌سازی SEAMLESS_NOT_POSSIBLE را به‌عنوان کد برگشتی برگرداند و وقتی همان تغییر پیکربندی را می‌توان به‌طور یکپارچه انجام داد، با onSeamlessPossible برگشتی جدید تماس بگیرد.

درصورت موفقیت، پیاده‌سازی VsyncPeriodChangeTimeline را برمی‌گرداند که به پلاتفرم می‌گوید تغییر نرخ بازآوری را چه زمانی انتظار داشته باشد. newVsyncAppliedTimeNanos پارامترها باید روی زمان در CLOCK_MONOTONIC تنظیم شوند که نمایشگر جدید شروع به بازآوری در دوره همگام‌سازی عمودی جدید می‌کند. این، به‌همراه desiredTimeNanos، به پلاتفرم اجازه می‌دهد ازقبل برای تغییر نرخ بازآوری برنامه‌ریزی کند و برنامه‌ها را ازقبل برای نرخ بازآوری جدید شروع کند. این کار انتقال یکپارچه نرخ بازآوری را امکان‌پذیر می‌کند.

برخی‌از پیاده‌سازی‌ها نیاز دارند که قبل‌از ارسال نرخ بازآوری، قاب بازآوری ارسال شود. برای این کار، HAL پارامتر refreshRequired را دارد تا نشان دهد قاب بازآوری لازم است و refreshTimeNanos را دارد تا اولین همگام‌سازی عمودی را که قاب بازآوری باید پس‌از آن ارسال شود نشان دهد.

onVsyncPeriodTimingChanged [callback]
یک فراخوانی برگشتی جدید که HAL می‌تواند برای نشان دادن به پلاتفرم که برخی از پارامترهای خط زمان تغییر کرده است و پلاتفرم باید خط زمان خود را تنظیم کند، فراخوانی کند. اگر به‌دلیلی جدول زمانی قدیمی به‌دلیل زمان پردازش طولانی در HAL یا قاب بازآوری دیر هنگام ازدست رفت، انتظار می‌رود این برگشت تماس فراخوانی شود.

پلاتفرم چگونه تصمیم می‌گیرد نرخ بازآوری را تغییر دهد؟

انتخاب نرخ بازآوری در دو سرویس سیستم زیر انجام می‌شود:

DisplayManager
DisplayManager خط‌مشی سطح بالا را درباره نرخ بازآوری تنظیم می‌کند. این کار پیکربندی نمایش پیش‌فرضی را تنظیم می‌کند که با پیکربندی HAL آهنگ‌ساز یکسان است. علاوه‌براین، محدوده‌ای از مقادیر حداقل و حداکثر برای SurfaceFlinger تعیین می‌کند تا به‌عنوان نرخ بازآوری انتخاب کند.
SurfaceFlinger
با تنظیم پیکربندی‌ای که در همان گروه پیکربندی پیکربندی پیش‌فرض است و نرخ بازآوری آن در محدوده حداقل/حداکثر است، نرخ بازآوری را تعیین می‌کند.

«مدیر نمایش» مراحل زیر را برای تعیین خط‌مشی طی می‌کند:

  • شناسه پیکربندی پیش‌فرض را با پُرسمان کردن پیکربندی فعال از SurfaceFlinger پیدا می‌کند
  • محدود کردن دامنه مقادیر حداقل و حداکثر با تکرار کردن شرایط سیستم
    • تنظیم نرخ بازآوری پیش‌فرض: مقدار نرخ بازآوری پیش‌فرض در رونهاد پیکربندی R.integer.config_defaultRefreshRate تنظیم می‌شود. از این مقدار برای تعیین نرخ بازسازی استاندارد دستگاه برای پویانمایی‌ها و تعامل‌های لمسی استفاده می‌شود.
    • تنظیم نرخ بازآوری اوج: مقدار نرخ بازآوری اوج از Settings.System.PEAK_REFRESH_RATE خوانده می‌شود. این مقدار در زمان اجرا تغییر می‌کند تا تنظیمات فعلی دستگاه (مثلاً از گزینه منو) را منعکس کند. مقدار پیش‌فرض در رونهاد پیکربندی R.integer.config_defaultPeakRefreshRate تنظیم می‌شود.
    • تنظیم حداقل نرخ بازآوری: مقدار حداقل نرخ بازآوری از Settings.System.MIN_REFRESH_RATE خوانده می‌شود. این مقدار می‌تواند در زمان اجرا تغییر کند تا تنظیمات فعلی دستگاه را منعکس کند (مثلاً از گزینه منو). مقدار پیش‌فرض ۰ است، بنابراین حداقل پیش‌فرضی وجود ندارد.
    • ‫ModeId درخواستی برنامه: برنامه‌ها می‌توانند WindowManager.LayoutParams.preferredDisplayModeId را تنظیم کنند تا پیکربندی ترجیحی را که نمایشگر باید در آن کار کند منعکس کنند. در بیشتر شرایط، DisplayManager شناسه پیکربندی پیش‌فرض را متناسب با آن تنظیم می‌کند و حداقل و حداکثر نرخ بازآوری را برای مطابقت با نرخ بازآوری پیکربندی تنظیم می‌کند.
    • بهینه‌سازی باتری: وقتی دستگاه در حالت کم‌مصرف است، نرخ بازسازی به ۶۰ هرتز یا کمتر محدود می‌شود، که با Settings.Global.LOW_POWER_MODE. نشان داده می‌شود

پس‌از اینکه DisplayManager خط‌مشی را تنظیم کرد، SurfaceFlinger نرخ بازآوری را براساس لایه‌های فعال (لایه‌هایی که به‌روزرسانی‌های قاب را در صف قرار می‌دهند) تنظیم می‌کند. اگر مالک لایه نرخ فریم را تنظیم کند، SurfaceFlinger سعی می‌کند نرخ بازآوری را روی مقداری تنظیم کند که مضربی از آن نرخ باشد. برای مثال، اگر دو لایه فعال نرخ قاب خود را روی ۲۴ و ۶۰ تنظیم کنند، SurfaceFlinger درصورت دردسترس بودن، ۱۲۰ هرتز را انتخاب خواهد کرد. اگر چنین نرخ بازآوری برای SurfaceFlinger دردسترس نباشد، سعی می‌کند نرخ بازآوری‌ای را انتخاب کند که کمترین خطا را برای نرخ فریم داشته باشد. برای اطلاعات بیشتر، به اسناد توسعه‌دهنده در developer.android.com مراجعه کنید

‫SurfaceFlinger پرچم‌های زیر را برای کنترل نحوه تعیین نرخ بازآوری حفظ می‌کند:

  • ro.surface_flinger.use_content_detection_for_refresh_rate: اگر تنظیم شده باشد، نرخ بازآوری براساس لایه‌های فعال تعیین می‌شود، حتی اگر نرخ فریمی تنظیم نشده باشد. ‫SurfaceFlinger از یک روش اکتشافی استفاده می‌کند که در آن با بررسی مُهر زمان ارائه پیوست‌شده به بافر، میانگین نرخ فریم در ثانیه لایه را که بافرها را پست می‌کند پیدا می‌کند.
  • ‫ro.surface_flinger.set_touch_timer_ms: اگر > ۰، نرخ بازآوری پیش‌فرض وقتی کاربر صفحه را برای زمان اتمام پیکربندی‌شده لمس می‌کند استفاده خواهد شد. این اکتشافی برای آماده بودن با نرخ بازآوری پیش‌فرض برای پویانمایی‌ها انجام می‌شود.
  • ‫ro.surface_flinger.set_idle_timer_ms: اگر > ۰ باشد، وقتی برای زمان اتمام پیکربندی‌شده به‌روزرسانی صفحه وجود نداشته باشد، از حداقل نرخ بازآوری استفاده خواهد شد.
  • ro.surface_flinger.set_display_power_timer_ms: اگر > ۰، نرخ بازآوری پیش‌فرض هنگام روشن کردن نمایشگر (یا هنگام خروج از «نمایشگر همیشه روشن») برای زمان‌بندی پیکربندی‌شده استفاده خواهد شد.

Frame Rate API

میانای برنامه‌سازی کاربردی نرخ فریم به برنامه‌ها اجازه می‌دهد نرخ فریم موردنظرشان را به پلاتفرم Android اطلاع دهند و در برنامه‌هایی که Android 11 را هدف قرار می‌دهند دردسترس است. برای کسب اطلاعات بیشتر درباره میانای برنامه‌سازی کاربردی نرخ فریم، اسناد توسعه‌دهنده را در developer.android.com بررسی کنید.

گزینه‌های توسعه‌دهندگان

گزینه توسعه‌دهنده جدیدی به منو اضافه شده است که رونهادی را روی نمایشگر با نرخ بازآوری فعلی روشن می‌کند. گزینه جدید در تنظیمات > سیستم > گزینه‌های تولیدکننده نرم‌افزار > نمایش نرخ بازسازی قرار دارد.