نرخ تازه سازی چندگانه

اندروید ۱۱ از دستگاه‌هایی با نرخ تازه‌سازی چندگانه پشتیبانی می‌کند. این ویژگی سه جزء اصلی دارد:

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

پیاده‌سازی

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

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

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

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

  • 1080p@60Hz
  • 1080p@90Hz
  • 1080i@72Hz
  • 1080i@48Hz

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

به‌روزرسانی‌های API کامپوزر

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

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

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

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

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

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

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

مدیر نمایش برای تعیین سیاست، مراحل زیر را طی می‌کند:

  • با جستجوی پیکربندی فعال از SurfaceFlinger ، شناسه پیکربندی پیش‌فرض را پیدا می‌کند.
  • محدود کردن محدوده مقادیر حداقل و حداکثر با تکرار در شرایط سیستم
    • تنظیم نرخ تازه‌سازی پیش‌فرض : مقدار نرخ تازه‌سازی پیش‌فرض در پوشش پیکربندی R.integer.config_defaultRefreshRate تنظیم شده است. این مقدار برای تعیین نرخ تازه‌سازی استاندارد دستگاه برای انیمیشن‌ها و تعاملات لمسی استفاده می‌شود.
    • تنظیم حداکثر نرخ تازه‌سازی : مقدار حداکثر نرخ تازه‌سازی از Settings.System.PEAK_REFRESH_RATE خوانده می‌شود. این مقدار در زمان اجرا تغییر می‌کند تا تنظیمات فعلی دستگاه (مانند یک گزینه منو) را منعکس کند. مقدار پیش‌فرض در پوشش پیکربندی R.integer.config_defaultPeakRefreshRate تنظیم شده است.
    • تنظیم حداقل نرخ تازه‌سازی : مقدار حداقل نرخ تازه‌سازی از Settings.System.MIN_REFRESH_RATE خوانده می‌شود. این مقدار را می‌توان در زمان اجرا تغییر داد تا تنظیمات فعلی دستگاه (مانند یک گزینه منو) را منعکس کند. مقدار پیش‌فرض 0 است، بنابراین حداقل پیش‌فرضی وجود ندارد.
    • درخواست 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 : اگر > 0 باشد، نرخ تازه‌سازی پیش‌فرض زمانی استفاده می‌شود که کاربر برای مدت زمان تنظیم‌شده، صفحه را لمس کند. این اکتشاف برای آماده‌سازی با نرخ تازه‌سازی پیش‌فرض برای انیمیشن‌ها انجام می‌شود.
  • ro.surface_flinger.set_idle_timer_ms : اگر > 0 باشد، حداقل نرخ تازه‌سازی زمانی استفاده می‌شود که هیچ به‌روزرسانی صفحه برای زمان‌بندی پیکربندی‌شده وجود نداشته باشد.
  • ro.surface_flinger.set_display_power_timer_ms : اگر > 0 باشد، هنگام روشن کردن صفحه نمایش (یا هنگام خروج از حالت AOD) برای مدت زمان تنظیم شده، از نرخ به‌روزرسانی پیش‌فرض استفاده خواهد شد.

API نرخ فریم

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

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

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