VSync সিগন্যাল ডিসপ্লে পাইপলাইন সিঙ্ক্রোনাইজ করে। ডিসপ্লে পাইপলাইনে অ্যাপ রেন্ডারিং, SurfaceFlinger কম্পোজিশন এবং ডিসপ্লেতে ছবি প্রেজেন্ট করার জন্য Hardware Composer (HWC) থাকে। VSync, রেন্ডারিং শুরু করার জন্য অ্যাপ জেগে ওঠার সময়, স্ক্রিন কম্পোজিট করার জন্য SurfaceFlinger জেগে ওঠার সময় এবং ডিসপ্লে রিফ্রেশ চক্রকে সিঙ্ক্রোনাইজ করে। এই সিঙ্ক্রোনাইজেশন স্টাটারিং দূর করে এবং গ্রাফিক্সের ভিজ্যুয়াল পারফর্ম্যান্স উন্নত করে।
HWC VSync ইভেন্ট তৈরি করে এবং কলব্যাকের মাধ্যমে SurfaceFlinger-এ ইভেন্ট পাঠায়:
typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData, hwc2_display_t display, int64_t timestamp);
SurfaceFlinger, setVsyncEnabled-এ কল করার মাধ্যমে HWC, VSync ইভেন্ট জেনারেট করে কিনা তা কন্ট্রোল করে। SurfaceFlinger, setVsyncEnabled-কে VSync ইভেন্ট জেনারেট করার অনুমতি দেয় যাতে এটি ডিসপ্লের রিফ্রেশ সাইকেলের সাথে সিঙ্ক করতে পারে। SurfaceFlinger ডিসপ্লে রিফ্রেশ সাইকেলের সাথে সিঙ্ক করা থাকলে,
SurfaceFlinger setVsyncEnabled বন্ধ করে দেয় যাতে
HWC, VSync ইভেন্ট জেনারেট করা বন্ধ করে। SurfaceFlinger যদি
আসল VSync এবং আগে থেকে সেট করা VSync-এর মধ্যে পার্থক্য শনাক্ত করে,
তাহলে SurfaceFlinger আবার VSync ইভেন্ট জেনারেশন চালু করে।
VSync অফসেট
সিঙ্ক অ্যাপ এবং SurfaceFlinger রেন্ডার লুপ হার্ডওয়্যার VSync-এর সাথে সিঙ্ক করে। VSync ইভেন্টে, ডিসপ্লে ফ্রেম N দেখানো শুরু করে, সেই সময় SurfaceFlinger ফ্রেম N+1-এর জন্য উইন্ডো কম্পোজিট করা শুরু করে। অ্যাপটি বাকি থাকা ইনপুট ম্যানেজ করে এবং ফ্রেম N+2 জেনারেট করে।
VSync-এর সাথে সিঙ্ক্রোনাইজ করলে সামঞ্জস্যপূর্ণ লেটেন্সি পাওয়া যায়। এটি অ্যাপ ও SurfaceFlinger-এ হওয়া ভুল কমায় এবং একে অপরের সাথে ফেজ ইন ও ফেজ আউট হওয়ার সময় ডিসপ্লেতে হওয়া ড্রাফ্টকে মিনিমাইজ করে। এটি ধরে নেয় যে অ্যাপ ও SurfaceFlinger-এর পার-ফ্রেম টাইম খুব বেশি আলাদা হয় না। লেটেন্সি অন্তত দুটি ফ্রেম।
এই সমস্যার সমাধান করতে, আপনি VSync অফসেট ব্যবহার করে ইনপুট-টু-ডিসপ্লে লেটেন্সি কমাতে পারেন। এর জন্য আপনাকে হার্ডওয়্যার VSync-এর সাপেক্ষে অ্যাপ ও কম্পোজিশন সিগন্যাল তৈরি করতে হবে। এটি সম্ভব কারণ অ্যাপ প্লাস কম্পোজিশনে সাধারণত ৩৩ মিলিসেকেন্ডের কম সময় লাগে।
VSync অফসেটের ফলাফল হল একই সময়সীমা ও অফসেট ফেজ সহ তিনটি সিগন্যাল:
HW_VSYNC_0— ডিসপ্লেতে পরবর্তী ফ্রেম দেখানো শুরু হয়।VSYNC— অ্যাপ ইনপুট পড়ে এবং পরবর্তী ফ্রেম তৈরি করে।SF_VSYNC— SurfaceFlinger পরবর্তী ফ্রেমের জন্য কম্পোজিট করা শুরু করে।
VSync অফসেটের মাধ্যমে, SurfaceFlinger বাফার গ্রহণ করে এবং ফ্রেম কম্পোজিট করে, একই সাথে অ্যাপ ইনপুট প্রসেস করে এবং ফ্রেম রেন্ডার করে।
DispSync
DispSync ডিসপ্লের পর্যায়ক্রমিক হার্ডওয়্যার-ভিত্তিক VSync ইভেন্টের একটি মডেল বজায় রাখে এবং হার্ডওয়্যার VSync ইভেন্ট থেকে নির্দিষ্ট ফেজ অফসেটে কলব্যাক কার্যকর করতে সেই মডেলটি ব্যবহার করে।
DispSync হল একটি সফ্টওয়্যার ফেজ-লক লুপ (PLL) যা Choreographer এবং SurfaceFlinger-এর ব্যবহার করা
VSYNC এবং SF_VSYNC সিগন্যাল তৈরি করে,
এমনকি হার্ডওয়্যার VSync থেকে অফসেট না হলেও।
নিচের ছবিতে DispSync ফ্লো দেখানো হয়েছে:
ছবি ১. DispSync ফ্লো।
DispSync-এর নিম্নলিখিত কোয়ালিটি আছে:
- রেফারেন্স —
HW_VSYNC_0. - আউটপুট —
VSYNCএবংSF_VSYNC। - মতামত — HWC থেকে ফেঞ্চ সিগন্যাল টাইমস্ট্যাম্প সরিয়ে দিন।
VSync রিটায়ার অফসেট
অফসেট ফেজ ব্যবহার করে না এমন ডিভাইসেও রিটায়ার করা ফেঞ্চের সিগন্যাল টাইমস্ট্যাম্পকে HW VSync-এর সাথে ম্যাচ করতে হবে। অন্যথায়, সমস্যাগুলি যতটা গুরুতর তার চেয়েও বেশি গুরুতর বলে মনে হয়। স্মার্ট প্যানেলে প্রায়ই একটি ডেল্টা থাকে যেখানে রিটায়ার ফেন্স হল ডিসপ্লে মেমরিতে ডিরেক্ট মেমরি অ্যাক্সেসের (DMA) শেষ, কিন্তু আসল ডিসপ্লে সুইচ এবং HW VSync কিছু সময় পরে হয়।
ডিভাইসের
BoardConfig.mk মেকফাইলে PRESENT_TIME_OFFSET_FROM_VSYNC_NS সেট করা আছে। এটি ডিসপ্লে কন্ট্রোলার এবং প্যানেলের বৈশিষ্ট্যের উপর ভিত্তি করে
তৈরি করা হয়েছে। রিটায়ার ফেন্স টাইমস্ট্যাম্প থেকে HW VSync
সিগন্যাল পর্যন্ত সময় ন্যানোসেকেন্ডে পরিমাপ করা হয়।
VSYNC এবং SF_VSYNC অফসেট
VSYNC_EVENT_PHASE_OFFSET_NS এবং
SF_VSYNC_EVENT_PHASE_OFFSET_NS-এর মান হাই-লোড ব্যবহারের কেসের উপর ভিত্তি করে রক্ষণশীলভাবে সেট করা হয়, যেমন উইন্ডো ট্রানজিশনের সময় আংশিক GPU কম্পোজিশন
বা অ্যানিমেশন সহ একটি ওয়েব পৃষ্ঠার মাধ্যমে Chrome স্ক্রোল করা। এইসব অফসেট
অ্যাপ রেন্ডার করার জন্য বেশি সময় এবং GPU কম্পোজিশনের জন্য বেশি সময় দেয়।
এক বা দুই মিলিসেকেন্ডের বেশি লেটেন্সি লক্ষ্য করা যায়। সমস্যার সংখ্যা উল্লেখযোগ্যভাবে না বাড়িয়ে লেটেন্সি কমানোর জন্য, সম্পূর্ণ অটোমেটেড সমস্যা টেস্টিং ইন্টিগ্রেট করুন।