অভিযোজিত রিফ্রেশ হার সহ ফ্রেম রেট অপ্টিমাইজ করুন

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

অ্যাডাপ্টিভ রিফ্রেশ রেট (ARR) বৈশিষ্ট্য সহ Android 15 এ শুরু করে, সক্ষম ডিভাইস দুটি ফ্রন্টে উচ্চ রিফ্রেশ রেট রেসিডেন্সি কমাতে পারে:

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

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

এই পৃষ্ঠাটি নিম্নলিখিত বর্ণনা করে:

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

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

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

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

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

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

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

একটি ভিউ ভোট শুধুমাত্র যদি এটি পুনরায় অঙ্কন প্রয়োজন. চূড়ান্ত ফ্রেম হার সর্বোচ্চ ভোট দ্বারা নির্ধারিত হয়। উদাহরণস্বরূপ, যদি সমস্ত ভোট "স্বাভাবিক" এর জন্য হয়, "সাধারণ" নির্বাচন করা হয়। যখন "স্বাভাবিক" এবং "উচ্চ" ভোট উভয়ই ঘটে, তখন "উচ্চ" নির্বাচন করা হয়।

ফ্রেমের হার

ফ্রেম রেট বিভাগ ছাড়াও, একটি ভিউ একটি পছন্দের ফ্রেম রেটও নির্দিষ্ট করতে পারে, যেমন 30, 60, বা 120 Hz। যখন একাধিক ফ্রেম রেট ভোট দেওয়া হয়, চূড়ান্ত ফ্রেম রেট নিম্নলিখিত নিয়ম দ্বারা নির্ধারিত হয়:

  • একে অপরের একাধিক : ভোট দেওয়া ফ্রেম রেটগুলি যদি একে অপরের গুণিতক হয়, সর্বোচ্চ মানটি বেছে নেওয়া হয়। উদাহরণস্বরূপ, যদি দুটি ভোট থাকে - 30 Hz এবং 90 Hz - 90 Hz চূড়ান্ত ফ্রেম রেট হিসাবে নির্বাচিত হয়।
  • একে অপরের গুণিতক নয় :
    • যদি কোনো ভোট 60 Hz-এর বেশি হয়, তাহলে সেটিকে "উচ্চ" ভোট হিসেবে গণনা করা হবে।
    • যদি সমস্ত ভোট 60 Hz বা তার কম হয় তবে এটি একটি "স্বাভাবিক" ভোট হিসাবে গণনা করা হবে।

অতিরিক্তভাবে, যদি ফ্রেম রেট মান এবং ফ্রেম রেট বিভাগ উভয়ের সমন্বয় থাকে, তাহলে উচ্চতর মান সাধারণত চূড়ান্ত রেন্ডার রেট নির্ধারণ করে। উদাহরণস্বরূপ, একটি 60 Hz ভোট এবং একটি "উচ্চ" ভোট, বা 120 Hz ভোট এবং একটি "স্বাভাবিক" ভোটের সংমিশ্রণে, রেন্ডার রেট সাধারণত 120 Hz এ সেট করা হবে।

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

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

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

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

কোটলিন

// 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 নীতি

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

সাধারণ ARR নীতি নিম্নরূপ:

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

টাচ বুস্ট সক্ষম এবং অক্ষম করুন

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

কোটলিন

// 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 এর সর্বশেষ সংস্করণগুলিতে আপগ্রেড করুন৷ বিস্তারিত জানার জন্য নিম্নলিখিত টেবিল দেখুন.

লাইব্রেরি

সংস্করণ

AndroidX.recyclerview

1.4.0

AndroidX.core

1.15.0

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

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

কোটলিন

// 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 সক্ষম বা নিষ্ক্রিয় করতে হয়:

কোটলিন

// 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>