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

অ্যান্ড্রয়েড ১১ একাধিক রিফ্রেশ রেটযুক্ত ডিভাইসের জন্য সমর্থন যোগ করে। এই বৈশিষ্ট্যটির তিনটি প্রধান উপাদান রয়েছে:

  • [email protected] এ নতুন HAL API চালু করা হয়েছে।
  • বিভিন্ন রিফ্রেশ রেটের জন্য ডিভাইস কনফিগারেশন পার্স করার জন্য প্ল্যাটফর্ম কোড এবং পছন্দসই রিফ্রেশ রেট সেট করুন
  • নতুন SDK এবং NDK API গুলি অ্যাপগুলিকে তাদের পছন্দসই ফ্রেম রেট সেট করতে দেয়

বাস্তবায়ন

রিফ্রেশ রেট স্যুইচিংয়ের জন্য ডেডিকেটেড সাপোর্ট যোগ করা হয়েছে ... আমরা দৃঢ়ভাবে এই সংস্করণটি ব্যবহার করার পরামর্শ দিচ্ছি কারণ কম্পোজার HAL এর পূর্ববর্তী সংস্করণগুলিতে রিফ্রেশ রেট স্যুইচিংয়ের জন্য সীমিত সমর্থন রয়েছে।

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

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

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

  • ১০৮০পি@৬০হার্জ
  • ১০৮০পি@৯০হার্জ
  • ১০৮০i@৭২Hz
  • ১০৮০i@৪৮Hz

যদিও ডিভাইসটি 48Hz, 60Hz, 72Hz এবং 90Hz রিফ্রেশ রেট সমর্থন করে, ডিসপ্লেটি একটি ভিন্ন মোডে কাজ করে এবং 60Hz থেকে 72Hz এ স্যুইচ করলে ডিসপ্লে কনফিগারেশন 1080p থেকে 1080i তে পরিবর্তিত হয়, যা পছন্দসই আচরণ নাও হতে পারে। কনফিগারেশন গ্রুপগুলি এই সমস্যার সমাধান করে। 60Hz এবং 90Hz কে একটি কনফিগারেশন গ্রুপে এবং 48Hz এবং 72Hz কে অন্য একটি কনফিগারেশন গ্রুপে একত্রিত করে, প্ল্যাটফর্মটি জানে যে এটি 60Hz এবং 90Hz এবং 48Hz এবং 72Hz এর মধ্যে স্যুইচ করতে পারে কিন্তু 60Hz এবং 72Hz এর মধ্যে নয় কারণ এর ফলে কেবল রিফ্রেশ রেট পরিবর্তন করার পরিবর্তে কনফিগারেশন পরিবর্তন হয়।

কম্পোজার API আপডেট

getDisplayVsyncPeriod সম্পর্কে
রিফ্রেশ রেট পরিবর্তন করার সময় আরও ভালো নিয়ন্ত্রণ এবং পূর্বাভাসের জন্য, getDisplayVsyncPeriod যোগ করা হয়েছে। getDisplayVsyncPeriod বর্তমান রিফ্রেশ রেট (vsync সময়ের পরিপ্রেক্ষিতে) প্রদান করে যেখানে ডিসপ্লেটি কাজ করে। রিফ্রেশ রেট পরিবর্তনের সময় এটি বিশেষভাবে কার্যকর, এবং পরবর্তী ফ্রেম কখন শুরু করবেন তা নির্ধারণ করার জন্য প্ল্যাটফর্মের বর্তমান রিফ্রেশ রেট প্রয়োজন।
সেট অ্যাক্টিভ কনফিগ উইথকনস্ট্রেন্টস
setActiveConfigWithConstraints পদ্ধতিটি বিদ্যমান setActiveConfig পদ্ধতির একটি নতুন এক্সটেনশন এবং কনফিগারেশন পরিবর্তন সম্পর্কে আরও তথ্য প্রদান করে। সীমাবদ্ধতাগুলি vsyncPeriodChangeConstraints প্যারামিটারের অংশ হিসাবে দেওয়া হয়েছে এবং নিম্নলিখিত প্যারামিটারগুলি ধারণ করে।
    পছন্দসই টাইম ন্যানোস
    CLOCK_MONOTONIC এর যে সময়ের পরে vsync পিরিয়ড পরিবর্তন হতে পারে (অর্থাৎ, vsync পিরিয়ড এই সময়ের আগে পরিবর্তন করা উচিত নয়)। প্ল্যাটফর্মটি যখন রিফ্রেশ রেট পরিবর্তনের জন্য আগে থেকে পরিকল্পনা করতে চায় কিন্তু এর আগে থেকেই কিছু বাফার উপস্থাপনের জন্য সারিতে থাকে তখন এটি কার্যকর। প্ল্যাটফর্মটি সেই সময়টি সেই অনুযায়ী সেট করে যাতে সেই বাফারগুলি বিবেচনা করা যায় এবং নিশ্চিত করে যে রিফ্রেশ রেট ট্রানজিশন যতটা সম্ভব মসৃণ হয়।
    নির্বিঘ্নেপ্রয়োজনীয়
    যদি সত্য হয়, তাহলে vsync পিরিয়ড পরিবর্তনটি অবশ্যই কোনও লক্ষণীয় ভিজ্যুয়াল আর্টিফ্যাক্ট ছাড়াই নির্বিঘ্নে ঘটতে হবে। প্ল্যাটফর্মটি এই ফ্ল্যাগটি ব্যবহার করে যখন কোনও কন্টেন্ট পরিবর্তনের ফলে রিফ্রেশ রেট পরিবর্তনের প্রয়োজন হয় (উদাহরণস্বরূপ, ডিভাইসটি নিষ্ক্রিয় থাকে এবং অ্যানিমেশন শুরু হয়)। এটি বিক্রেতাকে নির্দিষ্ট কনফিগারেশন পরিবর্তনগুলিকে অনুমতি না দেওয়ার সুযোগ দেয় যখন সেগুলির ফলে একটি লক্ষণীয় ভিজ্যুয়াল আর্টিফ্যাক্ট তৈরি হতে পারে। যদি কনফিগারেশনগুলি নির্বিঘ্নে পরিবর্তন করা না যায় এবং seamlessRequired true তে সেট করা থাকে, তাহলে বাস্তবায়নটি 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 থেকে পঠিত হয়। বর্তমান ডিভাইস সেটিং প্রতিফলিত করার জন্য রানটাইমে এই মান পরিবর্তন করা যেতে পারে (যেমন একটি মেনু বিকল্প থেকে)। ডিফল্ট মান হল 0, তাই কোনও ডিফল্ট ন্যূনতম নেই।
    • অ্যাপ্লিকেশন অনুরোধকৃত ModeId : অ্যাপ্লিকেশনগুলি WindowManager.LayoutParams.preferredDisplayModeId সেট করতে পারে যাতে ডিসপ্লেটি কোন পছন্দের কনফিগারেশনে কাজ করবে তা প্রতিফলিত হয়। বেশিরভাগ পরিস্থিতিতে, DisplayManager সেই অনুযায়ী ডিফল্ট কনফিগারেশন আইডি সেট করে এবং কনফিগারেশনের রিফ্রেশ রেটের সাথে মেলে সর্বনিম্ন এবং সর্বোচ্চ রিফ্রেশ রেট সেট করে।
    • ব্যাটারি সেভার : ডিভাইসটি কম পাওয়ার মোডে থাকলে রিফ্রেশ রেট 60Hz বা তার কমের মধ্যে সীমাবদ্ধ থাকে, যা Settings.Global.LOW_POWER_MODE.

DisplayManager একবার নীতি সেট করলে, SurfaceFlinger সক্রিয় স্তরগুলির (যে স্তরগুলি ফ্রেম আপডেট সারিবদ্ধ করে) উপর ভিত্তি করে রিফ্রেশ রেট সেট করে। যদি স্তরের মালিক একটি ফ্রেম রেট সেট করে, তাহলে SurfaceFlinger রিফ্রেশ রেট এমন কিছুতে সেট করার চেষ্টা করে যা সেই হারের গুণক। উদাহরণস্বরূপ, যদি দুটি সক্রিয় স্তর তাদের ফ্রেম রেট 24 এবং 60 তে সেট করে, তাহলে SurfaceFlinger 120Hz বেছে নেবে যদি এটি উপলব্ধ থাকে। যদি 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 থেকে বেরিয়ে যাওয়ার সময়) ডিফল্ট রিফ্রেশ রেট ব্যবহার করা হবে।

ফ্রেম রেট API

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

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

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