ফ্রেম রেট API অ্যাপগুলিকে Android প্ল্যাটফর্মকে তাদের উদ্দেশ্যযুক্ত ফ্রেম রেট সম্পর্কে জানাতে দেয় এবং Android 11 (API স্তর 30) বা উচ্চতরকে লক্ষ্য করে এমন অ্যাপগুলিতে উপলব্ধ। প্রথাগতভাবে, বেশিরভাগ ডিভাইস শুধুমাত্র একটি একক ডিসপ্লে রিফ্রেশ রেট সমর্থন করে, সাধারণত 60Hz, কিন্তু এটি পরিবর্তিত হচ্ছে। অনেক ডিভাইস এখন অতিরিক্ত রিফ্রেশ রেট সমর্থন করে যেমন 90Hz বা 120Hz। কিছু ডিভাইস নিরবচ্ছিন্ন রিফ্রেশ রেট সুইচ সমর্থন করে, অন্যরা সংক্ষিপ্তভাবে একটি কালো পর্দা দেখায়, সাধারণত এক সেকেন্ড স্থায়ী হয়।
API-এর প্রাথমিক উদ্দেশ্য হল সমস্ত সমর্থিত ডিসপ্লে রিফ্রেশ রেটগুলির আরও ভাল সুবিধা নিতে অ্যাপগুলিকে সক্ষম করা৷ উদাহরণ স্বরূপ, setFrameRate()
কল করে এমন একটি 24Hz ভিডিও চালানোর ফলে ডিভাইসটি ডিসপ্লে রিফ্রেশ রেট 60Hz থেকে 120Hz এ পরিবর্তন করতে পারে। এই নতুন রিফ্রেশ রেটটি 24Hz ভিডিওর মসৃণ, জুডার-মুক্ত প্লেব্যাক সক্ষম করে, 60Hz ডিসপ্লেতে একই ভিডিও চালানোর জন্য 3:2 পুলডাউনের প্রয়োজন নেই। এর ফলে ব্যবহারকারীর অভিজ্ঞতা আরও ভালো হয়।
মৌলিক ব্যবহার
অ্যান্ড্রয়েড সারফেস অ্যাক্সেস এবং নিয়ন্ত্রণ করার বিভিন্ন উপায় প্রকাশ করে, তাই setFrameRate()
API-এর বিভিন্ন সংস্করণ রয়েছে। API এর প্রতিটি সংস্করণ একই পরামিতি নেয় এবং অন্যের মতো একই কাজ করে:
-
Surface.setFrameRate()
-
SurfaceControl.Transaction.setFrameRate()
-
ANativeWindow_setFrameRate()
-
ASurfaceTransaction_setFrameRate()
অ্যাপটির প্রকৃত সমর্থিত ডিসপ্লে রিফ্রেশ রেট বিবেচনা করার প্রয়োজন নেই, যা 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
setFrameRate()
এ পাস করতে পারে।
আমরা আপনাকে সর্বদা 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()
কল করার অ্যাপগুলির বিরুদ্ধে আমরা দৃঢ়ভাবে সুপারিশ করি যখন আপনি আশা করেন যে ভিডিও প্লেব্যাক কয়েক মিনিট বা তার কম স্থায়ী হবে।
ভিডিও প্লেব্যাক অ্যাপের জন্য উদাহরণ ইন্টিগ্রেশন
ভিডিও প্লেব্যাক অ্যাপ্লিকেশানগুলিতে রিফ্রেশ রেট সুইচগুলিকে সংহত করার জন্য আমরা নিম্নলিখিত পদক্ষেপগুলি সুপারিশ করি:
-
changeFrameRateStrategy
সিদ্ধান্ত নিন:- সিনেমার মতো দীর্ঘক্ষণ চলমান ভিডিও চালালে
MATCH_CONTENT_FRAMERATE_ALWAYS
ব্যবহার করুন - একটি মুভ ট্রেলারের মতো একটি ছোট ভিডিও চালানো হলে
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS
ব্যবহার করুন
- সিনেমার মতো দীর্ঘক্ষণ চলমান ভিডিও চালালে
- যদি
changeFrameRateStrategy
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS
হয়, ধাপ 4 এ যান৷ - এই দুটি ঘটনাই সত্য কিনা তা পরীক্ষা করে একটি অ-বিরামহীন রিফ্রেশ রেট সুইচ ঘটতে চলেছে কিনা তা সনাক্ত করুন:
- বর্তমান রিফ্রেশ রেট (আসুন এটিকে C বলি) থেকে ভিডিওর ফ্রেম রেট পর্যন্ত সীমাহীন মোড সুইচ করা সম্ভব নয় (আসুন এটিকে V বলি)। এটি হবে যদি C এবং V আলাদা হয় এবং
Display.getMode().getAlternativeRefreshRates
V এর একাধিক না থাকে। - ব্যবহারকারী অ-বিজোড় রিফ্রেশ হার পরিবর্তন নির্বাচন করেছেন.
DisplayManager.getMatchContentFrameRateUserPreference
MATCH_CONTENT_FRAMERATE_ALWAYS
প্রদান করে কিনা তা পরীক্ষা করে আপনি এটি সনাক্ত করতে পারেন
- বর্তমান রিফ্রেশ রেট (আসুন এটিকে C বলি) থেকে ভিডিওর ফ্রেম রেট পর্যন্ত সীমাহীন মোড সুইচ করা সম্ভব নয় (আসুন এটিকে V বলি)। এটি হবে যদি C এবং V আলাদা হয় এবং
- যদি সুইচটি নিরবচ্ছিন্ন হতে চলেছে তবে নিম্নলিখিতগুলি করুন:
-
setFrameRate
কল করুন এবং এটিকে পাস করুনfps
,FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
, এবংchangeFrameRateStrategy
, যেখানেfps
হল ভিডিওর ফ্রেম রেট৷ - ভিডিও প্লেব্যাক শুরু করুন
-
- যদি একটি নন-সিমলেস মোড পরিবর্তন ঘটতে চলেছে, নিম্নলিখিতগুলি করুন:
- ব্যবহারকারীকে অবহিত করতে UX দেখান। মনে রাখবেন যে আমরা আপনাকে সুপারিশ করছি যে ব্যবহারকারীর জন্য এই UX খারিজ করার জন্য একটি উপায় প্রয়োগ করুন এবং ধাপ 5.d-এ অতিরিক্ত বিলম্ব এড়িয়ে যান। এর কারণ হল আমাদের প্রস্তাবিত বিলম্ব যে ডিসপ্লেগুলিতে দ্রুত স্যুইচিং সময় দেখায় সেগুলির জন্য প্রয়োজনের চেয়ে বেশি।
-
setFrameRate
কল করুন এবং এটিকেfps
,FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
, এবংCHANGE_FRAME_RATE_ALWAYS
পাস করুন, যেখানেfps
হল ভিডিওর ফ্রেম রেট৷ -
onDisplayChanged
কলব্যাকের জন্য অপেক্ষা করুন। - মোড স্যুইচ সম্পূর্ণ হওয়ার জন্য 2 সেকেন্ড অপেক্ষা করুন।
- ভিডিও প্লেব্যাক শুরু করুন
ছদ্ম-কোড শুধুমাত্র বিরামহীন সুইচিং সমর্থন করার জন্য নিম্নরূপ:
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();
}
,ফ্রেম রেট API অ্যাপগুলিকে Android প্ল্যাটফর্মকে তাদের উদ্দেশ্যযুক্ত ফ্রেম রেট সম্পর্কে জানাতে দেয় এবং Android 11 (API স্তর 30) বা উচ্চতরকে লক্ষ্য করে এমন অ্যাপগুলিতে উপলব্ধ। প্রথাগতভাবে, বেশিরভাগ ডিভাইস শুধুমাত্র একটি একক ডিসপ্লে রিফ্রেশ রেট সমর্থন করে, সাধারণত 60Hz, কিন্তু এটি পরিবর্তিত হচ্ছে। অনেক ডিভাইস এখন অতিরিক্ত রিফ্রেশ রেট সমর্থন করে যেমন 90Hz বা 120Hz। কিছু ডিভাইস নিরবচ্ছিন্ন রিফ্রেশ রেট সুইচ সমর্থন করে, অন্যরা সংক্ষিপ্তভাবে একটি কালো পর্দা দেখায়, সাধারণত এক সেকেন্ড স্থায়ী হয়।
API-এর প্রাথমিক উদ্দেশ্য হল সমস্ত সমর্থিত ডিসপ্লে রিফ্রেশ রেটগুলির আরও ভাল সুবিধা নিতে অ্যাপগুলিকে সক্ষম করা৷ উদাহরণ স্বরূপ, setFrameRate()
কল করে এমন একটি 24Hz ভিডিও চালানোর ফলে ডিভাইসটি ডিসপ্লে রিফ্রেশ রেট 60Hz থেকে 120Hz এ পরিবর্তন করতে পারে। এই নতুন রিফ্রেশ রেটটি 24Hz ভিডিওর মসৃণ, জুডার-মুক্ত প্লেব্যাক সক্ষম করে, 60Hz ডিসপ্লেতে একই ভিডিও চালানোর জন্য 3:2 পুলডাউনের প্রয়োজন নেই। এর ফলে ব্যবহারকারীর অভিজ্ঞতা আরও ভালো হয়।
মৌলিক ব্যবহার
অ্যান্ড্রয়েড সারফেস অ্যাক্সেস এবং নিয়ন্ত্রণ করার বিভিন্ন উপায় প্রকাশ করে, তাই setFrameRate()
API-এর বিভিন্ন সংস্করণ রয়েছে। API এর প্রতিটি সংস্করণ একই পরামিতি নেয় এবং অন্যের মতো একই কাজ করে:
-
Surface.setFrameRate()
-
SurfaceControl.Transaction.setFrameRate()
-
ANativeWindow_setFrameRate()
-
ASurfaceTransaction_setFrameRate()
অ্যাপটির প্রকৃত সমর্থিত ডিসপ্লে রিফ্রেশ রেট বিবেচনা করার প্রয়োজন নেই, যা 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
setFrameRate()
এ পাস করতে পারে।
আমরা আপনাকে সর্বদা 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()
কল করার অ্যাপগুলির বিরুদ্ধে আমরা দৃঢ়ভাবে সুপারিশ করি যখন আপনি আশা করেন যে ভিডিও প্লেব্যাক কয়েক মিনিট বা তার কম স্থায়ী হবে।
ভিডিও প্লেব্যাক অ্যাপের জন্য উদাহরণ ইন্টিগ্রেশন
ভিডিও প্লেব্যাক অ্যাপ্লিকেশানগুলিতে রিফ্রেশ রেট সুইচগুলিকে সংহত করার জন্য আমরা নিম্নলিখিত পদক্ষেপগুলি সুপারিশ করি:
-
changeFrameRateStrategy
সিদ্ধান্ত নিন:- সিনেমার মতো দীর্ঘক্ষণ চলমান ভিডিও চালালে
MATCH_CONTENT_FRAMERATE_ALWAYS
ব্যবহার করুন - একটি মুভ ট্রেলারের মতো একটি ছোট ভিডিও চালানো হলে
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS
ব্যবহার করুন
- সিনেমার মতো দীর্ঘক্ষণ চলমান ভিডিও চালালে
- যদি
changeFrameRateStrategy
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS
হয়, ধাপ 4 এ যান৷ - এই দুটি ঘটনাই সত্য কিনা তা পরীক্ষা করে একটি অ-বিরামহীন রিফ্রেশ রেট সুইচ ঘটতে চলেছে কিনা তা সনাক্ত করুন:
- বর্তমান রিফ্রেশ রেট (আসুন এটিকে C বলি) থেকে ভিডিওর ফ্রেম রেট পর্যন্ত সীমাহীন মোড সুইচ করা সম্ভব নয় (আসুন এটিকে V বলি)। এটি হবে যদি C এবং V আলাদা হয় এবং
Display.getMode().getAlternativeRefreshRates
V এর একাধিক না থাকে। - ব্যবহারকারী অ-বিজোড় রিফ্রেশ হার পরিবর্তন নির্বাচন করেছেন.
DisplayManager.getMatchContentFrameRateUserPreference
MATCH_CONTENT_FRAMERATE_ALWAYS
প্রদান করে কিনা তা পরীক্ষা করে আপনি এটি সনাক্ত করতে পারেন
- বর্তমান রিফ্রেশ রেট (আসুন এটিকে C বলি) থেকে ভিডিওর ফ্রেম রেট পর্যন্ত সীমাহীন মোড সুইচ করা সম্ভব নয় (আসুন এটিকে V বলি)। এটি হবে যদি C এবং V আলাদা হয় এবং
- যদি সুইচটি নিরবচ্ছিন্ন হতে চলেছে তবে নিম্নলিখিতগুলি করুন:
-
setFrameRate
কল করুন এবং এটিকে পাস করুনfps
,FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
, এবংchangeFrameRateStrategy
, যেখানেfps
হল ভিডিওর ফ্রেম রেট৷ - ভিডিও প্লেব্যাক শুরু করুন
-
- যদি একটি নন-সিমলেস মোড পরিবর্তন ঘটতে চলেছে, নিম্নলিখিতগুলি করুন:
- ব্যবহারকারীকে অবহিত করতে UX দেখান। মনে রাখবেন যে আমরা আপনাকে সুপারিশ করছি যে ব্যবহারকারীর জন্য এই UX খারিজ করার জন্য একটি উপায় প্রয়োগ করুন এবং ধাপ 5.d-এ অতিরিক্ত বিলম্ব এড়িয়ে যান। এর কারণ হল আমাদের প্রস্তাবিত বিলম্ব যে ডিসপ্লেগুলিতে দ্রুত স্যুইচিং সময় দেখায় সেগুলির জন্য প্রয়োজনের চেয়ে বেশি।
-
setFrameRate
কল করুন এবং এটিকেfps
,FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
, এবংCHANGE_FRAME_RATE_ALWAYS
পাস করুন, যেখানেfps
হল ভিডিওর ফ্রেম রেট৷ -
onDisplayChanged
কলব্যাকের জন্য অপেক্ষা করুন। - মোড স্যুইচ সম্পূর্ণ হওয়ার জন্য 2 সেকেন্ড অপেক্ষা করুন।
- ভিডিও প্লেব্যাক শুরু করুন
ছদ্ম-কোড শুধুমাত্র বিরামহীন সুইচিং সমর্থন করার জন্য নিম্নরূপ:
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();
}
,ফ্রেম রেট API অ্যাপগুলিকে Android প্ল্যাটফর্মকে তাদের উদ্দেশ্যযুক্ত ফ্রেম রেট সম্পর্কে জানাতে দেয় এবং Android 11 (API স্তর 30) বা উচ্চতরকে লক্ষ্য করে এমন অ্যাপগুলিতে উপলব্ধ। প্রথাগতভাবে, বেশিরভাগ ডিভাইস শুধুমাত্র একটি একক ডিসপ্লে রিফ্রেশ রেট সমর্থন করে, সাধারণত 60Hz, কিন্তু এটি পরিবর্তিত হচ্ছে। অনেক ডিভাইস এখন অতিরিক্ত রিফ্রেশ রেট সমর্থন করে যেমন 90Hz বা 120Hz। কিছু ডিভাইস নিরবচ্ছিন্ন রিফ্রেশ রেট সুইচ সমর্থন করে, অন্যরা সংক্ষিপ্তভাবে একটি কালো পর্দা দেখায়, সাধারণত এক সেকেন্ড স্থায়ী হয়।
API-এর প্রাথমিক উদ্দেশ্য হল সমস্ত সমর্থিত ডিসপ্লে রিফ্রেশ রেটগুলির আরও ভাল সুবিধা নিতে অ্যাপগুলিকে সক্ষম করা৷ উদাহরণ স্বরূপ, setFrameRate()
কল করে এমন একটি 24Hz ভিডিও চালানোর ফলে ডিভাইসটি ডিসপ্লে রিফ্রেশ রেট 60Hz থেকে 120Hz এ পরিবর্তন করতে পারে। এই নতুন রিফ্রেশ রেটটি 24Hz ভিডিওর মসৃণ, জুডার-মুক্ত প্লেব্যাক সক্ষম করে, 60Hz ডিসপ্লেতে একই ভিডিও চালানোর জন্য 3:2 পুলডাউনের প্রয়োজন নেই। এর ফলে ব্যবহারকারীর অভিজ্ঞতা আরও ভালো হয়।
মৌলিক ব্যবহার
অ্যান্ড্রয়েড সারফেস অ্যাক্সেস এবং নিয়ন্ত্রণ করার বিভিন্ন উপায় প্রকাশ করে, তাই setFrameRate()
API-এর বিভিন্ন সংস্করণ রয়েছে। API এর প্রতিটি সংস্করণ একই পরামিতি নেয় এবং অন্যের মতো একই কাজ করে:
-
Surface.setFrameRate()
-
SurfaceControl.Transaction.setFrameRate()
-
ANativeWindow_setFrameRate()
-
ASurfaceTransaction_setFrameRate()
অ্যাপটির প্রকৃত সমর্থিত ডিসপ্লে রিফ্রেশ রেট বিবেচনা করার প্রয়োজন নেই, যা 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 পুলডাউন জুডারের মতো ফ্রেম-রেট রূপান্তর আর্টিফ্যাক্ট এড়াতে দেয়।
এই কারণে, নন-সিমলেস রিফ্রেশ রেট সুইচগুলি সক্ষম করা যেতে পারে যদি ব্যবহারকারী এবং অ্যাপ উভয়ই অপ্ট-ইন করে:
- ব্যবহারকারী : অপ্ট ইন করতে, ব্যবহারকারীরা ম্যাচ কন্টেন্ট ফ্রেম রেট ব্যবহারকারী সেটিং সক্ষম করতে পারেন।
- অ্যাপ্লিকেশন : অপ্ট করতে, অ্যাপ্লিকেশনগুলি
setFrameRate()
এCHANGE_FRAME_RATE_ALWAYS
পাস করতে পারে।
আমরা আপনাকে সর্বদা চলচ্চিত্রের মতো দীর্ঘ-চলমান ভিডিওগুলির জন্য CHANGE_FRAME_RATE_ALWAYS
ব্যবহার করার পরামর্শ দিচ্ছি। এটি কারণ ভিডিও ফ্রেমের হারের সাথে মিলে যাওয়ার সুবিধাটি রিফ্রেশ রেট পরিবর্তন করার সময় ঘটে যাওয়া বাধা ছাড়িয়ে যায়।
অতিরিক্ত সুপারিশ
সাধারণ পরিস্থিতিতে এই সুপারিশগুলি অনুসরণ করুন।
একাধিক পৃষ্ঠতল
অ্যান্ড্রয়েড প্ল্যাটফর্মটি সঠিকভাবে এমন পরিস্থিতিগুলি পরিচালনা করার জন্য ডিজাইন করা হয়েছে যেখানে বিভিন্ন ফ্রেম রেট সেটিংস সহ একাধিক পৃষ্ঠ রয়েছে। যখন আপনার অ্যাপ্লিকেশনটিতে বিভিন্ন ফ্রেম রেট সহ একাধিক পৃষ্ঠতল থাকে, প্রতিটি পৃষ্ঠের জন্য সঠিক ফ্রেম রেট সহ setFrameRate()
কল করুন। এমনকি যদি ডিভাইসটি একবারে একাধিক অ্যাপ্লিকেশন চালাচ্ছে, স্প্লিট স্ক্রিন বা চিত্র-ইন-পিকচার মোড ব্যবহার করে, প্রতিটি অ্যাপ্লিকেশন তাদের নিজস্ব পৃষ্ঠের জন্য নিরাপদে setFrameRate()
কল করতে পারে।
প্ল্যাটফর্মটি অ্যাপের ফ্রেম হারে পরিবর্তন হয় না
এমনকি ডিভাইসটি ফ্রেম রেটকে সমর্থন করে যদি অ্যাপটি setFrameRate()
এ কলটিতে নির্দিষ্ট করে, এমন কিছু ক্ষেত্রে রয়েছে যেখানে ডিভাইসটি সেই রিফ্রেশ হারে প্রদর্শনটি স্যুইচ করবে না। উদাহরণস্বরূপ, একটি উচ্চতর অগ্রাধিকার পৃষ্ঠের একটি আলাদা ফ্রেম রেট সেটিং থাকতে পারে, বা ডিভাইসটি ব্যাটারি সেভার মোডে থাকতে পারে (ব্যাটারি সংরক্ষণের জন্য ডিসপ্লে রিফ্রেশ রেটে একটি বিধিনিষেধ সেট করা)। ডিভাইসটি অ্যাপের ফ্রেম রেট সেটিংয়ে ডিসপ্লে রিফ্রেশ রেট স্যুইচ না করার সময় অ্যাপ্লিকেশনটি অবশ্যই সঠিকভাবে কাজ করতে হবে, এমনকি ডিভাইসটি সাধারণ পরিস্থিতিতে স্যুইচ না করেও।
যখন ডিসপ্লে রিফ্রেশ রেট অ্যাপ ফ্রেমের হারের সাথে মেলে না তখন কীভাবে প্রতিক্রিয়া জানানো যায় তা সিদ্ধান্ত নেওয়া অ্যাপের উপর নির্ভর করে। ভিডিওর জন্য, ফ্রেম রেট উত্স ভিডিওর সাথে স্থির করা হয়েছে এবং ভিডিও সামগ্রীটি দেখানোর জন্য পুলডাউন প্রয়োজন হবে। একটি গেম পরিবর্তে তার পছন্দসই ফ্রেম হারের সাথে থাকার চেয়ে ডিসপ্লে রিফ্রেশ রেটে চালানোর চেষ্টা করতে বেছে নিতে পারে। প্ল্যাটফর্মটি কী করে তার উপর ভিত্তি করে অ্যাপটি setFrameRate()
এ যে মানটি পাস করে তা পরিবর্তন করা উচিত নয়। অ্যাপ্লিকেশনটি কীভাবে পরিচালনা করে সেখানে প্ল্যাটফর্মটি অ্যাপ্লিকেশনটির অনুরোধের সাথে মেলে না এমন ক্ষেত্রে এটি অ্যাপ্লিকেশনটির পছন্দসই ফ্রেম হারে সেট করা উচিত। এইভাবে, যদি ডিভাইসের শর্তগুলি অতিরিক্ত ডিসপ্লে রিফ্রেশ রেটগুলি ব্যবহার করার অনুমতি দেয় তবে প্ল্যাটফর্মটিতে অ্যাপের পছন্দসই ফ্রেম হারে স্যুইচ করার জন্য সঠিক তথ্য রয়েছে।
অ্যাপ্লিকেশন রিফ্রেশ রেটে অ্যাপ্লিকেশনটি চালাবে না বা চালাতে পারে না এমন ক্ষেত্রে, অ্যাপটি প্রতিটি ফ্রেমের জন্য উপস্থাপনা টাইমস্ট্যাম্পগুলি নির্দিষ্ট করা উচিত, উপস্থাপনা টাইমস্ট্যাম্পগুলি সেট করার জন্য প্ল্যাটফর্মের একটি প্রক্রিয়া ব্যবহার করে:
এই টাইমস্ট্যাম্পগুলি ব্যবহার করে প্ল্যাটফর্মটিকে খুব তাড়াতাড়ি একটি অ্যাপ্লিকেশন ফ্রেম উপস্থাপন করা থেকে বিরত রাখে, যার ফলে অপ্রয়োজনীয় বিচারক হতে পারে। ফ্রেম উপস্থাপনা টাইমস্ট্যাম্পগুলির সঠিক ব্যবহার কিছুটা জটিল। গেমগুলির জন্য, বিচারককে এড়ানো সম্পর্কে আরও তথ্যের জন্য আমাদের ফ্রেম প্যাকিং গাইড দেখুন এবং অ্যান্ড্রয়েড ফ্রেম প্যাসিং লাইব্রেরি ব্যবহার করার বিষয়টি বিবেচনা করুন।
কিছু ক্ষেত্রে, প্ল্যাটফর্মটি setFrameRate()
এ নির্দিষ্ট করা অ্যাপ্লিকেশনটির একাধিক ফ্রেমের হারের সাথে স্যুইচ করতে পারে। উদাহরণস্বরূপ, একটি অ্যাপ্লিকেশন 60Hz সহ setFrameRate()
কল করতে পারে এবং ডিভাইসটি প্রদর্শনটি 120Hz এ স্যুইচ করতে পারে। এটি ঘটতে পারে এমন একটি কারণ হ'ল যদি অন্য অ্যাপ্লিকেশনটিতে 24Hz এর ফ্রেম রেট সেটিং সহ একটি পৃষ্ঠ থাকে। সেক্ষেত্রে, 120Hz এ ডিসপ্লেটি চালানো 60Hz পৃষ্ঠ এবং 24Hz উভয় পৃষ্ঠকে কোনও পুলডাউন প্রয়োজন ছাড়াই চালানোর অনুমতি দেবে।
যখন অ্যাপটির ফ্রেম হারের একাধিক এ প্রদর্শনটি চলছে, তখন অ্যাপটি অপ্রয়োজনীয় বিচারক এড়াতে প্রতিটি ফ্রেমের জন্য উপস্থাপনা টাইমস্ট্যাম্পগুলি নির্দিষ্ট করা উচিত। গেমগুলির জন্য, অ্যান্ড্রয়েড ফ্রেম প্যাসিং লাইব্রেরি ফ্রেম উপস্থাপনা টাইমস্ট্যাম্পগুলি সঠিকভাবে সেট করার জন্য সহায়ক।
সেটফ্রেমারেট () বনাম পছন্দ
WindowManager.LayoutParams.preferredDisplayModeId
হ'ল অ্যাপ্লিকেশনগুলি প্ল্যাটফর্মে তাদের ফ্রেমের হারকে নির্দেশ করতে পারে। কিছু অ্যাপ্লিকেশন কেবল ডিসপ্লে রেজোলিউশনের মতো অন্যান্য ডিসপ্লে মোড সেটিংস পরিবর্তন করার পরিবর্তে ডিসপ্লে রিফ্রেশ রেট পরিবর্তন করতে চায়। সাধারণভাবে, preferredDisplayModeId
পরিবর্তে setFrameRate()
ব্যবহার করুন। setFrameRate()
ফাংশনটি ব্যবহার করা সহজ কারণ নির্দিষ্ট ফ্রেম রেট সহ একটি মোড খুঁজতে অ্যাপ্লিকেশনটিকে ডিসপ্লে মোডের তালিকার মাধ্যমে অনুসন্ধান করার দরকার নেই।
setFrameRate()
প্ল্যাটফর্মটিকে এমন পরিস্থিতিতে একটি সামঞ্জস্যপূর্ণ ফ্রেম রেট বাছাই করার আরও বেশি সুযোগ দেয় যেখানে একাধিক পৃষ্ঠতল রয়েছে যা বিভিন্ন ফ্রেমের হারে চলছে। উদাহরণস্বরূপ, এমন একটি দৃশ্যের কথা বিবেচনা করুন যেখানে দুটি অ্যাপ্লিকেশন একটি পিক্সেল 4 এ স্প্লিট-স্ক্রিন মোডে চলছে, যেখানে একটি অ্যাপ্লিকেশন একটি 24Hz ভিডিও খেলছে এবং অন্যটি ব্যবহারকারীকে একটি স্ক্রোলযোগ্য তালিকা দেখায়। পিক্সেল 4 দুটি ডিসপ্লে রিফ্রেশ রেট সমর্থন করে: 60Hz এবং 90Hz। preferredDisplayModeId
এপিআই ব্যবহার করে, ভিডিও পৃষ্ঠটি 60Hz বা 90Hz বাছাই করতে বাধ্য হয়। 24Hz এর সাথে setFrameRate()
কল করে, ভিডিও পৃষ্ঠটি প্ল্যাটফর্মটিকে উত্স ভিডিওর ফ্রেম রেট সম্পর্কে আরও তথ্য দেয়, প্ল্যাটফর্মটিকে ডিসপ্লে রিফ্রেশ হারের জন্য 90Hz চয়ন করতে সক্ষম করে, যা এই দৃশ্যে 60Hz এর চেয়ে ভাল।
যাইহোক, এমন দৃশ্যাবলী রয়েছে যেখানে setFrameRate()
এর পরিবর্তে preferredDisplayModeId
ব্যবহার করা উচিত, যেমন নিম্নলিখিত:
- যদি অ্যাপ্লিকেশনটি রেজোলিউশন বা অন্যান্য ডিসপ্লে মোড সেটিংস পরিবর্তন করতে চায় তবে
preferredDisplayModeId
ব্যবহার করুন। - প্ল্যাটফর্মটি কেবলমাত্র
setFrameRate()
এ কলের প্রতিক্রিয়া হিসাবে ডিসপ্লে মোডগুলি স্যুইচ করবে যদি মোড স্যুইচটি হালকা ওজনের এবং ব্যবহারকারীর কাছে লক্ষণীয় হওয়ার সম্ভাবনা কম থাকে। যদি অ্যাপ্লিকেশনটি ভারী মোড স্যুইচ প্রয়োজন এমনকি যদি ডিসপ্লে রিফ্রেশ রেটটি স্যুইচ করতে পছন্দ করে (উদাহরণস্বরূপ, একটি অ্যান্ড্রয়েড টিভি ডিভাইসে), তবেpreferredDisplayModeId
ব্যবহার করুন। - অ্যাপ্লিকেশনগুলি যা অ্যাপের ফ্রেম হারের একাধিকতে চলমান প্রদর্শনটি পরিচালনা করতে পারে না, যার জন্য প্রতিটি ফ্রেমে উপস্থাপনা টাইমস্ট্যাম্পগুলি সেট করা প্রয়োজন,
preferredDisplayModeId
ব্যবহার করা উচিত।
সেটফ্রেমারেট () বনাম পছন্দসই রিফ্রেশ্রেট
WindowManager.LayoutParams#preferredRefreshRate
অ্যাপের উইন্ডোতে একটি পছন্দসই ফ্রেম রেট সেট করে এবং হারটি উইন্ডোটির মধ্যে থাকা সমস্ত পৃষ্ঠের জন্য প্রযোজ্য। অ্যাপটির অ্যাপটির উদ্দেশ্যে ফ্রেম হারের আরও ভাল ইঙ্গিত দেওয়ার জন্য অ্যাপ্লিকেশনটির ডিভাইসের সমর্থিত রিফ্রেশ রেট নির্বিশেষে, setFrameRate()
এর মতো নির্বিশেষে অ্যাপ্লিকেশনটির পছন্দসই ফ্রেম রেট নির্দিষ্ট করা উচিত।
setFrameRate()
ব্যবহার করে এমন পৃষ্ঠগুলির জন্য preferredRefreshRate
উপেক্ষা করা হয়। সম্ভব হলে সাধারণভাবে setFrameRate()
ব্যবহার করুন।
Preverredrefreshrate বনাম পছন্দসইডিসপ্লেমোডিড
যদি অ্যাপ্লিকেশনগুলি কেবল পছন্দসই রিফ্রেশ রেট পরিবর্তন করতে চায় তবে এটি preferredDisplayModeId
পরিবর্তে preferredRefreshRate
ব্যবহার করা পছন্দ করা হয়।
খুব ঘন ঘন সেটফ্রেমরেট () কল করা এড়ানো
যদিও setFrameRate()
কলটি পারফরম্যান্সের দিক থেকে খুব ব্যয়বহুল নয়, অ্যাপ্লিকেশনগুলিতে প্রতিটি ফ্রেম বা প্রতি সেকেন্ডে একাধিকবার setFrameRate()
কল করা এড়ানো উচিত। setFrameRate()
এর কলগুলি সম্ভবত ডিসপ্লে রিফ্রেশ হারের পরিবর্তনের ফলস্বরূপ হতে পারে, যার ফলে রূপান্তর চলাকালীন ফ্রেম ড্রপ হতে পারে। আপনার সময়ের আগে সঠিক ফ্রেমের হারটি বের করা উচিত এবং একবার কল করুন setFrameRate()
।
গেমস বা অন্যান্য নন-ভিডিও অ্যাপ্লিকেশনগুলির জন্য ব্যবহার
যদিও ভিডিওটি setFrameRate()
এপিআইয়ের প্রাথমিক ব্যবহারের ক্ষেত্রে, এটি অন্যান্য অ্যাপ্লিকেশনগুলির জন্য ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, এমন একটি গেম যা 60Hz এর চেয়ে বেশি না চালানোর ইচ্ছা করে (পাওয়ার ব্যবহার হ্রাস করতে এবং দীর্ঘতর প্লে সেশনগুলি অর্জন করতে) পৃষ্ঠকে কল করতে পারে Surface.setFrameRate(60, Surface.FRAME_RATE_COMPATIBILITY_DEFAULT)
এইভাবে, ডিফল্টরূপে 90Hz এ চলমান একটি ডিভাইস পরিবর্তে গেমটি সক্রিয় থাকাকালীন 60Hz এ চলবে, যা বিচারককে এড়াতে পারে যা অন্যথায় যদি গেমটি 60Hz এ চলতে থাকে তবে প্রদর্শনটি 90Hz এ চলতে পারে।
ফ্রেম_রেট_কমপ্যাটিবিলিটি_ফিক্সড_সোর্স ব্যবহার
FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
কেবল ভিডিও অ্যাপ্লিকেশনগুলির জন্যই তৈরি। নন-ভিডিও ব্যবহারের জন্য, FRAME_RATE_COMPATIBILITY_DEFAULT
ব্যবহার করুন।
ফ্রেমের হার পরিবর্তন করার জন্য একটি কৌশল নির্বাচন করা
- আমরা দৃ strongly ়ভাবে সুপারিশ করি যে অ্যাপ্লিকেশনগুলি, যখন মুভিগুলি, কল
setFrameRate(
এফপিএস, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, CHANGE_FRAME_RATE_ALWAYS)
এর মতো দীর্ঘ-চলমান ভিডিওগুলি প্রদর্শন করার সময় যেখানে এফপিএস ভিডিওর ফ্রেম রেট। - আপনি যখন ভিডিও প্লেব্যাকটি বেশ কয়েক মিনিট বা তারও কম স্থায়ী হওয়ার প্রত্যাশা করেন তখন আমরা সেটফ্রেমারেট () এর সাথে কলিং
CHANGE_FRAME_RATE_ALWAYS
setFrameRate()
এর সাথে কল করা অ্যাপ্লিকেশনগুলির বিরুদ্ধে দৃ strongly ়ভাবে সুপারিশ করি।
ভিডিও প্লেব্যাক অ্যাপ্লিকেশনগুলির জন্য উদাহরণ সংহতকরণ
আমরা ভিডিও প্লেব্যাক অ্যাপ্লিকেশনগুলিতে রিফ্রেশ রেট স্যুইচগুলিকে সংহত করার জন্য নিম্নলিখিত পদক্ষেপগুলির প্রস্তাব দিই:
-
changeFrameRateStrategy
স্থির করুন:- যদি একটি দীর্ঘ চলমান ভিডিও বাজানো যেমন সিনেমা ব্যবহার করুন
MATCH_CONTENT_FRAMERATE_ALWAYS
- যদি কোনও মুভ ট্রেলার যেমন একটি ছোট ভিডিও বাজানো হয় তবে
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS
ব্যবহার করুন
- যদি একটি দীর্ঘ চলমান ভিডিও বাজানো যেমন সিনেমা ব্যবহার করুন
- যদি
changeFrameRateStrategy
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS
হয় তবে 4 ধাপে যান। - এই দুটি তথ্যই সত্য কিনা তা যাচাই করে একটি অ-সীমাহীন রিফ্রেশ রেট স্যুইচটি ঘটতে চলেছে কিনা তা সনাক্ত করুন:
- বিজোড় মোড স্যুইচটি বর্তমান রিফ্রেশ রেট থেকে সম্ভব নয় (আসুন এটি সি কল করুন) ভিডিওর ফ্রেম হারের কাছে (আসুন এটি কল করুন)। সি এবং ভি আলাদা এবং
Display.getMode().getAlternativeRefreshRates
- ব্যবহারকারী অ-সামরিক রিফ্রেশ রেট পরিবর্তনের পক্ষে বেছে নিয়েছে। আপনি
DisplayManager.getMatchContentFrameRateUserPreference
ম্যাচকন্টেন্টফ্রেমারেটরেট ইউজারপ্রেসফারেন্সটিMATCH_CONTENT_FRAMERATE_ALWAYS
ফেরত দেয় কিনা তা পরীক্ষা করে আপনি এটি সনাক্ত করতে পারেন
- বিজোড় মোড স্যুইচটি বর্তমান রিফ্রেশ রেট থেকে সম্ভব নয় (আসুন এটি সি কল করুন) ভিডিওর ফ্রেম হারের কাছে (আসুন এটি কল করুন)। সি এবং ভি আলাদা এবং
- যদি স্যুইচটি নির্বিঘ্ন হতে চলেছে তবে নিম্নলিখিতগুলি করুন:
-
setFrameRate
কল করুন এবং এটিfps
,FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
এবংchangeFrameRateStrategy
পাস করুন, যেখানেfps
ভিডিওর ফ্রেম রেট। - ভিডিও প্লেব্যাক শুরু করুন
-
- যদি একটি অ-সীমাহীন মোড পরিবর্তন হতে চলেছে তবে নিম্নলিখিতগুলি করুন:
- ব্যবহারকারীকে অবহিত করতে ইউএক্স দেখান। দ্রষ্টব্য যে আমরা আপনাকে ব্যবহারকারীকে এই ইউএক্সকে বরখাস্ত করার জন্য একটি উপায় বাস্তবায়নের পরামর্শ দিচ্ছি এবং পদক্ষেপ 5. ডি তে অতিরিক্ত বিলম্ব এড়িয়ে চলুন এটি কারণ আমাদের প্রস্তাবিত বিলম্বটি দ্রুত স্যুইচিংয়ের সময়গুলি প্রদর্শন করে এমন প্রদর্শনগুলিতে প্রয়োজনীয়তার চেয়ে বেশি।
-
setFrameRate
কল করুন এবং এটিfps
,FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
, এবংCHANGE_FRAME_RATE_ALWAYS
পাস করুন, যেখানেfps
ভিডিওর ফ্রেম রেট। -
onDisplayChanged
কলব্যাকের জন্য অপেক্ষা করুন। - মোড স্যুইচটি সম্পূর্ণ করার জন্য 2 সেকেন্ড অপেক্ষা করুন।
- ভিডিও প্লেব্যাক শুরু করুন
কেবল বিরামবিহীন স্যুইচিং সমর্থন করার জন্য সিউডো-কোডটি নিম্নরূপ:
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();
}
,ফ্রেম রেট এপিআই অ্যাপ্লিকেশনগুলিকে অ্যান্ড্রয়েড প্ল্যাটফর্মকে তাদের উদ্দেশ্যযুক্ত ফ্রেম রেট সম্পর্কে অবহিত করতে দেয় এবং অ্যাপ্লিকেশনগুলিতে উপলব্ধ যা অ্যান্ড্রয়েড 11 (এপিআই স্তর 30) বা উচ্চতর লক্ষ্য করে। Dition তিহ্যগতভাবে, বেশিরভাগ ডিভাইসগুলি কেবলমাত্র একটি একক ডিসপ্লে রিফ্রেশ রেটকে সমর্থন করেছে, সাধারণত 60Hz, তবে এটি পরিবর্তিত হয়েছে। অনেক ডিভাইস এখন অতিরিক্ত রিফ্রেশ রেট যেমন 90Hz বা 120Hz এর মতো সমর্থন করে। কিছু ডিভাইস বিরামবিহীন রিফ্রেশ রেট স্যুইচগুলিকে সমর্থন করে, অন্যরা সংক্ষেপে একটি কালো স্ক্রিন দেখায়, সাধারণত এক সেকেন্ড স্থায়ী হয়।
এপিআইয়ের প্রাথমিক উদ্দেশ্য হ'ল অ্যাপ্লিকেশনগুলিকে সমস্ত সমর্থিত প্রদর্শন রিফ্রেশ হারের আরও ভালভাবে গ্রহণ করতে সক্ষম করা। উদাহরণস্বরূপ, 24Hz ভিডিও বাজানো একটি অ্যাপ্লিকেশন যা setFrameRate()
কল করে এর ফলে ডিভাইসটি ডিসপ্লে রিফ্রেশ রেট 60Hz থেকে 120Hz এ পরিবর্তন করতে পারে। এই নতুন রিফ্রেশ রেটটি 24Hz ভিডিওর মসৃণ, বিচারক-মুক্ত প্লেব্যাক সক্ষম করে, 3: 2 টি পুলডাউন প্রয়োজন ছাড়াই 60Hz ডিসপ্লেতে একই ভিডিওটি খেলতে হবে। এটি আরও ভাল ব্যবহারকারীর অভিজ্ঞতা অর্জন করে।
মৌলিক ব্যবহার
অ্যান্ড্রয়েড পৃষ্ঠগুলিতে অ্যাক্সেস এবং নিয়ন্ত্রণের বিভিন্ন উপায় প্রকাশ করে, সুতরাং setFrameRate()
এপিআইয়ের বেশ কয়েকটি সংস্করণ রয়েছে। এপিআইয়ের প্রতিটি সংস্করণ একই পরামিতি নেয় এবং অন্যদের মতো একই কাজ করে:
-
Surface.setFrameRate()
-
SurfaceControl.Transaction.setFrameRate()
-
ANativeWindow_setFrameRate()
-
ASurfaceTransaction_setFrameRate()
অ্যাপ্লিকেশনটিকে প্রকৃত সমর্থিত ডিসপ্লে রিফ্রেশ রেটগুলি বিবেচনা করার দরকার নেই, যা কলিং Display.getSupportedModes()
setFrameRate()
উদাহরণস্বরূপ, ডিভাইসটি কেবল 60Hz সমর্থন করে, আপনার অ্যাপ্লিকেশনটি পছন্দ করে এমন ফ্রেম রেট সহ setFrameRate()
কল করুন। অ্যাপ্লিকেশনগুলির ফ্রেম হারের জন্য আরও ভাল ম্যাচ নেই এমন ডিভাইসগুলির বর্তমান প্রদর্শন রিফ্রেশ হারের সাথে থাকবে।
setFrameRate()
এর জন্য কোনও কলটি প্রদর্শন রিফ্রেশ হারে পরিবর্তিত হওয়ার ফলে কোনও কল, DisplayManager.registerDisplayListener()
AChoreographer_registerRefreshRateCallback()
করে ডিসপ্লে পরিবর্তন বিজ্ঞপ্তিগুলির জন্য নিবন্ধন করুন re
setFrameRate()
কল করার সময়, পূর্ণসংখ্যার দিকে গোলাকার না করে সঠিক ফ্রেমের হারে পাস করা ভাল। উদাহরণস্বরূপ, 29.97Hz এ রেকর্ড করা কোনও ভিডিও রেন্ডার করার সময়, 30 এ গোল করার পরিবর্তে 29.97 এ পাস করুন।
ভিডিও অ্যাপ্লিকেশনগুলির জন্য, setFrameRate()
এ পাস করা সামঞ্জস্যতা প্যারামিটারটি অ্যান্ড্রয়েড প্ল্যাটফর্মকে একটি অতিরিক্ত ইঙ্গিত দেওয়ার জন্য Surface.FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
উপর সেট করা উচিত Fr )
কিছু পরিস্থিতিতে, ভিডিও পৃষ্ঠটি ফ্রেম জমা দেওয়া বন্ধ করবে তবে কিছু সময়ের জন্য স্ক্রিনে দৃশ্যমান থাকবে। সাধারণ পরিস্থিতিগুলির মধ্যে অন্তর্ভুক্ত থাকে যখন প্লেব্যাক ভিডিওর শেষে পৌঁছায় বা ব্যবহারকারী প্লেব্যাক বিরতি দেয়। এই ক্ষেত্রে, ফ্রেম রেট প্যারামিটারটি 0 এ সেট করে setFrameRate()
কল করুন পৃষ্ঠের ফ্রেম রেট সেটিংটি ডিফল্ট মানটিতে ফিরে যায়। পৃষ্ঠটি ধ্বংস করার সময় বা পৃষ্ঠটি যখন লুকানো থাকে তখন ফ্রেম রেট সেটিংটি সাফ করা প্রয়োজনীয় নয় কারণ ব্যবহারকারী কোনও আলাদা অ্যাপে স্যুইচ করে। ফ্রেম রেট সেটিংটি কেবল তখনই সাফ করুন যখন পৃষ্ঠটি ব্যবহার না করে দৃশ্যমান থাকে।
অ-সীমাহীন ফ্রেম রেট স্যুইচ
কিছু ডিভাইসে, রিফ্রেশ রেট স্যুইচিংয়ের দ্বিতীয় বা দু'জনের জন্য কালো পর্দার মতো ভিজ্যুয়াল বাধা থাকতে পারে। এটি সাধারণত সেট শীর্ষ বাক্স, টিভি প্যানেল এবং অনুরূপ ডিভাইসে ঘটে। ডিফল্টরূপে অ্যান্ড্রয়েড ফ্রেমওয়ার্কটি যখন এই জাতীয় ভিজ্যুয়াল বাধাগুলি এড়ানোর জন্য Surface.setFrameRate()
এপিআই বলা হয় তখন মোডগুলি স্যুইচ করে না।
কিছু ব্যবহারকারী শুরুতে এবং দীর্ঘ ভিডিওগুলির শেষে একটি ভিজ্যুয়াল বাধা পছন্দ করে। এটি ডিসপ্লেটির রিফ্রেশ রেটকে ভিডিও ফ্রেমের হারের সাথে মেলে এবং মুভি প্লেব্যাকের জন্য 3: 2 পুলডাউন বিচারক হিসাবে ফ্রেম-রেট রূপান্তর শিল্পকর্মগুলি এড়াতে দেয়।
এই কারণে, ব্যবহারকারী এবং অ্যাপ্লিকেশন উভয়ই অপ্ট-ইন করে থাকলে অ-সীমাহীন রিফ্রেশ রেট স্যুইচগুলি সক্ষম করা যেতে পারে:
- ব্যবহারকারীরা : অপ্ট করতে, ব্যবহারকারীরা ম্যাচ সামগ্রী ফ্রেম রেট ব্যবহারকারীর সেটিং সক্ষম করতে পারে।
- অ্যাপ্লিকেশন : অপ্ট করতে, অ্যাপ্লিকেশনগুলি
setFrameRate()
এCHANGE_FRAME_RATE_ALWAYS
পাস করতে পারে।
আমরা আপনাকে সর্বদা চলচ্চিত্রের মতো দীর্ঘ-চলমান ভিডিওগুলির জন্য CHANGE_FRAME_RATE_ALWAYS
ব্যবহার করার পরামর্শ দিচ্ছি। এটি কারণ ভিডিও ফ্রেমের হারের সাথে মিলে যাওয়ার সুবিধাটি রিফ্রেশ রেট পরিবর্তন করার সময় ঘটে যাওয়া বাধা ছাড়িয়ে যায়।
অতিরিক্ত সুপারিশ
সাধারণ পরিস্থিতিতে এই সুপারিশগুলি অনুসরণ করুন।
একাধিক পৃষ্ঠতল
অ্যান্ড্রয়েড প্ল্যাটফর্মটি সঠিকভাবে এমন পরিস্থিতিগুলি পরিচালনা করার জন্য ডিজাইন করা হয়েছে যেখানে বিভিন্ন ফ্রেম রেট সেটিংস সহ একাধিক পৃষ্ঠ রয়েছে। যখন আপনার অ্যাপ্লিকেশনটিতে বিভিন্ন ফ্রেম রেট সহ একাধিক পৃষ্ঠতল থাকে, প্রতিটি পৃষ্ঠের জন্য সঠিক ফ্রেম রেট সহ setFrameRate()
কল করুন। এমনকি যদি ডিভাইসটি একবারে একাধিক অ্যাপ্লিকেশন চালাচ্ছে, স্প্লিট স্ক্রিন বা চিত্র-ইন-পিকচার মোড ব্যবহার করে, প্রতিটি অ্যাপ্লিকেশন তাদের নিজস্ব পৃষ্ঠের জন্য নিরাপদে setFrameRate()
কল করতে পারে।
প্ল্যাটফর্মটি অ্যাপের ফ্রেম হারে পরিবর্তন হয় না
এমনকি ডিভাইসটি ফ্রেম রেটকে সমর্থন করে যদি অ্যাপটি setFrameRate()
এ কলটিতে নির্দিষ্ট করে, এমন কিছু ক্ষেত্রে রয়েছে যেখানে ডিভাইসটি সেই রিফ্রেশ হারে প্রদর্শনটি স্যুইচ করবে না। উদাহরণস্বরূপ, একটি উচ্চতর অগ্রাধিকার পৃষ্ঠের একটি আলাদা ফ্রেম রেট সেটিং থাকতে পারে, বা ডিভাইসটি ব্যাটারি সেভার মোডে থাকতে পারে (ব্যাটারি সংরক্ষণের জন্য ডিসপ্লে রিফ্রেশ রেটে একটি বিধিনিষেধ সেট করা)। ডিভাইসটি অ্যাপের ফ্রেম রেট সেটিংয়ে ডিসপ্লে রিফ্রেশ রেট স্যুইচ না করার সময় অ্যাপ্লিকেশনটি অবশ্যই সঠিকভাবে কাজ করতে হবে, এমনকি ডিভাইসটি সাধারণ পরিস্থিতিতে স্যুইচ না করেও।
যখন ডিসপ্লে রিফ্রেশ রেট অ্যাপ ফ্রেমের হারের সাথে মেলে না তখন কীভাবে প্রতিক্রিয়া জানানো যায় তা সিদ্ধান্ত নেওয়া অ্যাপের উপর নির্ভর করে। ভিডিওর জন্য, ফ্রেম রেট উত্স ভিডিওর সাথে স্থির করা হয়েছে এবং ভিডিও সামগ্রীটি দেখানোর জন্য পুলডাউন প্রয়োজন হবে। একটি গেম পরিবর্তে তার পছন্দসই ফ্রেম হারের সাথে থাকার চেয়ে ডিসপ্লে রিফ্রেশ রেটে চালানোর চেষ্টা করতে বেছে নিতে পারে। প্ল্যাটফর্মটি কী করে তার উপর ভিত্তি করে অ্যাপটি setFrameRate()
এ যে মানটি পাস করে তা পরিবর্তন করা উচিত নয়। অ্যাপ্লিকেশনটি কীভাবে পরিচালনা করে সেখানে প্ল্যাটফর্মটি অ্যাপ্লিকেশনটির অনুরোধের সাথে মেলে না এমন ক্ষেত্রে এটি অ্যাপ্লিকেশনটির পছন্দসই ফ্রেম হারে সেট করা উচিত। এইভাবে, যদি ডিভাইসের শর্তগুলি অতিরিক্ত ডিসপ্লে রিফ্রেশ রেটগুলি ব্যবহার করার অনুমতি দেয় তবে প্ল্যাটফর্মটিতে অ্যাপের পছন্দসই ফ্রেম হারে স্যুইচ করার জন্য সঠিক তথ্য রয়েছে।
অ্যাপ্লিকেশন রিফ্রেশ রেটে অ্যাপ্লিকেশনটি চালাবে না বা চালাতে পারে না এমন ক্ষেত্রে অ্যাপ্লিকেশনটি উপস্থাপনা টাইমস্ট্যাম্পগুলি সেট করার জন্য প্ল্যাটফর্মের যে কোনও একটি প্রক্রিয়া ব্যবহার করে প্রতিটি ফ্রেমের জন্য উপস্থাপনা টাইমস্ট্যাম্পগুলি নির্দিষ্ট করা উচিত:
এই টাইমস্ট্যাম্পগুলি ব্যবহার করে প্ল্যাটফর্মটিকে খুব তাড়াতাড়ি একটি অ্যাপ্লিকেশন ফ্রেম উপস্থাপন করা থেকে বিরত রাখে, যার ফলে অপ্রয়োজনীয় বিচারক হতে পারে। ফ্রেম উপস্থাপনা টাইমস্ট্যাম্পগুলির সঠিক ব্যবহার কিছুটা জটিল। গেমগুলির জন্য, বিচারককে এড়ানো সম্পর্কে আরও তথ্যের জন্য আমাদের ফ্রেম প্যাকিং গাইড দেখুন এবং অ্যান্ড্রয়েড ফ্রেম প্যাসিং লাইব্রেরি ব্যবহার করার বিষয়টি বিবেচনা করুন।
কিছু ক্ষেত্রে, প্ল্যাটফর্মটি setFrameRate()
এ নির্দিষ্ট করা অ্যাপ্লিকেশনটির একাধিক ফ্রেমের হারের সাথে স্যুইচ করতে পারে। উদাহরণস্বরূপ, একটি অ্যাপ্লিকেশন 60Hz সহ setFrameRate()
কল করতে পারে এবং ডিভাইসটি প্রদর্শনটি 120Hz এ স্যুইচ করতে পারে। এটি ঘটতে পারে এমন একটি কারণ হ'ল যদি অন্য অ্যাপ্লিকেশনটিতে 24Hz এর ফ্রেম রেট সেটিং সহ একটি পৃষ্ঠ থাকে। সেক্ষেত্রে, 120Hz এ ডিসপ্লেটি চালানো 60Hz পৃষ্ঠ এবং 24Hz উভয় পৃষ্ঠকে কোনও পুলডাউন প্রয়োজন ছাড়াই চালানোর অনুমতি দেবে।
যখন অ্যাপটির ফ্রেম হারের একাধিক এ প্রদর্শনটি চলছে, তখন অ্যাপটি অপ্রয়োজনীয় বিচারক এড়াতে প্রতিটি ফ্রেমের জন্য উপস্থাপনা টাইমস্ট্যাম্পগুলি নির্দিষ্ট করা উচিত। গেমগুলির জন্য, অ্যান্ড্রয়েড ফ্রেম প্যাসিং লাইব্রেরি ফ্রেম উপস্থাপনা টাইমস্ট্যাম্পগুলি সঠিকভাবে সেট করার জন্য সহায়ক।
সেটফ্রেমারেট () বনাম পছন্দ
WindowManager.LayoutParams.preferredDisplayModeId
হ'ল অ্যাপ্লিকেশনগুলি প্ল্যাটফর্মে তাদের ফ্রেমের হারকে নির্দেশ করতে পারে। কিছু অ্যাপ্লিকেশন কেবল ডিসপ্লে রেজোলিউশনের মতো অন্যান্য ডিসপ্লে মোড সেটিংস পরিবর্তন করার পরিবর্তে ডিসপ্লে রিফ্রেশ রেট পরিবর্তন করতে চায়। সাধারণভাবে, preferredDisplayModeId
পরিবর্তে setFrameRate()
ব্যবহার করুন। setFrameRate()
ফাংশনটি ব্যবহার করা সহজ কারণ নির্দিষ্ট ফ্রেম রেট সহ একটি মোড খুঁজতে অ্যাপ্লিকেশনটিকে ডিসপ্লে মোডের তালিকার মাধ্যমে অনুসন্ধান করার দরকার নেই।
setFrameRate()
প্ল্যাটফর্মটিকে এমন পরিস্থিতিতে একটি সামঞ্জস্যপূর্ণ ফ্রেম রেট বাছাই করার আরও বেশি সুযোগ দেয় যেখানে একাধিক পৃষ্ঠতল রয়েছে যা বিভিন্ন ফ্রেমের হারে চলছে। উদাহরণস্বরূপ, এমন একটি দৃশ্যের কথা বিবেচনা করুন যেখানে দুটি অ্যাপ্লিকেশন একটি পিক্সেল 4 এ স্প্লিট-স্ক্রিন মোডে চলছে, যেখানে একটি অ্যাপ্লিকেশন একটি 24Hz ভিডিও খেলছে এবং অন্যটি ব্যবহারকারীকে একটি স্ক্রোলযোগ্য তালিকা দেখায়। পিক্সেল 4 দুটি ডিসপ্লে রিফ্রেশ রেট সমর্থন করে: 60Hz এবং 90Hz। preferredDisplayModeId
এপিআই ব্যবহার করে, ভিডিও পৃষ্ঠটি 60Hz বা 90Hz বাছাই করতে বাধ্য হয়। 24Hz এর সাথে setFrameRate()
কল করে, ভিডিও পৃষ্ঠটি প্ল্যাটফর্মটিকে উত্স ভিডিওর ফ্রেম রেট সম্পর্কে আরও তথ্য দেয়, প্ল্যাটফর্মটিকে ডিসপ্লে রিফ্রেশ হারের জন্য 90Hz চয়ন করতে সক্ষম করে, যা এই দৃশ্যে 60Hz এর চেয়ে ভাল।
যাইহোক, এমন দৃশ্যাবলী রয়েছে যেখানে setFrameRate()
এর পরিবর্তে preferredDisplayModeId
ব্যবহার করা উচিত, যেমন নিম্নলিখিত:
- যদি অ্যাপ্লিকেশনটি রেজোলিউশন বা অন্যান্য ডিসপ্লে মোড সেটিংস পরিবর্তন করতে চায় তবে
preferredDisplayModeId
ব্যবহার করুন। - প্ল্যাটফর্মটি কেবলমাত্র
setFrameRate()
এ কলের প্রতিক্রিয়া হিসাবে ডিসপ্লে মোডগুলি স্যুইচ করবে যদি মোড স্যুইচটি হালকা ওজনের এবং ব্যবহারকারীর কাছে লক্ষণীয় হওয়ার সম্ভাবনা কম থাকে। যদি অ্যাপ্লিকেশনটি ভারী মোড স্যুইচ প্রয়োজন এমনকি যদি ডিসপ্লে রিফ্রেশ রেটটি স্যুইচ করতে পছন্দ করে (উদাহরণস্বরূপ, একটি অ্যান্ড্রয়েড টিভি ডিভাইসে), তবেpreferredDisplayModeId
ব্যবহার করুন। - অ্যাপ্লিকেশনগুলি যা অ্যাপের ফ্রেম হারের একাধিকতে চলমান প্রদর্শনটি পরিচালনা করতে পারে না, যার জন্য প্রতিটি ফ্রেমে উপস্থাপনা টাইমস্ট্যাম্পগুলি সেট করা প্রয়োজন,
preferredDisplayModeId
ব্যবহার করা উচিত।
সেটফ্রেমারেট () বনাম পছন্দসই রিফ্রেশ্রেট
WindowManager.LayoutParams#preferredRefreshRate
অ্যাপের উইন্ডোতে একটি পছন্দসই ফ্রেম রেট সেট করে এবং হারটি উইন্ডোটির মধ্যে থাকা সমস্ত পৃষ্ঠের জন্য প্রযোজ্য। অ্যাপটির অ্যাপটির উদ্দেশ্যে ফ্রেম হারের আরও ভাল ইঙ্গিত দেওয়ার জন্য অ্যাপ্লিকেশনটির ডিভাইসের সমর্থিত রিফ্রেশ রেট নির্বিশেষে, setFrameRate()
এর মতো নির্বিশেষে অ্যাপ্লিকেশনটির পছন্দসই ফ্রেম রেট নির্দিষ্ট করা উচিত।
setFrameRate()
ব্যবহার করে এমন পৃষ্ঠগুলির জন্য preferredRefreshRate
উপেক্ষা করা হয়। সম্ভব হলে সাধারণভাবে setFrameRate()
ব্যবহার করুন।
Preverredrefreshrate বনাম পছন্দসইডিসপ্লেমোডিড
যদি অ্যাপ্লিকেশনগুলি কেবল পছন্দসই রিফ্রেশ রেট পরিবর্তন করতে চায় তবে এটি preferredDisplayModeId
পরিবর্তে preferredRefreshRate
ব্যবহার করা পছন্দ করা হয়।
খুব ঘন ঘন সেটফ্রেমরেট () কল করা এড়ানো
যদিও setFrameRate()
কলটি পারফরম্যান্সের দিক থেকে খুব ব্যয়বহুল নয়, অ্যাপ্লিকেশনগুলিতে প্রতিটি ফ্রেম বা প্রতি সেকেন্ডে একাধিকবার setFrameRate()
কল করা এড়ানো উচিত। setFrameRate()
এর কলগুলি সম্ভবত ডিসপ্লে রিফ্রেশ হারের পরিবর্তনের ফলস্বরূপ হতে পারে, যার ফলে রূপান্তর চলাকালীন ফ্রেম ড্রপ হতে পারে। আপনার সময়ের আগে সঠিক ফ্রেমের হারটি বের করা উচিত এবং একবার কল করুন setFrameRate()
।
গেমস বা অন্যান্য নন-ভিডিও অ্যাপ্লিকেশনগুলির জন্য ব্যবহার
যদিও ভিডিওটি setFrameRate()
এপিআইয়ের প্রাথমিক ব্যবহারের ক্ষেত্রে, এটি অন্যান্য অ্যাপ্লিকেশনগুলির জন্য ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, এমন একটি গেম যা 60Hz এর চেয়ে বেশি না চালানোর ইচ্ছা করে (পাওয়ার ব্যবহার হ্রাস করতে এবং দীর্ঘতর প্লে সেশনগুলি অর্জন করতে) পৃষ্ঠকে কল করতে পারে Surface.setFrameRate(60, Surface.FRAME_RATE_COMPATIBILITY_DEFAULT)
এইভাবে, ডিফল্টরূপে 90Hz এ চলমান একটি ডিভাইস পরিবর্তে গেমটি সক্রিয় থাকাকালীন 60Hz এ চলবে, যা বিচারককে এড়াতে পারে যা অন্যথায় যদি গেমটি 60Hz এ চলতে থাকে তবে প্রদর্শনটি 90Hz এ চলতে পারে।
ফ্রেম_রেট_কমপ্যাটিবিলিটি_ফিক্সড_সোর্স ব্যবহার
FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
কেবল ভিডিও অ্যাপ্লিকেশনগুলির জন্যই তৈরি। নন-ভিডিও ব্যবহারের জন্য, FRAME_RATE_COMPATIBILITY_DEFAULT
ব্যবহার করুন।
ফ্রেমের হার পরিবর্তন করার জন্য একটি কৌশল নির্বাচন করা
- আমরা দৃ strongly ়ভাবে সুপারিশ করি যে অ্যাপ্লিকেশনগুলি, যখন মুভিগুলি, কল
setFrameRate(
এফপিএস, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, CHANGE_FRAME_RATE_ALWAYS)
এর মতো দীর্ঘ-চলমান ভিডিওগুলি প্রদর্শন করার সময় যেখানে এফপিএস ভিডিওর ফ্রেম রেট। - আপনি যখন ভিডিও প্লেব্যাকটি বেশ কয়েক মিনিট বা তারও কম স্থায়ী হওয়ার প্রত্যাশা করেন তখন আমরা সেটফ্রেমারেট () এর সাথে কলিং
CHANGE_FRAME_RATE_ALWAYS
setFrameRate()
এর সাথে কল করা অ্যাপ্লিকেশনগুলির বিরুদ্ধে দৃ strongly ়ভাবে সুপারিশ করি।
ভিডিও প্লেব্যাক অ্যাপ্লিকেশনগুলির জন্য উদাহরণ সংহতকরণ
আমরা ভিডিও প্লেব্যাক অ্যাপ্লিকেশনগুলিতে রিফ্রেশ রেট স্যুইচগুলিকে সংহত করার জন্য নিম্নলিখিত পদক্ষেপগুলির প্রস্তাব দিই:
-
changeFrameRateStrategy
স্থির করুন:- যদি একটি দীর্ঘ চলমান ভিডিও বাজানো যেমন সিনেমা ব্যবহার করুন
MATCH_CONTENT_FRAMERATE_ALWAYS
- যদি কোনও মুভ ট্রেলার যেমন একটি ছোট ভিডিও বাজানো হয় তবে
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS
ব্যবহার করুন
- যদি একটি দীর্ঘ চলমান ভিডিও বাজানো যেমন সিনেমা ব্যবহার করুন
- যদি
changeFrameRateStrategy
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS
হয় তবে 4 ধাপে যান। - এই দুটি তথ্যই সত্য কিনা তা যাচাই করে একটি অ-সীমাহীন রিফ্রেশ রেট স্যুইচটি ঘটতে চলেছে কিনা তা সনাক্ত করুন:
- বিজোড় মোড স্যুইচটি বর্তমান রিফ্রেশ রেট থেকে সম্ভব নয় (আসুন এটি সি কল করুন) ভিডিওর ফ্রেম হারের কাছে (আসুন এটি কল করুন)। সি এবং ভি আলাদা এবং
Display.getMode().getAlternativeRefreshRates
- ব্যবহারকারী অ-সামরিক রিফ্রেশ রেট পরিবর্তনের পক্ষে বেছে নিয়েছে। আপনি
DisplayManager.getMatchContentFrameRateUserPreference
ম্যাচকন্টেন্টফ্রেমারেটরেট ইউজারপ্রেসফারেন্সটিMATCH_CONTENT_FRAMERATE_ALWAYS
ফেরত দেয় কিনা তা পরীক্ষা করে আপনি এটি সনাক্ত করতে পারেন
- বিজোড় মোড স্যুইচটি বর্তমান রিফ্রেশ রেট থেকে সম্ভব নয় (আসুন এটি সি কল করুন) ভিডিওর ফ্রেম হারের কাছে (আসুন এটি কল করুন)। সি এবং ভি আলাদা এবং
- যদি স্যুইচটি নির্বিঘ্ন হতে চলেছে তবে নিম্নলিখিতগুলি করুন:
-
setFrameRate
কল করুন এবং এটিfps
,FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
এবংchangeFrameRateStrategy
পাস করুন, যেখানেfps
ভিডিওর ফ্রেম রেট। - ভিডিও প্লেব্যাক শুরু করুন
-
- যদি একটি অ-সীমাহীন মোড পরিবর্তন হতে চলেছে তবে নিম্নলিখিতগুলি করুন:
- ব্যবহারকারীকে অবহিত করতে ইউএক্স দেখান। দ্রষ্টব্য যে আমরা আপনাকে ব্যবহারকারীকে এই ইউএক্সকে বরখাস্ত করার জন্য একটি উপায় বাস্তবায়নের পরামর্শ দিচ্ছি এবং পদক্ষেপ 5. ডি তে অতিরিক্ত বিলম্ব এড়িয়ে চলুন এটি কারণ আমাদের প্রস্তাবিত বিলম্বটি দ্রুত স্যুইচিংয়ের সময়গুলি প্রদর্শন করে এমন প্রদর্শনগুলিতে প্রয়োজনীয়তার চেয়ে বেশি।
-
setFrameRate
কল করুন এবং এটিfps
,FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
, এবংCHANGE_FRAME_RATE_ALWAYS
পাস করুন, যেখানেfps
ভিডিওর ফ্রেম রেট। -
onDisplayChanged
কলব্যাকের জন্য অপেক্ষা করুন। - মোড স্যুইচটি সম্পূর্ণ করার জন্য 2 সেকেন্ড অপেক্ষা করুন।
- ভিডিও প্লেব্যাক শুরু করুন
কেবল বিরামবিহীন স্যুইচিং সমর্থন করার জন্য সিউডো-কোডটি নিম্নরূপ:
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();
}