অ্যান্ড্রয়েড ১১-এ একাধিক রিফ্রেশ রেটযুক্ত ডিভাইসের জন্য সমর্থন যোগ করা হয়েছে। এই বৈশিষ্ট্যটির তিনটি প্রধান উপাদান রয়েছে:
-
android.hardware.graphics.composer@2.4এ নতুন HAL API চালু করা হয়েছে। - বিভিন্ন রিফ্রেশ রেটের জন্য ডিভাইস কনফিগারেশন পার্স করতে এবং কাঙ্ক্ষিত রিফ্রেশ রেট সেট করতে প্ল্যাটফর্ম কোড।
- নতুন SDK এবং NDK API-এর মাধ্যমে অ্যাপগুলো তাদের পছন্দসই ফ্রেম রেট সেট করতে পারবে।
বাস্তবায়ন
রিফ্রেশ রেট স্যুইচিং-এর জন্য বিশেষ সাপোর্ট যোগ করা হয়েছে… আমরা এই সংস্করণটি ব্যবহার করার জন্য দৃঢ়ভাবে সুপারিশ করছি, কারণ কম্পোজার HAL-এর পূর্ববর্তী সংস্করণগুলিতে রিফ্রেশ রেট স্যুইচিং-এর সীমিত সাপোর্ট ছিল।
কনফিগারেশন গ্রুপ
IComposerClient::Attribute এ CONFIG_GROUP নামে একটি নতুন অ্যাট্রিবিউট যোগ করা হয়েছে, যা getDisplayAttribute_2_4 API ব্যবহার করে কোয়েরি করা যায়। এই অ্যাট্রিবিউটটি ভেন্ডরদের ডিসপ্লে কনফিগারেশনগুলোকে একসাথে গ্রুপ করতে দেয়। একই গ্রুপের কনফিগারেশনগুলো বেশিরভাগ ক্ষেত্রে নির্বিঘ্নে একে অপরের মধ্যে সুইচ করার সুযোগ দেয়। প্ল্যাটফর্মটি কনফিগারেশন গ্রুপ ব্যবহার করে এটি নির্ধারণ করে যে, কোন কনফিগারেশনগুলোর মধ্যে শুধু রিফ্রেশ রেট পরিবর্তন করা যাবে, কিন্তু অন্য কোনো অ্যাট্রিবিউটের ক্ষেত্রে তা করা যাবে না।
নিম্নলিখিত উদাহরণটি বিবেচনা করুন যা চারটি ডিসপ্লে কনফিগারেশন সমর্থন করে এমন একটি ডিভাইসের সাথে কনফিগ গ্রুপ ব্যবহারের সুবিধাগুলি প্রদর্শন করে:
- ১০৮০পি@৬০হার্জ
- ১০৮০পি@৯০হার্জ
- ১০৮০আই@৭২হার্জ
- ১০৮০আই@৪৮হার্জ
যদিও ডিভাইসটি 48Hz, 60Hz, 72Hz, এবং 90Hz রিফ্রেশ রেট সমর্থন করে, ডিসপ্লেটি একটি ভিন্ন মোডে কাজ করে, এবং 60Hz থেকে 72Hz-এ পরিবর্তন করলে ডিসপ্লে কনফিগারেশন 1080p থেকে 1080i-তে পরিবর্তিত হয়, যা কাঙ্ক্ষিত নাও হতে পারে। কনফিগারেশন গ্রুপ এই সমস্যার সমাধান করে। 60Hz এবং 90Hz-কে একটি কনফিগারেশন গ্রুপে এবং 48Hz এবং 72Hz-কে অন্য একটি কনফিগারেশন গ্রুপে একত্রিত করার মাধ্যমে, প্ল্যাটফর্মটি বুঝতে পারে যে এটি 60Hz এবং 90Hz-এর মধ্যে এবং 48Hz এবং 72Hz-এর মধ্যে পরিবর্তন করতে পারবে, কিন্তু 60Hz এবং 72Hz-এর মধ্যে পারবে না, কারণ এর ফলে শুধুমাত্র রিফ্রেশ রেট পরিবর্তন না হয়ে কনফিগারেশন পরিবর্তন হয়ে যায়।


কম্পোজার এপিআই আপডেট
- getDisplayVsyncPeriod
- রিফ্রেশ রেট পরিবর্তনের সময় আরও ভালো নিয়ন্ত্রণ এবং পূর্বাভাসযোগ্যতার জন্য
getDisplayVsyncPeriodযোগ করা হয়েছে।getDisplayVsyncPeriodডিসপ্লেটির বর্তমান রিফ্রেশ রেট (vsync পিরিয়ডের হিসাবে) রিটার্ন করে। রিফ্রেশ রেট পরিবর্তনের সময় এটি বিশেষভাবে উপযোগী, কারণ পরবর্তী ফ্রেম কখন শুরু করতে হবে তা নির্ধারণ করার জন্য প্ল্যাটফর্মের বর্তমান রিফ্রেশ রেট প্রয়োজন হয়। - setActiveConfigWithConstraints
-
setActiveConfigWithConstraintsমেথডটি হলো বিদ্যমানsetActiveConfigমেথডের একটি নতুন বর্ধিত রূপ এবং এটি কনফিগারেশন পরিবর্তন সম্পর্কে আরও তথ্য প্রদান করে। সীমাবদ্ধতাগুলোvsyncPeriodChangeConstraintsপ্যারামিটারগুলোর অংশ হিসেবে দেওয়া হয় এবং এতে নিম্নলিখিত প্যারামিটারগুলো থাকে। - কাঙ্ক্ষিত টাইম ন্যানোস
-
CLOCK_MONOTONICএ থাকা সেই সময়, যার পরে vsync পিরিয়ড পরিবর্তিত হতে পারে (অর্থাৎ, এই সময়ের আগে vsync পিরিয়ড পরিবর্তিত হওয়া যাবে না)। এটি তখন কাজে আসে যখন প্ল্যাটফর্ম রিফ্রেশ রেট পরিবর্তনের জন্য আগে থেকে পরিকল্পনা করতে চায়, কিন্তু তার কিউ-তে উপস্থাপনের জন্য আগে থেকেই কিছু বাফার জমা থাকে। প্ল্যাটফর্ম সেই বাফারগুলোর কথা মাথায় রেখে এবং রিফ্রেশ রেট পরিবর্তনটি যথাসম্ভব মসৃণ হয় তা নিশ্চিত করতে সেই অনুযায়ী এই সময়টি নির্ধারণ করে। - নির্বিঘ্ন প্রয়োজনীয়
- যদি এটি সত্য হয়, তবে vsync পিরিয়ডের পরিবর্তনটি কোনো লক্ষণীয় ভিজ্যুয়াল আর্টিফ্যাক্ট ছাড়াই নির্বিঘ্নে সম্পন্ন হওয়া আবশ্যক। প্ল্যাটফর্মটি এই ফ্ল্যাগটি ব্যবহার করে যখন কোনো কন্টেন্ট পরিবর্তনের ফলে রিফ্রেশ রেট পরিবর্তনের প্রয়োজন হয় (উদাহরণস্বরূপ, ডিভাইসটি নিষ্ক্রিয় থাকা অবস্থায় অ্যানিমেশন শুরু হলে)। এটি ভেন্ডরকে এমন কিছু কনফিগারেশন পরিবর্তন অনুমোদন না করার সুযোগ দেয়, যেগুলোর ফলে একটি লক্ষণীয় ভিজ্যুয়াল আর্টিফ্যাক্ট তৈরি হতে পারে। যদি কনফিগারেশনগুলো নির্বিঘ্নে পরিবর্তন করা না যায় এবং
seamlessRequiredtrueসেট করা থাকে, তবে আশা করা যায় যে ইমপ্লিমেন্টেশনটি রিটার্ন কোড হিসেবেSEAMLESS_NOT_POSSIBLEরিটার্ন করবে এবং যখন একই কনফিগারেশন পরিবর্তন নির্বিঘ্নে করা যাবে, তখন নতুনonSeamlessPossibleকলব্যাকটি কল করবে। সফল হলে, ইমপ্লিমেন্টেশনটি একটি
VsyncPeriodChangeTimelineরিটার্ন করে, যা প্ল্যাটফর্মকে জানিয়ে দেয় কখন রিফ্রেশ রেট পরিবর্তনটি ঘটবে বলে আশা করা যায়।newVsyncAppliedTimeNanosপ্যারামিটারটিকেCLOCK_MONOTONICএর সেই সময়ে সেট করতে হবে, যখন নতুন vsync পিরিয়ডে নতুন ডিসপ্লেটি রিফ্রেশ হওয়া শুরু করবে। এটি,desiredTimeNanosসাথে মিলে, প্ল্যাটফর্মকে রিফ্রেশ রেট পরিবর্তনের জন্য আগে থেকেই পরিকল্পনা করতে এবং নতুন রিফ্রেশ রেটের জন্য অ্যাপগুলোকে আগে থেকেই টিক দেওয়া শুরু করতে সাহায্য করে। এর ফলে রিফ্রেশ রেটের একটি নির্বিঘ্ন পরিবর্তন সম্ভব হয়।কিছু ক্ষেত্রে রিফ্রেশ রেট পাঠানোর আগে একটি রিফ্রেশ ফ্রেম পাঠানোর প্রয়োজন হয়। এর জন্য, HAL-এ
refreshRequiredপ্যারামিটারটি থাকে যা নির্দেশ করে যে একটি রিফ্রেশ ফ্রেমের প্রয়োজন আছে, এবংrefreshTimeNanosপ্যারামিটারটি নির্দেশ করে যে এর পরে প্রথম কোন vsync-এর জন্য একটি রিফ্রেশ ফ্রেম পাঠাতে হবে।- onVsyncPeriodTimingChanged [কলব্যাক]
- একটি নতুন কলব্যাক যা HAL, প্ল্যাটফর্মকে জানাতে কল করতে পারে যে টাইমলাইনের কোনো প্যারামিটার পরিবর্তিত হয়েছে এবং প্ল্যাটফর্মকে তার টাইমলাইন সামঞ্জস্য করতে হবে। যদি কোনো কারণে HAL-এ দীর্ঘ প্রক্রিয়াকরণের সময় বা একটি বিলম্বিত রিফ্রেশ ফ্রেমের জন্য পুরানো টাইমলাইনটি হারিয়ে যায়, তবে এই কলব্যাকটি কল করা হবে বলে আশা করা হচ্ছে।
প্ল্যাটফর্মটি কীভাবে রিফ্রেশ রেট পরিবর্তন করার সিদ্ধান্ত নেয়?
নিম্নলিখিত দুটি সিস্টেম সার্ভিসে রিফ্রেশ রেট নির্বাচন করা হয়:
- ডিসপ্লেম্যানেজার
-
DisplayManagerরিফ্রেশ রেট সংক্রান্ত উচ্চ-স্তরের নীতি নির্ধারণ করে। এটি একটি ডিফল্ট ডিসপ্লে কনফিগারেশন সেট করে, যা কম্পোজার HAL কনফিগারেশনের মতোই। এছাড়াও, এটিSurfaceFlingerরিফ্রেশ রেট হিসেবে বেছে নেওয়ার জন্য সর্বনিম্ন এবং সর্বোচ্চ মানের একটি পরিসীমা নির্ধারণ করে দেয়। - সারফেসফ্লিঙ্গার
- ডিফল্ট কনফিগের মতো একই কনফিগ গ্রুপে থাকা এবং সর্বনিম্ন/সর্বোচ্চ সীমার মধ্যে রিফ্রেশ রেট সহ একটি কনফিগ সেট করার মাধ্যমে রিফ্রেশ রেট নির্ধারণ করা হয়।
পলিসি নির্ধারণ করার জন্য ডিসপ্লে ম্যানেজার নিম্নলিখিত ধাপগুলো অনুসরণ করে:
-
SurfaceFlingerথেকে সক্রিয় কনফিগারেশন কোয়েরি করে ডিফল্ট কনফিগারেশন আইডি খুঁজে বের করে। - সিস্টেমের শর্তাবলির ওপর পুনরাবৃত্তির মাধ্যমে সর্বনিম্ন ও সর্বোচ্চ মানের পরিসর সীমিত করা।
- ডিফল্ট রিফ্রেশ রেট সেটিং : ডিফল্ট রিফ্রেশ রেটের মান
R.integer.config_defaultRefreshRateকনফিগ ওভারলে-তে সেট করা থাকে। এই মানটি অ্যানিমেশন এবং টাচ ইন্টারঅ্যাকশনের জন্য ডিভাইসের স্ট্যান্ডার্ড রিফ্রেশ রেট নির্ধারণ করতে ব্যবহৃত হয়। - সর্বোচ্চ রিফ্রেশ রেট সেটিং : সর্বোচ্চ রিফ্রেশ রেটের মান
Settings.System.PEAK_REFRESH_RATEথেকে নেওয়া হয়। বর্তমান ডিভাইস সেটিং (যেমন কোনো মেনু অপশন থেকে) অনুযায়ী এই মানটি রানটাইমে পরিবর্তিত হয়। ডিফল্ট মানটিR.integer.config_defaultPeakRefreshRateকনফিগ ওভারলে-তে সেট করা থাকে। - সর্বনিম্ন রিফ্রেশ রেট সেটিং : সর্বনিম্ন রিফ্রেশ রেটের মান
Settings.System.MIN_REFRESH_RATEথেকে নেওয়া হয়। বর্তমান ডিভাইস সেটিং অনুযায়ী এই মানটি রানটাইমে পরিবর্তন করা যেতে পারে (যেমন কোনো মেনু অপশন থেকে)। এর ডিফল্ট মান হলো ০, তাই কোনো ডিফল্ট সর্বনিম্ন মান নেই। - অ্যাপ্লিকেশন অনুরোধকৃত মোডআইডি : অ্যাপগুলো তাদের পছন্দের কনফিগারেশন অনুযায়ী ডিসপ্লে পরিচালনার জন্য
WindowManager.LayoutParams.preferredDisplayModeIdসেট করতে পারে। বেশিরভাগ ক্ষেত্রে,DisplayManagerসেই অনুযায়ী ডিফল্ট কনফিগারেশন আইডি সেট করে এবং কনফিগারেশনের রিফ্রেশ রেটের সাথে মিলিয়ে সর্বনিম্ন ও সর্বোচ্চ রিফ্রেশ রেট নির্ধারণ করে। - ব্যাটারি সেভার : ডিভাইসটি লো পাওয়ার মোডে থাকলে রিফ্রেশ রেট ৬০ হার্টজ বা তার নিচে সীমাবদ্ধ থাকে, যা
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: যদি এর মান > 0 হয়, তাহলে ব্যবহারকারী যখন কনফিগার করা টাইমআউটের জন্য স্ক্রিন স্পর্শ করবেন, তখন ডিফল্ট রিফ্রেশ রেট ব্যবহৃত হবে। অ্যানিমেশনের জন্য ডিফল্ট রিফ্রেশ রেট নিয়ে প্রস্তুত থাকতেই এই পদ্ধতিটি অনুসরণ করা হয়। -
ro.surface_flinger.set_idle_timer_ms: যদি > 0 হয়, তাহলে নির্ধারিত টাইমআউটের মধ্যে কোনো স্ক্রিন আপডেট না হলে সর্বনিম্ন রিফ্রেশ রেট ব্যবহার করা হবে। -
ro.surface_flinger.set_display_power_timer_ms: যদি এর মান > 0 হয়, তাহলে কনফিগার করা টাইমআউটের জন্য ডিসপ্লে চালু করার সময় (বা AOD থেকে বের হওয়ার সময়) ডিফল্ট রিফ্রেশ রেট ব্যবহার করা হবে।
ফ্রেম রেট এপিআই
ফ্রেম রেট এপিআই অ্যাপগুলোকে অ্যান্ড্রয়েড প্ল্যাটফর্মকে তাদের কাঙ্ক্ষিত ফ্রেম রেট সম্পর্কে জানাতে সাহায্য করে এবং এটি অ্যান্ড্রয়েড ১১-কে টার্গেট করা অ্যাপগুলোতে উপলব্ধ। ফ্রেম রেট এপিআই সম্পর্কে আরও জানতে, developer.android.com- এ ডেভেলপার ডকুমেন্টেশন দেখুন।
ডেভেলপার বিকল্প

মেনুতে একটি নতুন ডেভেলপার অপশন যোগ করা হয়েছে, যা ডিসপ্লেতে বর্তমান রিফ্রেশ রেট সহ একটি ওভারলে টগল করে। নতুন অপশনটি Settings > System > Developer options > Show refresh rate-এর অধীনে রয়েছে।