অ্যান্ড্রয়েড ফ্রেম পেসিং লাইব্রেরি, যা সোয়াপি (Swappy) নামেও পরিচিত, অ্যান্ড্রয়েড গেম এসডিকে (SDK) -এর একটি অংশ। এটি অ্যান্ড্রয়েডে ওপেনজিএল (OpenGL) এবং ভলকান (Vulkan) গেমগুলোকে মসৃণ রেন্ডারিং এবং সঠিক ফ্রেম পেসিং অর্জনে সহায়তা করে।
ফ্রেম পেসিং হলো একটি গেমের লজিক এবং রেন্ডারিং লুপের সাথে অপারেটিং সিস্টেমের ডিসপ্লে সাবসিস্টেম ও অন্তর্নিহিত ডিসপ্লে হার্ডওয়্যারের সমন্বয়। অ্যান্ড্রয়েড ডিসপ্লে সাবসিস্টেমটি টিয়ারিং-এর মতো কিছু নির্দিষ্ট ভিজ্যুয়াল আর্টিফ্যাক্ট এড়ানোর জন্য ডিজাইন করা হয়েছিল। ডিসপ্লে সাবসিস্টেমটি নিম্নলিখিত কাজগুলো করার মাধ্যমে টিয়ারিং এড়িয়ে চলে:
- অভ্যন্তরীণভাবে অতীতের ফ্রেমগুলিকে বাফার করা হচ্ছে
- দেরিতে জমা দেওয়া ফ্রেম সনাক্ত করা
- পরবর্তী কোনো ফ্রেম শনাক্ত হলে বর্তমান ফ্রেমটি প্রদর্শন করা অব্যাহত রাখা।
গেমের রেন্ডার লুপ যখন নেটিভ ডিসপ্লে হার্ডওয়্যারের সমর্থিত গতির চেয়ে ভিন্ন গতিতে চলে, তখন ফ্রেম প্রদর্শনের সময়ে অসামঞ্জস্য দেখা দেয়। যখন কোনো গেমের রেন্ডার লুপ অন্তর্নিহিত ডিসপ্লে হার্ডওয়্যারের তুলনায় খুব ধীরে চলে, তখন সমস্যা দেখা দেয়, যার ফলে প্রদর্শনের সময়ে অসামঞ্জস্যতা দেখা দেয়। উদাহরণস্বরূপ, যখন ৩০ এফপিএস-এ চলা একটি গেম এমন একটি ডিভাইসে রেন্ডার করার চেষ্টা করে যা স্বাভাবিকভাবেই ৬০ এফপিএস সমর্থন করে, তখন গেমটির রেন্ডার লুপের কারণে একটি পুনরাবৃত্ত ফ্রেম অতিরিক্ত ১৬ মিলিসেকেন্ডের জন্য স্ক্রিনে থেকে যায়। এই ধরনের অসামঞ্জস্যতা ফ্রেমের সময়ে ৩৩ মিলিসেকেন্ড, ১৬ মিলিসেকেন্ড এবং ৪৯ মিলিসেকেন্ডের মতো উল্লেখযোগ্য অসামঞ্জস্যতা তৈরি করে। অতিরিক্ত জটিল দৃশ্যগুলো এই সমস্যাকে আরও বাড়িয়ে তোলে, কারণ এগুলোর কারণে ফ্রেম বাদ পড়ে যায়।
ফ্রেম পেসিং লাইব্রেরি নিম্নলিখিত কাজগুলো সম্পাদন করে:
- গেমের ফ্রেম রেট কম হওয়ার কারণে সৃষ্ট স্টাটারিং বা আটকে যাওয়া পূরণ করে।
- উপস্থাপনার টাইমস্ট্যাম্প যোগ করে, যাতে ফ্রেমগুলো সময়ের আগেই নয়, বরং ঠিক সময়ে প্রদর্শিত হয়।
-
EGL_ANDROID_presentation_timeএবংVK_GOOGLE_display_timingপ্রেজেন্টেশন টাইমস্ট্যাম্প এক্সটেনশনগুলো ব্যবহার করে।
- দীর্ঘ ফ্রেমের জন্য সিঙ্ক ফেন্স ব্যবহার করে, যা স্টাটারিং এবং ল্যাটেন্সির কারণ হয়।
- অ্যাপে ওয়েট (wait) যুক্ত করে। এগুলি ব্যাক প্রেসার তৈরি হতে না দিয়ে, ডিসপ্লে পাইপলাইনকে তাল মেলাতে সাহায্য করে।
- সিঙ্ক ফেন্স ব্যবহার করে (
EGL_KHR_fence_syncএবংVkFence)।
- আপনার ডিভাইস একাধিক রিফ্রেশ রেট সমর্থন করলে, নমনীয়তা এবং মসৃণ উপস্থাপনা প্রদানের জন্য একটি রিফ্রেশ রেট বেছে নিন।
- ফ্রেম স্ট্যাটস ব্যবহার করে ডিবাগিং ও প্রোফাইলিংয়ের জন্য পরিসংখ্যান প্রদান করে।
আপনার প্রয়োজন অনুযায়ী লাইব্রেরিটিকে বিভিন্ন মোডে পরিচালনা করার জন্য কীভাবে কনফিগার করতে হয় তা জানতে, সমর্থিত অপারেটিং মোডসমূহ (Supported operating modes) দেখুন।
OpenGL রেন্ডারার বা Vulkan রেন্ডারার ব্যবহার করে বাস্তবায়ন করতে, দেখুন:
- আপনার OpenGL রেন্ডারারে অ্যান্ড্রয়েড ফ্রেম পেসিং অন্তর্ভুক্ত করুন
- আপনার ভলকান রেন্ডারারে অ্যান্ড্রয়েড ফ্রেম পেসিং অন্তর্ভুক্ত করুন
আরও জানতে, ফ্রেম পেসিং লাইব্রেরি দেখুন।
ফ্রেম প্রতি সেকেন্ড থ্রটলিং হস্তক্ষেপ
ফ্রেম পার সেকেন্ড (FPS) থ্রটলিং ব্যবস্থা শুধুমাত্র প্ল্যাটফর্ম-ভিত্তিক পরিবর্তনের মাধ্যমে এবং ডেভেলপারদের কোনো পদক্ষেপ ছাড়াই গেমকে একটি উপযুক্ত FPS-এ চলতে সক্ষম করে।
এফপিএস থ্রটলিং ব্যবস্থাটি বাস্তবায়নে নিম্নলিখিত উপাদানগুলো ব্যবহৃত হয়।
গেমম্যানেজারসার্ভিস
GameManagerService কম্পোনেন্টটি গেম মোড এবং গেম ইন্টারভেনশন সম্পর্কিত ব্যবহারকারী-ভিত্তিক ও গেম-ভিত্তিক সমস্ত তথ্য রক্ষণাবেক্ষণ করে। প্রতিটি ব্যবহারকারী প্রোফাইলের জন্য একটি <PACKAGE_NAME, Interventions> ম্যাপিং-এর মধ্যে, রেজোলিউশন ডাউনস্কেলিং ফ্যাক্টরের মতো অন্যান্য ইন্টারভেনশন তথ্যের সাথে FPS-এর তথ্যও GameManagerService-এ সংরক্ষিত থাকে। গেম মোড পরিবর্তন করা হলে বা ইন্টারভেনশন আপডেট করা হলে FPS-এর তথ্য অ্যাক্সেস করা হয়। প্রতিটি PACKAGE_NAME এবং ব্যবহারকারীর জন্য একটি UID অনন্য হয়, এবং এটিকে SurfaceFlinger-এ পাঠানোর জন্য পরবর্তীতে একটি <UID, Frame Rate> জোড়ায় রূপান্তরিত করা যায়।
সারফেসফ্লিঙ্গার
SurfaceFlinger কম্পোনেন্টটি কোনো অ্যাপ্লিকেশনের FPS থ্রটল করা আগে থেকেই সমর্থন করে, যতক্ষণ পর্যন্ত ফ্রেম রেটটি ডিসপ্লে রিফ্রেশ রেটের একটি ভাজক থাকে। VSync-এর ক্ষেত্রে, SurfaceFlinger থ্রটল করা অ্যাপ্লিকেশনটির জন্য VSync-এর বৈধতা যাচাই করে দেখে যে VSync টাইমস্ট্যাম্পটি অ্যাপ্লিকেশনটির ফ্রেম রেটের সাথে একই দশায় (in phase) আছে কি না। যদি ফ্রেম রেটটি VSync-এর সাথে একই দশায় না থাকে, তাহলে SurfaceFlinger ফ্রেমটিকে ততক্ষণ ধরে রাখে যতক্ষণ না ফ্রেম রেট এবং VSync একই দশায় আসে।
নিম্নলিখিত চিত্রে GameManagerService এবং SurfaceFlinger-এর মধ্যকার মিথস্ক্রিয়া বর্ণনা করা হয়েছে:

চিত্র ১. GameServiceManager এবং SurfaceFlinger-এর মধ্যকার মিথস্ক্রিয়া।
সারফেসফ্লিঙ্গার একটি নতুন ফ্রেম রেট থ্রটলিং অগ্রাধিকার সেট করার জন্য একটি <UID, Frame Rate> জোড়া ম্যাপিং বজায় রাখে। ব্যবহারকারী এবং গেমের মধ্যে UID অনন্য হয়, যাতে একটি ডিভাইসের প্রতিটি ব্যবহারকারী একই গেমে ফ্রেম রেটের ভিন্ন ভিন্ন সেটিংস রাখতে পারে। কোনো গেমের ফ্রেম রেট থ্রটল করতে, গেমম্যানেজারসার্ভিস একটি UID-এর জন্য ফ্রেম রেট ওভাররাইড করতে সারফেসফ্লিঙ্গারকে কল করে। এই পদ্ধতির মাধ্যমে, যখনই গেম মোড পরিবর্তন করা হয় বা ইন্টারভেনশন আপডেট করা হয়, সারফেসফ্লিঙ্গার ম্যাপিংটি আপডেট করে। সারফেসফ্লিঙ্গার সেই অনুযায়ী বাফার ল্যাচ করার মাধ্যমে FPS পরিবর্তনটি সামাল দেয়।
FPS থ্রটলিং সম্পর্কে আরও জানতে, FPS থ্রটলিং দেখুন।