একাধিক রিফ্রেশ রেট

Android 11 একাধিক রিফ্রেশ রেট সহ ডিভাইসের জন্য সহায়তা যোগ করে। এই ফিচারে তিনটি প্রধান কম্পোনেন্ট আছে:

  • android.hardware.graphics.composer@2.4-এ নতুন HAL API যোগ করা হয়েছে।
  • বিভিন্ন রিফ্রেশ রেটের জন্য ডিভাইস কনফিগারেশন পার্স করতে এবং কাঙ্ক্ষিত রিফ্রেশ রেট সেট করতে প্ল্যাটফর্ম কোড
  • অ্যাপকে তার পছন্দসই ফ্রেম রেট সেট করতে দেওয়ার জন্য নতুন SDK এবং NDK API

প্রয়োগ

রিফ্রেশ রেট পরিবর্তন করার জন্য নির্দিষ্ট সহায়তা …-এ যোগ করা হয়েছে। আমরা এই ভার্সনটি ব্যবহার করার জন্য অত্যন্ত সাজেস্ট করি কারণ কম্পোজার HAL-এর আগের ভার্সনে রিফ্রেশ রেট পরিবর্তন করার জন্য সীমিত সহায়তা আছে।

কনফিগারেশন গ্রুপ

CONFIG_GROUP নামের একটি নতুন অ্যাট্রিবিউট IComposerClient::Attribute-এ যোগ করা হয়েছে, যা getDisplayAttribute_2_4 API ব্যবহার করে কোয়েরি করা যায়। এই অ্যাট্রিবিউট ভেন্ডরদের ডিসপ্লে কনফিগারেশন একসাথে গ্রুপ করতে দেয়। একই গ্রুপে কনফিগারেশন থাকলে, বেশিরভাগ ক্ষেত্রে সেগুলির মধ্যে নিরবচ্ছিন্নভাবে পাল্টানো যায়। কোন কোন কনফিগারেশনের মধ্যে পরিবর্তন করা যাবে তা আলাদা করতে এবং কোনও কনফিগারেশনের রিফ্রেশ রেট পরিবর্তন করতে, কিন্তু অন্যান্য অ্যাট্রিবিউট পরিবর্তন করতে নয়, প্ল্যাটফর্মটি config group ব্যবহার করে।

নিচের উদাহরণটি দেখুন যা চারটি ডিসপ্লে কনফিগারেশন কাজ করে এমন ডিভাইসের সাথে config গ্রুপ ব্যবহার করার সুবিধাগুলি দেখায়:

  • 1080p@60Hz
  • ১০৮০p@৯০Hz
  • 1080i@72Hz
  • 1080i@48Hz

ডিভাইসটি ৪৮হার্জ, ৬০হার্জ, ৭২হার্জ এবং ৯০হার্জ রিফ্রেশ রেট সাপোর্ট করলেও, ডিসপ্লেটি অন্য মোডে কাজ করে এবং ৬০হার্জ থেকে ৭২হার্জে পরিবর্তন করলে ডিসপ্লে কনফিগারেশন ১০৮০পিক্সেল থেকে ১০৮০আই-তে পরিবর্তিত হয়, যা কাঙ্ক্ষিত নাও হতে পারে। কনফিগার গ্রুপ এই সমস্যার সমাধান করে। একটি কনফিগারেশন গ্রুপে 60Hz ও 90Hz এবং অন্য কনফিগারেশন গ্রুপে 48Hz ও 72Hz-কে একসাথে গ্রুপ করার মাধ্যমে, প্ল্যাটফর্ম বুঝতে পারে যে এটি 60Hz ও 90Hz এবং 48Hz ও 72Hz-এর মধ্যে পরিবর্তন করতে পারে, কিন্তু 60Hz ও 72Hz-এর মধ্যে পরিবর্তন করতে পারে না, কারণ এর ফলে রিফ্রেশ রেট পরিবর্তন করার পরিবর্তে কনফিগারেশন পরিবর্তন হয়ে যায়।

Composer API আপডেট

getDisplayVsyncPeriod
রিফ্রেশ রেট পরিবর্তন করার সময় আরও ভালো কন্ট্রোল ও অনুমানযোগ্যতার জন্য, getDisplayVsyncPeriod যোগ করা হয়েছে। getDisplayVsyncPeriod ডিসপ্লে যে বর্তমান রিফ্রেশ রেটে (vsync পিরিয়ডের পরিভাষায়) কাজ করে তা দেখায়। এটি বিশেষ করে রিফ্রেশ রেটের মধ্যে ট্রানজিশন করার সময় কাজে লাগে এবং পরবর্তী ফ্রেম কখন শুরু করতে হবে তা নির্ধারণ করার জন্য প্ল্যাটফর্মের বর্তমান রিফ্রেশ রেট প্রয়োজন হয়।
setActiveConfigWithConstraints
setActiveConfigWithConstraints পদ্ধতি হল আগে থেকে থাকা setActiveConfig পদ্ধতির একটি নতুন এক্সটেনশন এবং এটি কনফিগারেশন পরিবর্তন সম্পর্কে আরও তথ্য প্রদান করে। সীমাবদ্ধতাগুলি vsyncPeriodChangeConstraints প্যারামিটারের অংশ হিসেবে দেওয়া হয় এবং এতে নিম্নলিখিত প্যারামিটার থাকে।
    desiredTimeNanos
    CLOCK_MONOTONIC-এ সেই সময় যার পরে vsync পিরিয়ড পরিবর্তন হতে পারে (অর্থাৎ, এই সময়ের আগে vsync পিরিয়ড পরিবর্তন করা যাবে না)। রিফ্রেশ রেট পরিবর্তনের জন্য প্ল্যাটফর্ম আগে থেকে পরিকল্পনা করতে চাইলে এটি কাজে লাগে, তবে ইতিমধ্যেই দেখানোর জন্য কিছু বাফার কোয়েরিতে আছে। প্ল্যাটফর্ম এই বাফারগুলি বিবেচনা করে সেই অনুযায়ী এই সময় সেট করে এবং নিশ্চিত করে যে রিফ্রেশ রেট ট্রানজিশন যতটা সম্ভব মসৃণ হবে।
    seamlessRequired
    সত্য হলে, এর জন্য প্রয়োজন যে vsync পিরিয়ড পরিবর্তন যেন কোনও রকম সমস্যা ছাড়াই হয় এবং কোনও দৃশ্যমান আর্টিফ্যাক্ট না থাকে। কন্টেন্ট পরিবর্তনের ফলে রিফ্রেশ রেট পরিবর্তন করার প্রয়োজন হলে, প্ল্যাটফর্ম এই ফ্ল্যাগ ব্যবহার করে (যেমন, ডিভাইসটি আইডল অবস্থায় আছে এবং অ্যানিমেশন শুরু হয়)। এর ফলে, কোনও কনফিগারেশন পরিবর্তন করলে যদি চোখে পড়ার মতো ভিজ্যুয়াল আর্টিফ্যাক্ট তৈরি হওয়ার সম্ভাবনা থাকে, তাহলে ভেন্ডর সেটি অনুমতি না দেওয়ার সুযোগ পায়। কনফিগারেশন সহজে পরিবর্তন করা না গেলে এবং seamlessRequired true হিসেবে সেট করা থাকলে, প্রয়োগ করার সময় রিটার্ন কোড হিসেবে SEAMLESS_NOT_POSSIBLE ফেরত দেওয়া এবং একই কনফিগারেশন সহজে পরিবর্তন করা গেলে নতুন onSeamlessPossible কলব্যাক কল করা হবে।

সফল হলে, ইমপ্লিমেন্টেশন একটি VsyncPeriodChangeTimeline রিটার্ন করে যা প্ল্যাটফর্মকে বলে যে কখন রিফ্রেশ রেট পরিবর্তন হওয়ার সম্ভাবনা আছে। newVsyncAppliedTimeNanos নতুন ডিসপ্লে CLOCK_MONOTONIC-এর সময় অনুযায়ী প্যারামিটার সেট করতে হবে, যাতে নতুন vsync পিরিয়ডে নতুন ডিসপ্লে রিফ্রেশ করা শুরু করা যায়। এটি, desiredTimeNanos-এর সাথে, প্ল্যাটফর্মকে রিফ্রেশ রেট সুইচ করার জন্য আগে থেকে প্ল্যান করতে এবং নতুন রিফ্রেশ রেটের জন্য আগে থেকে অ্যাপ টিক করা শুরু করতে দেয়। এর ফলে রিফ্রেশ রেট নির্বিঘ্নে পরিবর্তন করা যায়।

কিছু ইমপ্লিমেন্টেশনের ক্ষেত্রে রিফ্রেশ রেট পাঠানোর আগে রিফ্রেশ ফ্রেম পাঠাতে হয়। এর জন্য, HAL-এ refreshRequired প্যারামিটার আছে যা রিফ্রেশ ফ্রেমের প্রয়োজনীয়তা নির্দেশ করে এবং refreshTimeNanos প্রথম vsync নির্দেশ করে যেখানে রিফ্রেশ ফ্রেম পরে পাঠাতে হবে।

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 সেই অনুযায়ী ডিফল্ট কনফিগারেশন আইডি সেট করে এবং কনফিগারেশনের রিফ্রেশ রেটের সাথে ম্যাচ করার জন্য ন্যূনতম ও সর্বাধিক রিফ্রেশ রেট সেট করে।
    • ব্যাটারি সেভার: ডিভাইস কম পাওয়ার মোডে থাকলে রিফ্রেশ রেট 60Hz বা তার কম হয়, যা Settings.Global.LOW_POWER_MODE.-এর মাধ্যমে বোঝানো হয়

DisplayManager নীতি সেট করার পরে, SurfaceFlinger অ্যাক্টিভ লেয়ারের (যে লেয়ার ফ্রেম আপডেট কিউ করে) উপর ভিত্তি করে রিফ্রেশ রেট সেট করে। লেয়ারের মালিক ফ্রেম রেট সেট করলে, SurfaceFlinger রিফ্রেশ রেটকে এমন কিছুতে সেট করার চেষ্টা করে যা সেই রেটের মাল্টিপ্লায়ার। যেমন, দুটি অ্যাক্টিভ লেয়ার যদি তাদের ফ্রেম রেট ২৪ ও ৬০ হিসেবে সেট করে, তাহলে SurfaceFlinger উপলভ্য থাকলে ১২০Hz বেছে নেবে। SurfaceFlinger-এর জন্য এই ধরনের রিফ্রেশ রেট উপলভ্য না থাকলে, এটি এমন রিফ্রেশ রেট বেছে নেওয়ার চেষ্টা করবে যেটির ফ্রেম রেটে সবচেয়ে কম সমস্যা আছে। আরও তথ্যের জন্য, developer.android.com লিঙ্কে গিয়ে ডেভেলপার ডকুমেন্টেশন দেখুন

রিফ্রেশ রেট কীভাবে নির্ধারণ করা হবে তা নিয়ন্ত্রণ করতে SurfaceFlinger নিম্নলিখিত ফ্ল্যাগগুলি বজায় রাখে:

  • ro.surface_flinger.use_content_detection_for_refresh_rate: সেট করা থাকলে, ফ্রেম রেট সেট করা না থাকলেও, অ্যাক্টিভ লেয়ারের ভিত্তিতে রিফ্রেশ রেট নির্ধারণ করা হয়। SurfaceFlinger একটি হিউরিস্টিক বজায় রাখে যেখানে এটি লেয়ারের পোস্ট করা বাফারের গড় fps খুঁজে বের করে, এর জন্য বাফারের সাথে অ্যাটাচ করা প্রেজেন্টেশন টাইমস্ট্যাম্প দেখে।
  • ro.surface_flinger.set_touch_timer_ms: যদি > ০ হয়, তাহলে কনফিগার করা টাইমআউটের জন্য ব্যবহারকারী স্ক্রিন স্পর্শ করলে ডিফল্ট রিফ্রেশ রেট ব্যবহার করা হবে। অ্যানিমেশনের জন্য ডিফল্ট রিফ্রেশ রেট রেডি রাখতে এই হিউরিস্টিক করা হয়।
  • ro.surface_flinger.set_idle_timer_ms: > ০ হলে, কনফিগার করা টাইমআউটের জন্য কোনও স্ক্রিন আপডেট না থাকলে ন্যূনতম রিফ্রেশ রেট ব্যবহার করা হবে।
  • ro.surface_flinger.set_display_power_timer_ms: > 0 হলে, কনফিগার করা টাইমআউটের জন্য ডিসপ্লে চালু করার সময় (বা AOD থেকে বেরিয়ে আসার সময়) ডিফল্ট রিফ্রেশ রেট ব্যবহার করা হবে।

Frame Rate API

ফ্রেম রেট API, অ্যাপগুলিকে তাদের কাঙ্ক্ষিত ফ্রেম রেট সম্পর্কে Android প্ল্যাটফর্মকে জানাতে দেয় এবং এটি Android 11-এর জন্য তৈরি করা অ্যাপে উপলভ্য। ফ্রেম রেট API সম্পর্কে আরও জানতে, developer.android.com লিঙ্কে গিয়ে ডেভেলপার ডকুমেন্টেশন দেখুন।

ডেভেলপার বিকল্প

মেনুতে একটি নতুন ডেভেলপার বিকল্প যোগ করা হয়েছে যা বর্তমান রিফ্রেশ রেট সহ ডিসপ্লেতে ওভারলে টগল করে। নতুন বিকল্পটি এখানে আছে: সেটিংস > সিস্টেম > ডেভেলপার বিকল্প > রিফ্রেশ রেট দেখুন।