ফ্রেম রেট এপিআই অ্যাপগুলোকে অ্যান্ড্রয়েড প্ল্যাটফর্মকে তাদের কাঙ্ক্ষিত ফ্রেম রেট সম্পর্কে জানাতে সাহায্য করে এবং এটি সেইসব অ্যাপে উপলব্ধ যা অ্যান্ড্রয়েড ১১ (এপিআই লেভেল ৩০) বা তার উচ্চতর সংস্করণকে টার্গেট করে। ঐতিহ্যগতভাবে, বেশিরভাগ ডিভাইস কেবল একটি ডিসপ্লে রিফ্রেশ রেট সমর্থন করত, সাধারণত ৬০ হার্টজ, কিন্তু এই পরিস্থিতি এখন বদলাচ্ছে। এখন অনেক ডিভাইস ৯০ হার্টজ বা ১২০ হার্টজের মতো অতিরিক্ত রিফ্রেশ রেট সমর্থন করে। কিছু ডিভাইস নির্বিঘ্নে রিফ্রেশ রেট পরিবর্তন করতে পারে, আবার অন্যগুলোতে অল্প সময়ের জন্য একটি কালো স্ক্রিন দেখা যায়, যা সাধারণত এক সেকেন্ড স্থায়ী হয়।
এপিআই-এর প্রধান উদ্দেশ্য হলো অ্যাপগুলোকে সমর্থিত সমস্ত ডিসপ্লে রিফ্রেশ রেটের আরও ভালোভাবে সুবিধা নিতে সক্ষম করা। উদাহরণস্বরূপ, একটি অ্যাপ যখন 24Hz ভিডিও প্লে করার জন্য setFrameRate() কল করে, তখন ডিভাইসটি ডিসপ্লে রিফ্রেশ রেট 60Hz থেকে 120Hz-এ পরিবর্তন করতে পারে। এই নতুন রিফ্রেশ রেট 24Hz ভিডিওর মসৃণ ও ঝাঁকুনিহীন প্লেব্যাক নিশ্চিত করে, যার জন্য 3:2 পুলডাউনের প্রয়োজন হয় না, যা একই ভিডিও 60Hz ডিসপ্লেতে প্লে করার জন্য প্রয়োজন হতো। এর ফলে ব্যবহারকারীর অভিজ্ঞতা আরও উন্নত হয়।
মৌলিক ব্যবহার
অ্যান্ড্রয়েড সারফেস অ্যাক্সেস এবং নিয়ন্ত্রণ করার জন্য বিভিন্ন উপায় প্রদান করে, তাই setFrameRate() API-এর বেশ কয়েকটি সংস্করণ রয়েছে। API-এর প্রতিটি সংস্করণ একই প্যারামিটার গ্রহণ করে এবং অন্যগুলোর মতোই কাজ করে:
-
Surface.setFrameRate() -
SurfaceControl.Transaction.setFrameRate() -
ANativeWindow_setFrameRate() -
ASurfaceTransaction_setFrameRate()
setFrameRate() নিরাপদে কল করার জন্য, অ্যাপটিকে প্রকৃত সমর্থিত ডিসপ্লে রিফ্রেশ রেট বিবেচনা করার প্রয়োজন নেই, যা Display.getSupportedModes() কল করে পাওয়া যায়। উদাহরণস্বরূপ, ডিভাইসটি যদি কেবল 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 কল করা হলে মোড পরিবর্তন করে না।
কিছু ব্যবহারকারী দীর্ঘ ভিডিওর শুরুতে এবং শেষে একটি দৃশ্যগত বিরতি পছন্দ করেন। এর ফলে ডিসপ্লের রিফ্রেশ রেট ভিডিওর ফ্রেম রেটের সাথে মিলে যায় এবং মুভি দেখার সময় ৩:২ পুলডাউন জ্যাডারের মতো ফ্রেম-রেট রূপান্তরের ত্রুটি এড়ানো যায়।
এই কারণে, ব্যবহারকারী এবং অ্যাপ উভয়ই সম্মতি দিলে অসমান রিফ্রেশ রেট স্যুইচিং সক্রিয় করা যেতে পারে:
- ব্যবহারকারীগণ : এতে অংশ নিতে, ব্যবহারকারীরা ‘ম্যাচ কন্টেন্ট ফ্রেম রেট’ ব্যবহারকারী সেটিংটি চালু করতে পারেন।
- অ্যাপস : এতে অংশ নিতে, অ্যাপগুলি
setFrameRate()ফাংশনেCHANGE_FRAME_RATE_ALWAYSপাস করতে পারে।
সিনেমার মতো দীর্ঘ ভিডিওর ক্ষেত্রে আমরা আপনাকে সর্বদা 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() প্ল্যাটফর্মকে এমন পরিস্থিতিতে একটি সামঞ্জস্যপূর্ণ ফ্রেম রেট বেছে নেওয়ার আরও সুযোগ দেয়, যেখানে একাধিক সারফেস ভিন্ন ভিন্ন ফ্রেম রেটে চলছে। উদাহরণস্বরূপ, এমন একটি পরিস্থিতির কথা ভাবুন যেখানে একটি পিক্সেল ৪-এ দুটি অ্যাপ স্প্লিট-স্ক্রিন মোডে চলছে, যেখানে একটি অ্যাপ ২৪Hz-এর একটি ভিডিও প্লে করছে এবং অন্যটি ব্যবহারকারীকে একটি স্ক্রোলযোগ্য তালিকা দেখাচ্ছে। পিক্সেল ৪ দুটি ডিসপ্লে রিফ্রেশ রেট সমর্থন করে: ৬০Hz এবং ৯০Hz। preferredDisplayModeId API ব্যবহার করে, ভিডিও সারফেসটি ৬০Hz বা ৯০Hz-এর মধ্যে যেকোনো একটি বেছে নিতে বাধ্য হয়। ২৪Hz দিয়ে setFrameRate() কল করার মাধ্যমে, ভিডিও সারফেসটি প্ল্যাটফর্মকে সোর্স ভিডিওর ফ্রেম রেট সম্পর্কে আরও তথ্য দেয়, যা প্ল্যাটফর্মকে ডিসপ্লে রিফ্রেশ রেটের জন্য ৯০Hz বেছে নিতে সক্ষম করে, যা এই পরিস্থিতিতে ৬০Hz-এর চেয়ে ভালো।
তবে, এমন কিছু পরিস্থিতি রয়েছে যেখানে setFrameRate() এর পরিবর্তে preferredDisplayModeId ব্যবহার করা উচিত, যেমন নিম্নলিখিত উদাহরণগুলো:
- অ্যাপটি যদি রেজোলিউশন বা অন্যান্য ডিসপ্লে মোড সেটিংস পরিবর্তন করতে চায়, তাহলে
preferredDisplayModeIdব্যবহার করুন। - প্ল্যাটফর্মটি শুধুমাত্র তখনই
setFrameRate()কলের প্রতিক্রিয়ায় ডিসপ্লে মোড পরিবর্তন করবে, যদি মোড পরিবর্তনটি হালকা হয় এবং ব্যবহারকারীর কাছে তা লক্ষণীয় হওয়ার সম্ভাবনা কম থাকে। যদি অ্যাপটি একটি বড় ধরনের মোড পরিবর্তনের প্রয়োজন হলেও ডিসপ্লে রিফ্রেশ রেট পরিবর্তন করতে চায় (উদাহরণস্বরূপ, একটি অ্যান্ড্রয়েড টিভি ডিভাইসে), তাহলেpreferredDisplayModeIdব্যবহার করুন। - যেসব অ্যাপ তাদের নিজস্ব ফ্রেম রেটের গুণিতকে ডিসপ্লে চালাতে পারে না, যার জন্য প্রতিটি ফ্রেমে প্রেজেন্টেশন টাইমস্ট্যাম্প সেট করতে হয়, তাদের
preferredDisplayModeIdব্যবহার করা উচিত।
setFrameRate() বনাম preferredRefreshRate
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-এ চলবে। এর ফলে, ডিসপ্লে 90Hz-এ চলার সময় গেমটি 60Hz-এ চললে যে ঝাঁকুনি বা জ্যাডার হতো, তা এড়ানো যাবে।
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()কল করা থেকে আমরা দৃঢ়ভাবে বিরত থাকার পরামর্শ দিই।
ভিডিও প্লেব্যাক অ্যাপের জন্য ইন্টিগ্রেশনের উদাহরণ
ভিডিও প্লেব্যাক অ্যাপে রিফ্রেশ রেট সুইচ যুক্ত করার জন্য আমরা নিম্নলিখিত পদক্ষেপগুলো অনুসরণ করার পরামর্শ দিই:
-
changeFrameRateStrategyনির্ধারণ করুন:- সিনেমার মতো দীর্ঘ ভিডিও চালানোর ক্ষেত্রে
MATCH_CONTENT_FRAMERATE_ALWAYSব্যবহার করুন। - মুভি ট্রেলারের মতো ছোট ভিডিও চালানোর ক্ষেত্রে
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESSব্যবহার করুন।
- সিনেমার মতো দীর্ঘ ভিডিও চালানোর ক্ষেত্রে
- যদি
changeFrameRateStrategyটিCHANGE_FRAME_RATE_ONLY_IF_SEAMLESSহয়, তাহলে ধাপ ৪-এ যান। - এই উভয় তথ্যই সত্য কিনা তা যাচাই করে শনাক্ত করুন যে একটি অসমান রিফ্রেশ রেট পরিবর্তন ঘটতে চলেছে কিনা:
- বর্তমান রিফ্রেশ রেট (ধরা যাক C) থেকে ভিডিওর ফ্রেম রেটে (ধরা যাক V) নির্বিঘ্নে মোড পরিবর্তন করা সম্ভব নয়। এমনটা তখনই হবে, যদি C এবং V ভিন্ন হয় এবং
Display.getMode().getAlternativeRefreshRatesV-এর কোনো গুণিতক না থাকে। - ব্যবহারকারী নিরবচ্ছিন্ন নয় এমন রিফ্রেশ রেট পরিবর্তনে সম্মতি দিয়েছেন।
DisplayManager.getMatchContentFrameRateUserPreferenceMATCH_CONTENT_FRAMERATE_ALWAYSরিটার্ন করা হচ্ছে কি না, তা পরীক্ষা করে আপনি এটি শনাক্ত করতে পারেন।
- বর্তমান রিফ্রেশ রেট (ধরা যাক C) থেকে ভিডিওর ফ্রেম রেটে (ধরা যাক V) নির্বিঘ্নে মোড পরিবর্তন করা সম্ভব নয়। এমনটা তখনই হবে, যদি C এবং V ভিন্ন হয় এবং
- যদি পরিবর্তনটি নির্বিঘ্ন করতে হয়, তাহলে নিম্নলিখিতগুলি করুন:
-
setFrameRateকল করুন এবং এতেfps,FRAME_RATE_COMPATIBILITY_FIXED_SOURCEওchangeFrameRateStrategyপাস করুন, যেখানেfpsহলো ভিডিওটির ফ্রেম রেট। - ভিডিও প্লেব্যাক শুরু করুন
-
- যদি একটি অমসৃণ মোড পরিবর্তন ঘটতে চলেছে, তাহলে নিম্নলিখিতগুলি করুন:
- ব্যবহারকারীকে অবহিত করতে ইউএক্স (UX) দেখান। উল্লেখ্য যে, আমরা আপনাকে এমন একটি উপায় প্রয়োগ করার পরামর্শ দিচ্ছি যার মাধ্যমে ব্যবহারকারী এই ইউএক্সটি খারিজ করতে এবং ধাপ ৫.ডি-তে থাকা অতিরিক্ত বিলম্বটি এড়িয়ে যেতে পারবেন। এর কারণ হলো, যেসব ডিসপ্লেতে সুইচিং টাইম দ্রুততর, সেগুলোর ক্ষেত্রে আমাদের প্রস্তাবিত বিলম্ব প্রয়োজনের চেয়ে বেশি।
-
setFrameRateকল করুন এবং এতেfps,FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, ওCHANGE_FRAME_RATE_ALWAYSপাস করুন, যেখানেfpsহলো ভিডিওটির ফ্রেম রেট। -
onDisplayChangedকলব্যাকটির জন্য অপেক্ষা করুন। - মোড পরিবর্তন সম্পন্ন হওয়ার জন্য ২ সেকেন্ড অপেক্ষা করুন।
- ভিডিও প্লেব্যাক শুরু করুন
শুধুমাত্র নির্বিঘ্ন স্যুইচিং সমর্থন করার জন্য সিউডো-কোডটি নিম্নরূপ:
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();
}