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

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

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

বাস্তবায়ন

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

কনফিগ গ্রুপ

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

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

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

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

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

getDisplayVsyncPeriod
রিফ্রেশ হার পরিবর্তন করার সময় আরও ভাল নিয়ন্ত্রণ এবং পূর্বাভাসের জন্য getDisplayVsyncPeriod যোগ করা হয়েছে। getDisplayVsyncPeriod বর্তমান রিফ্রেশ রেট প্রদান করে (vsync সময়ের পরিপ্রেক্ষিতে) ডিসপ্লেতে কাজ করে। এটি বিশেষভাবে কার্যকর যখন রিফ্রেশ রেট এবং বর্তমান রিফ্রেশ রেট এর মধ্যে পরিবর্তন করার সময় পরবর্তী ফ্রেমটি কখন শুরু করবেন তা নির্ধারণ করতে প্ল্যাটফর্মের প্রয়োজন।
setActiveConfigWithConstraints
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 থেকে পড়া হয়। PEAK_REFRESH_RATE। বর্তমান ডিভাইস সেটিং প্রতিফলিত করতে রানটাইমে এই মান পরিবর্তন করা হয় (যেমন একটি মেনু বিকল্প থেকে)। ডিফল্ট মান R.integer.config_defaultPeakRefreshRate কনফিগার ওভারলেতে সেট করা আছে।
    • ন্যূনতম রিফ্রেশ রেট সেটিং : ন্যূনতম রিফ্রেশ হার মান Settings.System.MIN_REFRESH_RATE থেকে পড়া হয়। বর্তমান ডিভাইস সেটিং প্রতিফলিত করতে রানটাইমে এই মান পরিবর্তন করা যেতে পারে (যেমন একটি মেনু বিকল্প থেকে)। ডিফল্ট মান 0, তাই কোন ডিফল্ট ন্যূনতম নেই।
    • অ্যাপ্লিকেশানের অনুরোধ করা মোডআইডি : অ্যাপগুলি WindowManager.LayoutParams.preferredDisplayModeId সেট করতে পারে একটি পছন্দের কনফিগারে প্রতিফলিত করতে যাতে ডিসপ্লেটি পরিচালনা করা উচিত৷ বেশিরভাগ পরিস্থিতিতে DisplayManager সেই অনুযায়ী ডিফল্ট কনফিগার আইডি সেট করে এবং কনফিগারের রিফ্রেশ হারের সাথে মেলে সর্বনিম্ন এবং সর্বোচ্চ রিফ্রেশ রেট সেট করে।
    • ব্যাটারি সেভার : ডিভাইসটি কম পাওয়ার মোডে থাকলে রিফ্রেশ রেট 60Hz বা তার কম পর্যন্ত সীমাবদ্ধ থাকে, যা Settings.Global.LOW_POWER_MODE.

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

বিকাশকারী বিকল্প

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