চক্রের হার

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

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

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

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

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

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

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

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

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

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

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

অ্যান্ড্রয়েড প্ল্যাটফর্মটি এমনভাবে তৈরি করা হয়েছে যাতে বিভিন্ন ফ্রেম রেট সেটিংস সহ একাধিক সারফেস সঠিকভাবে পরিচালনা করা যায়। যখন আপনার অ্যাপে বিভিন্ন ফ্রেম রেট সহ একাধিক সারফেস থাকে, তখন প্রতিটি সারফেসের জন্য সঠিক ফ্রেম রেট সহ 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 ব্যবহার করা উচিত।

সেটফ্রেমরেট() বনাম পছন্দের রিফ্রেশরেট

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

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

পছন্দের রিফ্রেশরেট বনাম পছন্দের ডিসপ্লেমোডআইডি

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

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

যদিও 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 হয়, তাহলে ধাপ ৪ এ যান।
  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();
}