অ্যাডাপ্টিভ রিফ্রেশ রেটের মাধ্যমে ফ্রেম রেট অপ্টিমাইজ করুন

Android-এ কোনও অ্যানিমেশন শুরু হলে, মসৃণ অভিজ্ঞতা নিশ্চিত করতে ডিসপ্লে প্রায়শই সর্বাধিক রিফ্রেশ রেটে বুস্ট করে। প্রোগ্রেস বার ও অডিও ভিজ্যুয়ালাইজারের মতো ছোট অ্যানিমেশনের জন্য, এই হাই রিফ্রেশ রেট অপ্রয়োজনীয় এবং এর ফলে বেশি বিদ্যুৎ খরচ হয়।

Android 15 থেকে শুরু করে, অ্যাডাপ্টিভ রিফ্রেশ রেট (ARR) ফিচারের মাধ্যমে, চালু করা ডিভাইস দুটি ফ্রন্টে হাই রিফ্রেশ রেট রেসিডেন্সি কমাতে পারে:

  • নতুন প্ল্যাটফর্ম ফ্রেম রেট ম্যানেজমেন্ট অপ্টিমাইজেশনের মাধ্যমে, অ্যাপ ডিফল্ট হিসেবে কম ফ্রেম রেটে রেন্ডার করতে পারে এবং শুধুমাত্র প্রয়োজন হলে হাই ফ্রেম রেটে বুস্ট করতে পারে।
  • ডিসপ্লে রিফ্রেশ রেট ডায়নামিকভাবে কন্টেন্ট রেন্ডার রেটের সাথে ম্যাচ করে, কোনও জ্যাঙ্ক ছাড়াই।

বেশিরভাগ অ্যাপ কোনও পরিবর্তন ছাড়াই ARR থেকে উপকৃত হলেও, আপনি প্রয়োজন অনুযায়ী ডিফল্ট ফ্রেম রেট ওভাররাইড করতে পারেন।

এই পৃষ্ঠায় নিম্নলিখিত বিষয়গুলি বর্ণনা করা হয়েছে:

  • প্রতিটি ভিউয়ের ফ্রেম রেট কীভাবে নির্ধারণ করা হয়।
  • ARR কীভাবে ফ্রেম রেট সেট করে তা নির্ধারণ করার সাধারণ নীতি।
  • আপনি কীভাবে ডিফল্ট ফ্রেম রেট ম্যানুয়ালি ওভাররাইড করতে পারবেন।

ভিউ ভোটিং মেকানিজম

Android-এর ভিউ সিস্টেমে, UI হায়ারার্কির প্রতিটি ভিউ তার পছন্দের ফ্রেম রেট প্রকাশ করতে পারে। প্রতিটি ফ্রেমের জন্য চূড়ান্ত ফ্রেম রেট নির্ধারণ করতে এইসব পছন্দ সংগ্রহ ও একত্রিত করা হয়। এটি ভোটিং মেকানিজমের মাধ্যমে করা হয় যেখানে প্রতিটি ভিউ তার ফ্রেম রেট অ্যাট্রিবিউটের উপর ভিত্তি করে ভোট দেয়, যা কোনও বিভাগ বা নির্দিষ্ট রেট হতে পারে। ভিউ সাধারণত ড্র বা আপডেট করা হলে ভোট দেয়। চূড়ান্ত ফ্রেম রেট নির্ধারণ করতে এই ভোটগুলি একত্রিত করা হয়, যা পরে রেন্ডারিংয়ের জন্য ইঙ্গিত হিসেবে নিম্ন-স্তরের লেয়ারে পাঠানো হয়।

বর্তমানে, বেশিরভাগ ভিউ ডিফল্ট হিসেবে "স্বাভাবিক" ফ্রেম রেটে সেট করা থাকে, যা প্রায়শই 60 Hz-এ সেট করা হয়। বেশি ফ্রেম রেটের জন্য, আপনি নির্দিষ্ট API ব্যবহার করে পছন্দ কাস্টমাইজ করতে পারবেন, যেখানে সিস্টেম সাধারণত সবচেয়ে বেশি ফ্রেম রেট বেছে নেয়। এইসব API ব্যবহার করার ব্যাপারে আরও তথ্যের জন্য, ফ্রেম রেট বা বিভাগ সেট করুন বিভাগ দেখুন। ফ্রেম রেট সংক্রান্ত সাধারণ নীতি সাধারণ ARR নীতি বিভাগে বর্ণনা করা হয়েছে।

ফ্রেম রেট বিভাগ

View ক্লাসে, বিভিন্ন ফ্রেম রেট ক্যাটাগরি আছে যা ভোটে ব্যবহার করা যেতে পারে। প্রতিটি বিভাগের বিবরণ নিচে দেওয়া হল:

  • REQUESTED_FRAME_RATE_CATEGORY_DEFAULT: ডিফল্ট অ্যাকশনে ফিরে যাওয়ার জন্য এই ভ্যালু সেট করা যেতে পারে, যা ইঙ্গিত করে যে এই ভিউতে ফ্রেম রেটের জন্য কোনও ডেটা নেই।
  • REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE: ভিউ ফ্রেম রেটকে স্পষ্টভাবে প্রভাবিত করবে না। এর অর্থ হল, ভিউ অ্যাক্টিভ থাকলেও, ফ্রেম রেট নির্ধারণ করার সময় ফ্রেমওয়ার্ক এটিকে বিবেচনা করবে না
  • REQUESTED_FRAME_RATE_CATEGORY_NORMAL: এটি মাঝারি ফ্রেম রেটকে বোঝায় যা এমন অ্যানিমেশনের জন্য উপযুক্ত যেগুলির জন্য উচ্চ ফ্রেম রেটের প্রয়োজন হয় না বা উচ্চ মসৃণতা থেকে উপকৃত হয় না। এটি সাধারণত ৬০ Hz বা এর কাছাকাছি হয়।
  • REQUESTED_FRAME_RATE_CATEGORY_HIGH: অ্যানিমেশনের জন্য উপযুক্ত ফ্রেম রেট দেখায় যার জন্য বেশি ফ্রেম রেট প্রয়োজন হয়, এটি স্মুথনেস বাড়াতে পারে তবে পাওয়ারের ব্যবহারও বাড়াতে পারে।

A View votes only if it requires redrawing. সবচেয়ে বেশি ভোটের ভিত্তিতে চূড়ান্ত ফ্রেম রেট নির্ধারণ করা হয়। যেমন, সব ভোট "স্বাভাবিক" বিকল্পের জন্য হলে,"স্বাভাবিক" বিকল্প বেছে নেওয়া হয়। "সাধারণ" এবং "বেশি" ভোট, দুটিই হলে, "বেশি" বেছে নেওয়া হয়।

ফ্রেম রেট

ফ্রেম রেট ক্যাটেগরি ছাড়াও, কোনও ভিউতে পছন্দের ফ্রেম রেটও উল্লেখ করা যেতে পারে, যেমন ৩০, ৬০ বা ১২০ Hz। একাধিক ফ্রেম রেট ভোট কাস্ট করা হলে, নিম্নলিখিত নিয়ম অনুযায়ী চূড়ান্ত ফ্রেম রেট নির্ধারণ করা হয়:

  • একে অপরের গুণিতক: ভোট দেওয়া ফ্রেম রেট একে অপরের গুণিতক হলে, সবচেয়ে বেশি ভ্যালু বেছে নেওয়া হয়। যেমন, যদি দুটি ভোট থাকে - ৩০ Hz এবং ৯০ Hz — ৯০ Hz চূড়ান্ত ফ্রেম রেট হিসেবে বেছে নেওয়া হয়।
  • একে অপরের গুণিতক নয়:
    • কোনও ভোট ৬০ হার্জের বেশি হলে, সেটি "হাই" ভোট হিসেবে গণ্য করা হয়।
    • সব ভোট ৬০ হার্জ বা তার কম হলে, এটি "স্বাভাবিক" ভোট হিসেবে গণ্য করা হয়।

এছাড়াও, ফ্রেম রেটের ভ্যালু ও ফ্রেম রেটের ক্যাটেগরি, দুটিরই কম্বিনেশন থাকলে, সাধারণত বেশি ভ্যালু চূড়ান্ত রেন্ডার রেট নির্ধারণ করে। যেমন, ৬০ হার্জ ভোট ও "হাই" ভোট অথবা ১২০ হার্জ ভোট ও "নরমাল" ভোটের কম্বিনেশনের ক্ষেত্রে, রেন্ডার রেট সাধারণত ১২০ হার্জে সেট করা হবে।

অ্যাপ থেকে ভোট ছাড়াও, একই ফ্রেমের মধ্যে বিভিন্ন কম্পোনেন্ট থেকে নিম্ন-স্তরের লেয়ারে অন্যান্য ইঙ্গিতও পাঠানো হতে পারে। এর মধ্যে অনেকগুলি সিস্টেম UI কম্পোনেন্ট থেকে তৈরি হতে পারে, যেমন বিজ্ঞপ্তি শেড, স্ট্যাটাস বার, নেভিগেশন বার এবং অন্যান্য। একাধিক কম্পোনেন্ট থেকে পাওয়া ভোটের ভিত্তিতে চূড়ান্ত ফ্রেম রেটের মান নির্ধারণ করা হয়।

ফ্রেম রেট বা বিভাগ সেট করুন

নির্দিষ্ট কিছু পরিস্থিতিতে, কোনও ভিউয়ের জন্য আপনার পছন্দের ফ্রেম রেট থাকতে পারে। যেমন, কোনও অ্যানিমেশন মসৃণভাবে না চললে, ফ্রেম রেট বাড়ানোর জন্য আপনি কোনও ভিউয়ের ক্ষেত্রে পছন্দের ফ্রেম রেট "বেশি" হিসেবে সেট করতে পারেন। এছাড়াও, কোনও ভিডিওর উপর ধীর বা স্ট্যাটিক অ্যানিমেশন থাকলে (সাধারণত ২৪ বা ৩০ Hz-এ চালানো হয়), আপনি পাওয়ার খরচ কমাতে "সাধারণ" রেটের চেয়ে কম রেটে অ্যানিমেশন চালাতে পছন্দ করতে পারেন।

আপনি setRequestedFrameRate() এবং getRequestedFrameRate() API ব্যবহার করে কোনও নির্দিষ্ট ভিউয়ের জন্য পছন্দের ফ্রেম রেট বা বিভাগ নির্ধারণ করতে পারেন।

Kotlin

// Set the preferred frame rate category to a View

// set the frame rate category to NORMAL
view.requestedFrameRate = View.REQUESTED_FRAME_RATE_CATEGORY_NORMAL
// set the frame rate category to HIGH
view.requestedFrameRate = View.REQUESTED_FRAME_RATE_CATEGORY_HIGH
// reset the frame rate category
view.requestedFrameRate = View.REQUESTED_FRAME_RATE_CATEGORY_DEFAULT

// Set the preferred frame rate to a View

// set the frame rate to 30
view.requestedFrameRate = 30f
// set the frame rate to 60
view.requestedFrameRate = 60f
// set the frame rate to 120
view.requestedFrameRate = 120f

জাভা

// Set the preferred frame rate category to a View

// set the frame rate category to NORMAL
view.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_NORMAL);
// set the frame rate category to HIGH
view.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_HIGH);
// reset the frame rate category
view.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_DEFAULT);

// Set the preferred frame rate to a View

// set the frame rate to 30
view.setRequestedFrameRate(30);
// set the frame rate to 60
view.setRequestedFrameRate(60);
// set the frame rate to 120
view.setRequestedFrameRate(120);

ব্যবহারের উদাহরণ দেখতে, TextureView দেখুন।

সাধারণ ARR নীতি

আগের বিভাগে আমরা আলোচনা করেছি যে বেশিরভাগ অ্যানিমেশন ডিফল্ট হিসেবে ৬০ Hz-এ দেখানো হয়, কারণ প্রতিটি ভিউয়ের জন্য "স্বাভাবিক" ফ্রেম রেট সেট করা থাকে। তবে, কিছু ব্যতিক্রম আছে যেখানে আরও মসৃণ অ্যানিমেশন নিশ্চিত করতে ফ্রেম রেট "হাই" এ বাড়িয়ে দেওয়া হয়।

সাধারণ ARR নীতি নিচে উল্লেখ করা হল:

  • টাচ বুস্ট: টাচ ইভেন্ট (MotionEvent.ACTION_DOWN) শনাক্ত করা হলে, টাচ ছেড়ে দেওয়ার পরে কিছু সময়ের জন্য রিফ্রেশ রেট "হাই" পর্যন্ত বুস্ট করা হয় যাতে রেসপন্সিভনেস বজায় থাকে।
  • ফ্লিং জেসচার: ফ্লিং জেসচার আলাদাভাবে ম্যানেজ করা হয়—ফ্লিংয়ের গতিবেগ কমে যাওয়ার সাথে সাথে রিফ্রেশ রেটও ধীরে ধীরে কমে যায়। আপনি স্ক্রল করার অভিজ্ঞতা উন্নত করা বিভাগে এই আচরণ সম্পর্কে বিস্তারিত তথ্য পেতে পারেন।
  • অ্যাপ লঞ্চ ও উইন্ডো ট্রানজিশন: অ্যাপ লঞ্চ, উইন্ডো ইনিশিয়ালাইজেশন ও উইন্ডো ট্রানজিশনের সময় কিছুক্ষণের জন্য রিফ্রেশ রেট বুস্ট করা হয় যাতে স্মুথ ভিজ্যুয়াল অভিজ্ঞতা পাওয়া যায়।
  • অ্যানিমেশন: যেসব অ্যানিমেশনে অটোমেটিক মুভমেন্ট বা সাইজ পরিবর্তন হয়, সেগুলি আরও বেশি রিফ্রেশ রেট পায় যাতে কোনও ভিউয়ের পজিশন বা সাইজ পরিবর্তন হলে তা আরও মসৃণভাবে দেখানো যায়।
  • SurfaceView এবং TextureView: ফ্রেম রেট স্পষ্টভাবে TextureView এবং SurfaceView-এর জন্য সেট করা হয়েছে এবং সেই অনুযায়ী প্রয়োগ করা হয়েছে।

টাচ বুস্ট চালু ও বন্ধ করা

আপনি Window লেভেলে টাচ বুস্ট চালু এবং/অথবা বন্ধ করতে পারবেন। ডিফল্ট হিসেবে, ব্যবহারকারী স্ক্রিন টাচ করে আঙুল তুলে নিলে, কিছু সময়ের জন্য রেন্ডার রেট বেড়ে যায়। setFrameRateBoostOnTouchEnabled() এবং getFrameRateBoostOnTouchEnabled() API আপনাকে নির্দিষ্ট Window স্পর্শ করা হলে রেন্ডার রেট বৃদ্ধি পাওয়া থেকে আটকাতে দেয়।

Kotlin

// disable touch boost on a Window
window.isFrameRateBoostOnTouchEnabled = false 
// enable touch boost on a Window
window.isFrameRateBoostOnTouchEnabled = true
// check if touch boost is enabled on a Window
val isTouchBoostEnabled = window.isFrameRateBoostOnTouchEnabled

জাভা

// disable touch boost on a Window
window.setFrameRateBoostOnTouchEnabled(false)
// enable touch boost on a Window
window.setFrameRateBoostOnTouchEnabled(true)
// check if touch boost is enabled on a Window
window.getFrameRateBoostOnTouchEnabled()

স্ক্রলিংয়ের ক্ষেত্রে উন্নতি

ডায়নামিক পদ্ধতিতে ফ্রেম রেট অপ্টিমাইজ করার একটি মূল ব্যবহার হল স্ক্রলিং (ফ্লিং) অভিজ্ঞতা উন্নত করা। নতুন কন্টেন্ট দেখার জন্য অনেক অ্যাপ্লিকেশন ব্যবহারকারীদের সোয়াইপ-আপ করার উপর নির্ভর করে। ARR স্ক্রলিং এনহ্যান্সমেন্ট, ফ্লিং জেসচার স্লো হয়ে যাওয়ার সাথে সাথে রিফ্রেশ রেট ডায়নামিকভাবে অ্যাডজাস্ট করে, ধীরে ধীরে ফ্রেম রেট কমায়। এটি স্মুথ স্ক্রলিং বজায় রেখে আরও দক্ষ রেন্ডারিং প্রদান করে।

এই উন্নতি বিশেষভাবে স্ক্রল করা যায় এমন UI কম্পোনেন্টের ক্ষেত্রে প্রযোজ্য, যার মধ্যে ScrollView, ListView এবং GridView অন্তর্ভুক্ত এবং সব কাস্টম ইমপ্লিমেন্টেশনের জন্য উপলভ্য নাও হতে পারে।

ARR স্ক্রলিং ফিচার RecyclerView এবং NestedScrollView-এর জন্য উপলভ্য। আপনার অ্যাপে এই ফিচার চালু করতে, AndroidX.recyclerview এবং AndroidX.core-এর লেটেস্ট ভার্সনে আপগ্রেড করুন। বিস্তারিত জানতে নিচের সারণী দেখুন।

লাইব্রেরি

Version

AndroidX.recyclerview

1.4.0

AndroidX.core

1.15.0

গতিবেগ সংক্রান্ত তথ্য সেট করুন

আপনার কাছে কাস্টম স্ক্রলযোগ্য কম্পোনেন্ট থাকলে এবং স্ক্রলিং ফিচারের সুবিধা নিতে চাইলে, স্মুথ স্ক্রলিং বা ফ্লিং করার সময় প্রতিটি ফ্রেমে setFrameContentVelocity() কল করুন। উদাহরণ হিসেবে নিচের কোড স্নিপেট দেখুন:

Kotlin

// set the velocity to a View (1000 pixels/Second)
view.frameContentVelocity = 1000f
// get the velocity of a View
val velocity = view.frameContentVelocity

জাভা

// set the velocity to a View
view.setFrameContentVelocity(velocity);

// get the velocity of a View
final float velocity = view.getFrameContentVelocity()

আরও উদাহরণের জন্য, RecyclerView এবং ScrollView দেখুন। গতিবেগ সঠিকভাবে সেট করতে, Scroller বা OverScroller থেকে প্রয়োজনীয় তথ্য পাওয়া না গেলে, কন্টেন্টের গতিবেগ (প্রতি সেকেন্ডে পিক্সেল) ম্যানুয়ালি হিসাব করুন।

মনে রাখবেন, স্ক্রল করা যায় না এমন কম্পোনেন্ট ভিউতে setFrameContentVelocity() এবং getFrameContentVelocity() কল করা হলে, সেগুলি কোনও প্রভাব ফেলবে না, কারণ বর্তমান নীতি অনুযায়ী মুভমেন্ট অটোমেটিক ফ্রেম রেট বাড়িয়ে দেয়।

রেন্ডার রেট অ্যাডজাস্ট করার জন্য ভেলোসিটি সংক্রান্ত তথ্য অত্যন্ত গুরুত্বপূর্ণ। যেমন, ফ্লিং জেসচার বিবেচনা করুন। শুরুতে, ফ্লিংয়ের ভেলোসিটি বেশি হতে পারে, যার ফলে মসৃণতা নিশ্চিত করতে আরও বেশি রেন্ডার রেটের প্রয়োজন হয়। জেসচার এগিয়ে যাওয়ার সাথে সাথে, গতিবেগ কমে যায়, যার ফলে রেন্ডার রেট কমানো যায়।

ARR চালু ও বন্ধ করা

পাওয়ার এফিসিয়েন্সি উন্নত করতে ARR ডিফল্ট হিসেবে চালু করা থাকে। আপনি এই ফিচার বন্ধ করতে পারলেও, তা করার সাজেশন দেওয়া হয় না, কারণ অ্যাপটি আরও বেশি পাওয়ার খরচ করবে। ব্যবহারকারীর অভিজ্ঞতায় উল্লেখযোগ্য প্রভাব ফেলে এমন কোনও সমস্যার সম্মুখীন হলে, তবেই এই ফিচার বন্ধ করার কথা বিবেচনা করুন।

ARR চালু বা বন্ধ করতে, Window-এ setFrameRatePowerSavingsBalanced() API ব্যবহার করুন অথবা আপনার styles.xml ফাইলের মাধ্যমে isFrameRatePowerSavingsBalanced() API ব্যবহার করুন।

Window-এ কীভাবে ARR চালু বা বন্ধ করতে হয় তা নিম্নলিখিত স্নিপেট থেকে জানতে পারবেন:

Kotlin

// disable ARR on a Window
window.isFrameRatePowerSavingsBalanced = false 
// enable ARR on a Window
window.isFrameRatePowerSavingsBalanced = true  
// check if ARR is enabled on a Window
val isAdaptiveRefreshRateEnabled = window.isFrameRatePowerSavingsBalanced

জাভা

// disable ARR on a Window
window.setFrameRatePowerSavingsBalanced(false)
// enable ARR on a Window
window.setFrameRatePowerSavingsBalanced(true)
// check if ARR is enabled on a Window
window.isFrameRatePowerSavingsBalanced()

styles.xml ফাইলের মাধ্যমে ARR বন্ধ করতে, res/values/styles.xml-এ আপনার স্টাইলে নিম্নলিখিত আইটেম যোগ করুন:

<style name="frameRatePowerSavingsBalancedDisabled">
    <item name="android:windowIsFrameRatePowerSavingsBalanced">false</item>
</style>

Compose-এর জন্য ARR

Compose 1.9-এ অ্যাডাপ্টিভ রিফ্রেশ রেটের জন্য সহায়তা যোগ করা হয়েছে। ভিউ সিস্টেমে, আপনি setRequestedFrameRate() পদ্ধতি ব্যবহার করে ভিউয়ের জন্য নির্দিষ্ট ফ্রেম রেটের অনুরোধ করেন। Compose-এ, একটি নতুন মডিফায়ার আপনাকে কম্পোজেবলের জন্য ফ্রেম রেট নির্দিষ্ট করতে দেয়। এই মডিফায়ার setRequestedFrameRate()-এর মতোই কাজ করে, এটি পজিটিভ ফ্রেম রেট ভ্যালু (Hz-এ) অথবা আগে থেকে নির্ধারিত ফ্রেম রেট ক্যাটেগরি, FrameRateCategory গ্রহণ করে।

API-এর জন্য সিগনেচার নিচে দেওয়া হল:

নিচের স্নিপেটে, নতুন ফ্রেম রেট মডিফায়ার (Modifier.requestedFrameRate(120f)) একটি Text কম্পোজেবলে প্রয়োগ করা হয়েছে। এই মডিফায়ার Text কম্পোজেবলকে ড্র বা অ্যানিমেট করার সময় (যেমন, অস্বচ্ছতা পরিবর্তন করার সময়) ১২০-এর পছন্দের ফ্রেম রেটের জন্য অনুরোধ করতে বাধ্য করে:

var targetAlpha by remember { mutableFloatStateOf(1f) }
val alpha by
    animateFloatAsState(
        targetValue = targetAlpha,
        animationSpec = tween(durationMillis = 1000)
    )

Button(
    onClick = { targetAlpha = if (targetAlpha == 1f) 0.2f else 1f },
    modifier =
        Modifier.background(LocalContentColor.current.copy(alpha = alpha))
) {
    Text(
        text = "Click",
        color = LocalContentColor.current.copy(alpha = alpha),
        modifier = Modifier.preferredFrameRate(120f)
     // You can also pass frame rate category such as FrameRateCategory.High  to increase the frame rate
    )
  }

সব কম্পোজেবল থেকে পছন্দের ফ্রেম রেট সংগ্রহ করা হয় এবং প্রতিটি ফ্রেমের জন্য চূড়ান্ত ফ্রেম রেট নির্ধারণ করতে একত্রিত করা হয়। আরও জানতে, SetFrameRateSample এবং SetFrameRateCategorySample দেখুন।