สัญญาณ VSYNC จะซิงค์ไปป์ไลน์การแสดงผล การแสดงผลผ่านไปป์ไลน์ประกอบด้วยการแสดงผลของแอป การคอมโพสิชันของ SurfaceFlinger และ Hardware Composer (HWC) ที่แสดงภาพบนจอแสดงผล VSYNC จะซิงค์เวลาที่แอปตื่นขึ้นเพื่อเริ่มแสดงผล เวลา SurfaceFlinger ตื่นขึ้นเพื่อคอมโพสหน้าจอ และรอบการรีเฟรชของจอแสดงผล การซิงค์นี้จะช่วยขจัดอาการกระตุกและปรับปรุงประสิทธิภาพภาพกราฟิก
HWC จะสร้างเหตุการณ์ VSYNC และส่งเหตุการณ์ไปยัง SurfaceFlinger ผ่าน Callback ดังนี้
typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData, hwc2_display_t display, int64_t timestamp);
SurfaceFlinger จะควบคุมว่า HWC จะสร้างเหตุการณ์ VSYNC หรือไม่โดยเรียกใช้ setVsyncEnabled
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 ไม่แตกต่างกันมากนัก เวลาในการตอบสนองอย่างน้อย 2 เฟรม
วิธีแก้ไขคือใช้การออฟเซต VSYNC เพื่อลดเวลาในการตอบสนองของอินพุตกับการแสดงผลโดยทำให้สัญญาณแอปและองค์ประกอบสัมพันธ์กับ VSYNC ของฮาร์ดแวร์ ซึ่งเป็นไปได้เนื่องจากโดยปกติแล้วการคอมโพสิชันแอปบวกจะใช้เวลาน้อยกว่า 33 มิลลิวินาที
ผลลัพธ์ของการออฟเซ็ต VSYNC คือสัญญาณ 3 รายการที่มีระยะเวลาและเฟสออฟเซ็ตเดียวกัน ดังนี้
HW_VSYNC_0
— จอแสดงผลเริ่มแสดงเฟรมถัดไปVSYNC
— แอปอ่านอินพุตและสร้างเฟรมถัดไปSF_VSYNC
— SurfaceFlinger เริ่มคอมโพสเฟรมถัดไป
เมื่อใช้ VSYNC Offset นั้น SurfaceFlinger จะได้รับบัฟเฟอร์และคอมโพสเฟรมขณะที่แอปประมวลผลอินพุตและแสดงผลเฟรมพร้อมกัน
DispSync
DispSync จะดูแลรักษาโมเดลของเหตุการณ์ VSYNC ตามฮาร์ดแวร์เป็นระยะของจอแสดงผล และใช้โมเดลดังกล่าวเพื่อเรียกใช้การเรียกกลับที่ระยะเบี่ยงเบนเฟสที่เฉพาะเจาะจงจากเหตุการณ์ VSYNC ของฮาร์ดแวร์
DispSync คือลูปการล็อกเฟส (PLL) ซอฟต์แวร์ที่สร้างสัญญาณ VSYNC และ SF_VSYNC ที่ใช้โดย Choreographer และ SurfaceFlinger แม้ว่าจะไม่ออฟเซ็ตจาก VSYNC ของฮาร์ดแวร์ก็ตาม

รูปที่ 1 ขั้นตอนการซิงค์ DispSync
DispSync มีคุณสมบัติดังต่อไปนี้
- ข้อมูลอ้างอิง — HW_VSYNC_0
- เอาต์พุต — VSYNC และ SF_VSYNC
- ความคิดเห็น — เลิกใช้งานการประทับเวลาสัญญาณรั้วจากเครื่องมือสร้างฮาร์ดแวร์
VSYNC/retire offset
การประทับเวลาสัญญาณของรั้วการเลิกใช้งานต้องตรงกับ VSYNC ของ HW แม้ในอุปกรณ์ที่ไม่ได้ใช้เฟสออฟเซต ไม่เช่นนั้นข้อผิดพลาดจะดูรุนแรงกว่าที่เป็น แผงอัจฉริยะมักจะมีค่าเดลต้าที่รั้วการเลิกใช้งานเป็นจุดสิ้นสุดของ Direct Memory Access (DMA) เพื่อแสดงหน่วยความจำ แต่สวิตช์การแสดงผลจริงและ HW VSYNC จะทำงานหลังจากนั้น
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
ได้รับการตั้งค่าไว้ในไฟล์ make ของ BoardConfig.mk
อุปกรณ์ ซึ่งอิงตามลักษณะของคอนโทรลเลอร์และแผงจอแสดงผล เวลาที่วัดจากการประทับเวลาของรั้วการเลิกใช้งานไปจนถึงสัญญาณ VSYNC ของ HW จะวัดเป็นนาโนวินาที
VSYNC และ SF_VSYNC offset
VSYNC_EVENT_PHASE_OFFSET_NS
และ
SF_VSYNC_EVENT_PHASE_OFFSET_NS
ได้รับการตั้งค่าอย่างระมัดระวังตามกรณีการใช้งานที่มีภาระสูง เช่น การจัดองค์ประกอบ GPU บางส่วนระหว่างการเปลี่ยนหน้าต่าง หรือ Chrome ที่เลื่อนผ่านหน้าเว็บที่มีภาพเคลื่อนไหว ซึ่งจะช่วยให้เวลาในการเรนเดอร์แอปและเวลาในการจัดวางองค์ประกอบของ GPU นานขึ้น
สังเกตได้ว่าเวลาในการตอบสนองนานกว่า 1-2 มิลลิวินาที หากต้องการลดเวลาในการตอบสนองโดยไม่เพิ่มจํานวนข้อผิดพลาดอย่างมีนัยสําคัญ ให้ผสานรวมการทดสอบข้อผิดพลาดอัตโนมัติที่ละเอียด