ফ্রেম হার

ফ্রেম রেট API-এর সাহায্যে অ্যাপগুলি Android প্ল্যাটফর্মকে তাদের ফ্রেম রেট সম্পর্কে জানাতে পারে এবং এটি Android ১১ (API লেভেল ৩০) বা তার পরবর্তী ভার্সনকে টার্গেট করা অ্যাপে উপলভ্য। সাধারণত, বেশিরভাগ ডিভাইসে শুধুমাত্র একটি ডিসপ্লে রিফ্রেশ রেট কাজ করে, সাধারণত ৬০ হার্জ, তবে এটি পরিবর্তন হচ্ছে। এখন অনেক ডিভাইসে ৯০Hz বা ১২০Hz-এর মতো অতিরিক্ত রিফ্রেশ রেট কাজ করে। কিছু ডিভাইসে সিমলেস রিফ্রেশ রেট সুইচ কাজ করে, অন্যান্য ডিভাইসে অল্প সময়ের জন্য কালো স্ক্রিন দেখা যায়, সাধারণত এক সেকেন্ডের জন্য।

API-এর প্রাথমিক উদ্দেশ্য হল, অ্যাপকে সব ধরনের কাজ করার সুবিধা দেওয়া ডিসপ্লে রিফ্রেশ রেট কাজ করে। যেমন, কোনও অ্যাপ 24Hz ভিডিও চালানোর সময় setFrameRate() কল করলে, ডিভাইসের ডিসপ্লে রিফ্রেশ রেট 60Hz থেকে 120Hz-এ পরিবর্তিত হতে পারে। এই নতুন রিফ্রেশ রেট 24Hz ভিডিওর মসৃণ, ঝাঁকুনি-মুক্ত প্লেব্যাক সক্ষম করে, 3:2 পুলডাউনের প্রয়োজন ছাড়াই যা 60Hz ডিসপ্লেতে একই ভিডিও চালানোর জন্য প্রয়োজন হবে। এর ফলে ব্যবহারকারীর অভিজ্ঞতা আরও ভালো হয়।

প্রাথমিক ব্যবহার

Android, সারফেস অ্যাক্সেস ও কন্ট্রোল করার জন্য বিভিন্ন উপায় দেখায়, তাই setFrameRate() API-এর বিভিন্ন ভার্সন আছে। API-এর প্রতিটি ভার্সন একই প্যারামিটার গ্রহণ করে এবং অন্যগুলির মতোই কাজ করে:

অ্যাপটিকে প্রকৃত সমর্থিত ডিসপ্লে রিফ্রেশ রেট বিবেচনা করার প্রয়োজন নেই, যা Display.getSupportedModes() কল করে পাওয়া যেতে পারে, যাতে নিরাপদে setFrameRate() কল করা যায়। যেমন, ডিভাইসটি শুধুমাত্র 60Hz সাপোর্ট করলেও, আপনার অ্যাপের জন্য উপযুক্ত ফ্রেম রেট সহ setFrameRate() কল করুন। যেসব ডিভাইসে অ্যাপের ফ্রেম রেটের সাথে আরও ভালো ম্যাচ নেই, সেগুলি বর্তমান ডিসপ্লে রিফ্রেশ রেটের সাথে থাকবে।

setFrameRate()-এ কল করার ফলে ডিসপ্লে রিফ্রেশ রেটে কোনও পরিবর্তন হয় কিনা তা দেখতে, DisplayManager.registerDisplayListener() বা AChoreographer_registerRefreshRateCallback()-এ কল করে ডিসপ্লে পরিবর্তন সংক্রান্ত বিজ্ঞপ্তির জন্য রেজিস্টার করুন।

setFrameRate() কল করার সময়, পূর্ণ সংখ্যায় রাউন্ড অফ করার পরিবর্তে সঠিক ফ্রেম রেট পাস করা সবচেয়ে ভালো। যেমন, 29.97Hz-এ রেকর্ড করা ভিডিও রেন্ডার করার সময়, 30-এ রাউন্ড করার পরিবর্তে 29.97-এ পাস করুন।

ভিডিও অ্যাপের ক্ষেত্রে, setFrameRate()-এ পাস করা কম্প্যাটিবিলিটি প্যারামিটার Surface.FRAME_RATE_COMPATIBILITY_FIXED_SOURCE-এ সেট করতে হবে যাতে Android প্ল্যাটফর্মকে অতিরিক্ত ইঙ্গিত দেওয়া যায় যে অ্যাপটি অমিল ডিসপ্লে রিফ্রেশ রেটের সাথে মানিয়ে নিতে পুলডাউন ব্যবহার করবে (যার ফলে জুডার হবে)।

কিছু ক্ষেত্রে, ভিডিও সারফেস ফ্রেম জমা দেওয়া বন্ধ করে দেবে কিন্তু কিছু সময়ের জন্য স্ক্রিনে দেখা যাবে। সাধারণত প্লেব্যাক ভিডিওর শেষে পৌঁছালে বা ব্যবহারকারী প্লেব্যাক পজ করলে এই ধরনের ঘটনা ঘটে। এইসব ক্ষেত্রে, সারফেসের ফ্রেম রেট সেটিং ডিফল্ট ভ্যালুতে ফিরিয়ে আনতে, ফ্রেম রেট প্যারামিটার ০-তে সেট করে setFrameRate() কল করুন। সারফেস নষ্ট করার সময় বা ব্যবহারকারী অন্য অ্যাপে সুইচ করার কারণে সারফেস লুকিয়ে গেলে, এইভাবে ফ্রেম রেট সেটিং মুছে দেওয়ার প্রয়োজন নেই। সারফেস ব্যবহার না করা হলেও সেটি দেখা গেলে, শুধুমাত্র তখনই ফ্রেম রেট সেটিং মুছুন।

নন-সিমলেস ফ্রেম রেট সুইচ

কিছু ডিভাইসে, রিফ্রেশ রেট পরিবর্তন করার সময় ভিজ্যুয়াল ইন্টারাপশন হতে পারে, যেমন এক বা দুই সেকেন্ডের জন্য স্ক্রিন কালো হয়ে যাওয়া। এটি সাধারণত সেট-টপ বক্স, টিভি প্যানেল ও এই ধরনের ডিভাইসে দেখা যায়। সাধারণত, এই ধরনের ভিজ্যুয়াল বাধা এড়াতে, Surface.setFrameRate() API কল করা হলে, Android ফ্রেমওয়ার্ক মোড পরিবর্তন করে না।

কিছু ব্যবহারকারী দীর্ঘ ভিডিওর শুরুতে এবং শেষে ভিজ্যুয়াল ইন্টারাপশন পছন্দ করেন। এটি ডিসপ্লের রিফ্রেশ রেটকে ভিডিও ফ্রেম রেটের সাথে ম্যাচ করতে দেয় এবং মুভি প্লেব্যাকের জন্য ৩:২ পুলডাউন জুডারের মতো ফ্রেম-রেট কনভার্সন আর্টিফ্যাক্ট এড়িয়ে যায়।

এই কারণে, ব্যবহারকারী ও অ্যাপ, দু'জনেই সম্মতি দিলে, নন-সিমলেস রিফ্রেশ রেট সুইচ চালু করা যেতে পারে:

সিনেমা বা এই ধরনের দীর্ঘ ভিডিওর জন্য আমরা আপনাকে সবসময় CHANGE_FRAME_RATE_ALWAYS ব্যবহার করতে সাজেস্ট করি। এর কারণ হল, রিফ্রেশ রেট পরিবর্তন করার সময় যে বাধা সৃষ্টি হয়, তার থেকে ভিডিও ফ্রেম রেট ম্যাচ করার সুবিধা অনেক বেশি।

অতিরিক্ত সাজেশন

সাধারণ পরিস্থিতির জন্য এইসব সাজেশন অনুসরণ করুন।

একাধিক সারফেস

Android প্ল্যাটফর্ম এমনভাবে ডিজাইন করা হয়েছে যাতে বিভিন্ন ফ্রেম রেট সেটিংস সহ একাধিক সারফেসের মতো পরিস্থিতি সঠিকভাবে ম্যানেজ করা যায়। আপনার অ্যাপে বিভিন্ন ফ্রেম রেট সহ একাধিক সারফেস থাকলে, প্রতিটি সারফেসের জন্য সঠিক ফ্রেম রেট সহ setFrameRate() কল করুন। এমনকি ডিভাইসটি স্প্লিট স্ক্রিন বা পিকচার-ইন-পিকচার মোড ব্যবহার করে একসাথে একাধিক অ্যাপ চালালেও, প্রতিটি অ্যাপ নিরাপদে তার নিজস্ব সারফেসের জন্য setFrameRate() কল করতে পারে।

প্ল্যাটফর্মটি অ্যাপের ফ্রেম রেটে পরিবর্তন হয় না

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

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

যেসব ক্ষেত্রে অ্যাপ ডিসপ্লে রিফ্রেশ রেটে চলবে না বা চলতে পারবে না, সেইসব ক্ষেত্রে অ্যাপকে প্রতিটি ফ্রেমের জন্য প্রেজেন্টেশন টাইমস্ট্যাম্প নির্দিষ্ট করতে হবে, এর জন্য প্রেজেন্টেশন টাইমস্ট্যাম্প সেট করার প্ল্যাটফর্মের মেকানিজমের মধ্যে কোনও একটি ব্যবহার করতে হবে:

এইসব টাইমস্ট্যাম্প ব্যবহার করলে, প্ল্যাটফর্ম খুব তাড়াতাড়ি অ্যাপ ফ্রেম দেখানো বন্ধ করে দেয়, যার ফলে অপ্রয়োজনীয় ঝাঁকুনি হয়। ফ্রেম প্রেজেন্টেশন টাইমস্ট্যাম্পের সঠিক ব্যবহার একটু জটিল। গেমের ক্ষেত্রে, জুডার এড়ানোর ব্যাপারে আরও তথ্যের জন্য আমাদের ফ্রেম পেসিং গাইড দেখুন এবং Android ফ্রেম পেসিং লাইব্রেরি ব্যবহার করার কথা বিবেচনা করুন।

কিছু ক্ষেত্রে, প্ল্যাটফর্মটি setFrameRate()-এ অ্যাপের উল্লেখ করা ফ্রেম রেটের গুণিতকে পরিবর্তন করতে পারে। যেমন, কোনও অ্যাপ setFrameRate() -কে 60Hz-এ কল করতে পারে এবং ডিভাইস ডিসপ্লেকে 120Hz-এ পাল্টে দিতে পারে। এটি হওয়ার একটি কারণ হল, অন্য কোনও অ্যাপের সারফেসে ফ্রেম রেট সেটিং ২৪Hz-এ সেট করা আছে। সেক্ষেত্রে, ডিসপ্লে 120Hz-এ চালালে 60Hz সারফেস ও 24Hz সারফেস, দুটিই কোনও পুলডাউন ছাড়াই চালানো যাবে।

অ্যাপের ফ্রেম রেটের গুণিতকে ডিসপ্লে চললে, অপ্রয়োজনীয় ঝাঁকুনি এড়াতে অ্যাপের প্রতিটি ফ্রেমের জন্য প্রেজেন্টেশন টাইমস্ট্যাম্প নির্দিষ্ট করা উচিত। গেমের ক্ষেত্রে, Android ফ্রেম পেসিং লাইব্রেরি ফ্রেম প্রেজেন্টেশন টাইমস্ট্যাম্প সঠিকভাবে সেট করতে সাহায্য করে।

setFrameRate() বনাম preferredDisplayModeId

WindowManager.LayoutParams.preferredDisplayModeId হল আরেকটি উপায় যার মাধ্যমে অ্যাপ প্ল্যাটফর্মে তার ফ্রেম রেট নির্দেশ করতে পারে। কিছু অ্যাপ ডিসপ্লে রেজোলিউশনের মতো অন্যান্য ডিসপ্লে মোড সেটিংস পরিবর্তন করার পরিবর্তে শুধুমাত্র ডিসপ্লে রিফ্রেশ রেট পরিবর্তন করতে চায়। সাধারণত, preferredDisplayModeId-এর পরিবর্তে setFrameRate() ব্যবহার করুন। setFrameRate() ফাংশনটি ব্যবহার করা সহজ কারণ অ্যাপটিকে নির্দিষ্ট ফ্রেম রেট সহ একটি মোড খুঁজে পেতে ডিসপ্লে মোডের তালিকা সার্চ করতে হবে না।

setFrameRate() প্ল্যাটফর্মকে আরও বেশি সুযোগ দেয় যাতে বিভিন্ন ফ্রেম রেটে চলা একাধিক সারফেসের ক্ষেত্রে মানানসই ফ্রেম রেট বেছে নেওয়া যায়। যেমন, Pixel 4-এ স্প্লিট-স্ক্রিন মোডে দুটি অ্যাপ চলছে, যেখানে একটি অ্যাপে ২৪ হার্টজ ভিডিও চলছে এবং অন্যটিতে ব্যবহারকারীকে স্ক্রল করা যায় এমন তালিকা দেখানো হচ্ছে। Pixel 4-এ দুটি ডিসপ্লে রিফ্রেশ রেট কাজ করে: ৬০ হার্জ ও ৯০ হার্জ। preferredDisplayModeId API ব্যবহার করে, ভিডিও সারফেসকে ৬০Hz বা ৯০Hz-এর মধ্যে যেকোনও একটি বেছে নিতে বাধ্য করা হয়। 24Hz সহ setFrameRate() কল করার মাধ্যমে, ভিডিও সারফেস প্ল্যাটফর্মকে সোর্স ভিডিওর ফ্রেম রেট সম্পর্কে আরও তথ্য দেয়, যার ফলে প্ল্যাটফর্ম ডিসপ্লে রিফ্রেশ রেটের জন্য 90Hz বেছে নিতে পারে, যা এই পরিস্থিতিতে 60Hz-এর চেয়ে ভাল।

তবে, এমন কিছু পরিস্থিতি আছে যেখানে setFrameRate()-এর পরিবর্তে preferredDisplayModeId ব্যবহার করা উচিত, যেমন:

  • অ্যাপটি রেজোলিউশন বা অন্যান্য ডিসপ্লে মোড সেটিংস পরিবর্তন করতে চাইলে, preferredDisplayModeId ব্যবহার করুন।
  • setFrameRate()-এ কল করার উত্তরে প্ল্যাটফর্মটি শুধুমাত্র ডিসপ্লে মোড পরিবর্তন করবে যদি মোড পরিবর্তনটি লাইটওয়েট হয় এবং ব্যবহারকারীর লক্ষ্য করার সম্ভাবনা না থাকে। অ্যাপটি যদি ডিসপ্লে রিফ্রেশ রেট পরিবর্তন করতে পছন্দ করে, এমনকি যদি এর জন্য একটি ভারী মোড সুইচ প্রয়োজন হয় (যেমন, Android TV ডিভাইসে), তাহলে preferredDisplayModeId ব্যবহার করুন।
  • যেসব অ্যাপ, অ্যাপের ফ্রেম রেটের একাধিক রেটে চলা ডিসপ্লে ম্যানেজ করতে পারে না, যেগুলির জন্য প্রতিটি ফ্রেমে প্রেজেন্টেশন টাইমস্ট্যাম্প সেট করতে হয়, সেগুলির preferredDisplayModeId ব্যবহার করা উচিত।

setFrameRate() বনাম preferredRefreshRate

WindowManager.LayoutParams#preferredRefreshRate অ্যাপের উইন্ডোতে পছন্দের ফ্রেম রেট সেট করে এবং এই রেট উইন্ডোর মধ্যে থাকা সব সারফেসের ক্ষেত্রে প্রযোজ্য হয়। অ্যাপের উচিত ডিভাইসের সমর্থিত রিফ্রেশ রেট নির্বিশেষে তার পছন্দের ফ্রেম রেট নির্দিষ্ট করা, setFrameRate()-এর মতো, যাতে শিডিউলারকে অ্যাপের কাঙ্ক্ষিত ফ্রেম রেটের একটি ভালো ইঙ্গিত দেওয়া যায়।

setFrameRate() ব্যবহার করে এমন সারফেসের জন্য preferredRefreshRate উপেক্ষা করা হয়। সাধারণত সম্ভব হলে setFrameRate() ব্যবহার করুন।

preferredRefreshRate বনাম preferredDisplayModeId

অ্যাপ যদি শুধু পছন্দের রিফ্রেশ রেট পরিবর্তন করতে চায়, তাহলে preferredDisplayModeId-এর পরিবর্তে preferredRefreshRate ব্যবহার করা ভালো।

খুব ঘন ঘন setFrameRate() কল করা এড়িয়ে চলা

যদিও পারফর্ম্যান্সের দিক থেকে setFrameRate() কল খুব একটা ব্যয়বহুল নয়, অ্যাপের উচিত প্রতি ফ্রেমে বা প্রতি সেকেন্ডে একাধিকবার setFrameRate() কল করা এড়িয়ে চলা। setFrameRate()-এ কল করার ফলে ডিসপ্লে রিফ্রেশ রেটে পরিবর্তন হতে পারে, যার ফলে ট্রানজিশনের সময় ফ্রেম ড্রপ হতে পারে। আপনাকে আগে থেকেই সঠিক ফ্রেম রেট নির্ধারণ করতে হবে এবং setFrameRate()-এ একবার কল করতে হবে।

গেম বা অন্যান্য নন-ভিডিও অ্যাপের জন্য ব্যবহার

setFrameRate() API-এর প্রাথমিক ব্যবহার ভিডিওর জন্য হলেও, এটি অন্যান্য অ্যাপের জন্য ব্যবহার করা যেতে পারে। যেমন, কোনও গেম ৬০ হার্জের বেশি রিফ্রেশ রেটে না চালানোর জন্য (পাওয়ারের ব্যবহার কমাতে এবং আরও বেশি সময় ধরে খেলার সেশন পেতে) Surface.setFrameRate(60, Surface.FRAME_RATE_COMPATIBILITY_DEFAULT) কল করতে পারে। এইভাবে, যে ডিভাইস সাধারণত ৯০ হার্জে চলে, সেটি গেম অ্যাক্টিভ থাকার সময় ৬০ হার্জে চলবে। এর ফলে, গেম ৬০ হার্জে এবং ডিসপ্লে ৯০ হার্জে চললে যে কাঁপুনি দেখা যেত, তা এড়ানো যাবে।

FRAME_RATE_COMPATIBILITY_FIXED_SOURCE-এর ব্যবহার

FRAME_RATE_COMPATIBILITY_FIXED_SOURCE শুধুমাত্র ভিডিও অ্যাপের জন্য। ভিডিও ছাড়া অন্য কিছুর জন্য, FRAME_RATE_COMPATIBILITY_DEFAULT ব্যবহার করুন।

ফ্রেম রেট পরিবর্তন করার জন্য স্ট্র্যাটেজি বেছে নেওয়া

  • আমরা বিশেষভাবে সাজেস্ট করি যে অ্যাপ, সিনেমা দেখার মতো দীর্ঘ সময় ধরে চলা ভিডিও দেখানোর সময়, setFrameRate(fps, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, CHANGE_FRAME_RATE_ALWAYS) কল করুন যেখানে fps হল ভিডিওর ফ্রেম রেট।
  • আপনি যদি আশা করেন যে ভিডিও প্লেব্যাক কয়েক মিনিট বা তার কম সময় ধরে চলবে, তাহলে CHANGE_FRAME_RATE_ALWAYS সহ setFrameRate() কল করে এমন অ্যাপ ব্যবহার না করার জন্য আমরা বিশেষভাবে সাজেস্ট করি।

ভিডিও প্লেব্যাক অ্যাপের জন্য ইন্টিগ্রেশনের উদাহরণ

ভিডিও প্লেব্যাক অ্যাপে রিফ্রেশ রেট সুইচ ইন্টিগ্রেট করার জন্য আমরা নিম্নলিখিত ধাপগুলি সাজেস্ট করি:

  1. changeFrameRateStrategy ঠিক করুন:
    1. সিনেমা দেখার মতো দীর্ঘ সময় ধরে চলা ভিডিও দেখার সময় MATCH_CONTENT_FRAMERATE_ALWAYS ব্যবহার করুন
    2. মুভি ট্রেলারের মতো ছোট ভিডিও চালানোর জন্য CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS ব্যবহার করুন
  2. changeFrameRateStrategy যদি CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS হয় , তাহলে ৪ নম্বর ধাপে যান।
  3. নন-সিমলেস রিফ্রেশ রেট সুইচ হতে চলেছে কিনা তা শনাক্ত করতে, এই দুটি তথ্যই সত্য কিনা তা চেক করুন:
    1. বর্তমান রিফ্রেশ রেট (ধরা যাক C) থেকে ভিডিওর ফ্রেম রেটে (ধরা যাক V) সিমলেস মোড সুইচ করা সম্ভব নয়। C এবং V আলাদা হলে এবং Display.getMode().getAlternativeRefreshRates V-এর গুণিতক না হলে এটি হবে।
    2. ব্যবহারকারী নন-সিমলেস রিফ্রেশ রেট পরিবর্তন চালু করেছেন। আপনি এটি শনাক্ত করতে পারবেন যদি DisplayManager.getMatchContentFrameRateUserPreference MATCH_CONTENT_FRAMERATE_ALWAYS রিটার্ন করে
  4. সুইচটি যদি নিরবচ্ছিন্ন হতে চলেছে, তাহলে নিম্নলিখিতগুলি করুন:
    1. setFrameRate কল করুন এবং fps, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, এবং changeFrameRateStrategy পাস করুন, যেখানে fps হল ভিডিওর ফ্রেম রেট।
    2. ভিডিও প্লেব্যাক শুরু করুন
  5. নন-সিমলেস মোড পরিবর্তন হতে চলেছে, তাহলে নিম্নলিখিত কাজগুলি করুন:
    1. ব্যবহারকারীকে বিজ্ঞপ্তি পাঠাতে UX দেখান। মনে রাখবেন, আমরা সাজেস্ট করি যে আপনি এমন একটি উপায় প্রয়োগ করুন যাতে ব্যবহারকারী এই UX বাতিল করতে পারেন এবং ৫.ঘ ধাপে অতিরিক্ত বিলম্ব এড়িয়ে যেতে পারেন। এটি কারণ আমাদের সাজেস্ট করা বিলম্ব ডিসপ্লেতে প্রয়োজনের চেয়ে বেশি দ্রুত সুইচিং সময় প্রদর্শন করে।
    2. setFrameRate কল করুন এবং এটি fps, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, এবং CHANGE_FRAME_RATE_ALWAYS-এ পাস করুন, যেখানে fps হল ভিডিওর ফ্রেম রেট।
    3. onDisplayChanged কলব্যাকের জন্য অপেক্ষা করুন।
    4. মোড পরিবর্তন সম্পূর্ণ হওয়ার জন্য ২ সেকেন্ড অপেক্ষা করুন।
    5. ভিডিও প্লেব্যাক শুরু করুন

শুধুমাত্র নিরবচ্ছিন্নভাবে পাল্টানোর সুবিধা কাজ করে এমন সিউডো-কোড নিচে দেওয়া হল:

SurfaceControl.Transaction transaction = new SurfaceControl.Transaction();
transaction.setFrameRate(surfaceControl,
    contentFrameRate,
    FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
    CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS);
transaction.apply();
beginPlayback();

উপরে বর্ণিত নিরবচ্ছিন্ন ও নিরবচ্ছিন্ন নয় এমন পাল্টানোর সুবিধা কাজ করার জন্য সিউডো-কোড নিচে দেওয়া হল:

SurfaceControl.Transaction transaction = new SurfaceControl.Transaction();
if (isSeamlessSwitch(contentFrameRate)) {
  transaction.setFrameRate(surfaceControl,
      contentFrameRate,
      FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
      CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS);
  transaction.apply();
  beginPlayback();
} else if (displayManager.getMatchContentFrameRateUserPreference()
      == MATCH_CONTENT_FRAMERATE_ALWAYS) {
  showRefreshRateSwitchUI();
  sleep(shortDelaySoUserSeesUi);
  displayManager.registerDisplayListener(…);
  transaction.setFrameRate(surfaceControl,
      contentFrameRate,
      FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
      CHANGE_FRAME_RATE_ALWAYS);
  transaction.apply();
  waitForOnDisplayChanged();
  sleep(twoSeconds);
  hideRefreshRateSwitchUI();
  beginPlayback();
}