চক্রের হার

ফ্রেম রেট API অ্যাপগুলিকে Android প্ল্যাটফর্মকে তাদের উদ্দেশ্যযুক্ত ফ্রেম রেট সম্পর্কে জানাতে দেয় এবং Android 11 (API স্তর 30) বা উচ্চতরকে লক্ষ্য করে এমন অ্যাপগুলিতে উপলব্ধ। প্রথাগতভাবে, বেশিরভাগ ডিভাইস শুধুমাত্র একটি একক ডিসপ্লে রিফ্রেশ রেট সমর্থন করে, সাধারণত 60Hz, কিন্তু এটি পরিবর্তিত হচ্ছে। অনেক ডিভাইস এখন অতিরিক্ত রিফ্রেশ রেট সমর্থন করে যেমন 90Hz বা 120Hz। কিছু ডিভাইস নিরবচ্ছিন্ন রিফ্রেশ রেট সুইচ সমর্থন করে, অন্যরা সংক্ষিপ্তভাবে একটি কালো পর্দা দেখায়, সাধারণত এক সেকেন্ড স্থায়ী হয়।

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

মৌলিক ব্যবহার

অ্যান্ড্রয়েড সারফেস অ্যাক্সেস এবং নিয়ন্ত্রণ করার বিভিন্ন উপায় প্রকাশ করে, তাই 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 প্ল্যাটফর্মে একটি অতিরিক্ত ইঙ্গিত দেওয়া হয় যে অ্যাপটি একটি অ-ম্যাচিং ডিসপ্লে রিফ্রেশ হারের সাথে খাপ খাইয়ে নিতে পুলডাউন ব্যবহার করবে (যার ফলে বিচার হবে) )

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

অ-বিজোড় ফ্রেম হার সুইচ

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

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

এই কারণে, নন-সিমলেস রিফ্রেশ রেট সুইচগুলি সক্ষম করা যেতে পারে যদি ব্যবহারকারী এবং অ্যাপ উভয়ই অপ্ট-ইন করে:

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

অতিরিক্ত সুপারিশ

সাধারণ পরিস্থিতিতে এই সুপারিশ অনুসরণ করুন.

একাধিক পৃষ্ঠতল

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

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

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

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

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

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

কিছু ক্ষেত্রে, প্ল্যাটফর্ম setFrameRate() এ উল্লিখিত অ্যাপের ফ্রেম হারের একাধিকতে স্যুইচ করতে পারে। উদাহরণস্বরূপ, একটি অ্যাপ 60Hz-এর সাথে setFrameRate() কল করতে পারে এবং ডিভাইসটি 120Hz-এ ডিসপ্লে স্যুইচ করতে পারে। এটি ঘটতে পারে এমন একটি কারণ হল যদি অন্য অ্যাপে 24Hz এর ফ্রেম রেট সেটিং সহ পৃষ্ঠ থাকে। সেক্ষেত্রে, 120Hz-এ ডিসপ্লে চালানো হলে 60Hz সারফেস এবং 24Hz সারফেস উভয়ই চালানোর অনুমতি দেবে কোন পুলডাউনের প্রয়োজন নেই।

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

setFrameRate() বনাম preferredDisplayModeId

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

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

যাইহোক, এমন পরিস্থিতি রয়েছে যেখানে setFrameRate() এর পরিবর্তে preferredDisplayModeId ব্যবহার করা উচিত, যেমন নিম্নলিখিত:

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

setFrameRate() বনাম preferredRefreshRate

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

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

preferredRefreshRate বনাম preferredDisplayModeId

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

সেটফ্রেমরেট() কে খুব ঘন ঘন কল করা এড়িয়ে যাওয়া

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

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

যদিও ভিডিওটি setFrameRate() API-এর জন্য প্রাথমিক ব্যবহারের ক্ষেত্রে, এটি অন্যান্য অ্যাপের জন্য ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, একটি গেম যা 60Hz-এর বেশি না চালানোর ইচ্ছা করে (বিদ্যুতের ব্যবহার কমাতে এবং দীর্ঘ খেলার সেশনগুলি অর্জন করতে) Surface.setFrameRate(60, Surface.FRAME_RATE_COMPATIBILITY_DEFAULT) কল করতে পারে। এইভাবে, একটি ডিভাইস যেটি ডিফল্টরূপে 90Hz এ চলে তা পরিবর্তে গেমটি সক্রিয় থাকাকালীন 60Hz এ চলবে, যা 60Hz এ খেলার সময় যখন ডিসপ্লেটি 90Hz এ চলে তাহলে তা ঘটতে পারে না।

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 হয়, ধাপ 4 এ যান৷
  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 খারিজ করার জন্য একটি উপায় প্রয়োগ করুন এবং ধাপ 5.d-এ অতিরিক্ত বিলম্ব এড়িয়ে যান। এর কারণ হল আমাদের প্রস্তাবিত বিলম্ব যে ডিসপ্লেগুলিতে দ্রুত স্যুইচিং সময় দেখায় সেগুলির জন্য প্রয়োজনের চেয়ে বেশি।
    2. setFrameRate কল করুন এবং এটিকে fps , FRAME_RATE_COMPATIBILITY_FIXED_SOURCE , এবং CHANGE_FRAME_RATE_ALWAYS পাস করুন, যেখানে fps হল ভিডিওর ফ্রেম রেট৷
    3. onDisplayChanged কলব্যাকের জন্য অপেক্ষা করুন।
    4. মোড স্যুইচ সম্পূর্ণ হওয়ার জন্য 2 সেকেন্ড অপেক্ষা করুন।
    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();
}