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