สัญญาณ 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 ควบคุมว่า 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, SurfaceFlinger จะรับบัฟเฟอร์และคอมโพสิต เฟรมในขณะที่แอปประมวลผลอินพุตและแสดงผล เฟรมพร้อมกัน
DispSync
DispSync จะรักษาโมเดลของเหตุการณ์ VSync ที่อิงตามฮาร์ดแวร์เป็นระยะๆ ของ จอแสดงผล และใช้โมเดลดังกล่าวเพื่อเรียกใช้แฮนเดิลการเรียกกลับที่ออฟเซ็ตเฟสที่เฉพาะเจาะจง จากเหตุการณ์ VSync ของฮาร์ดแวร์
DispSync คือวงจรล็อกเฟส (PLL) ของซอฟต์แวร์ที่สร้างสัญญาณ
VSYNC
และSF_VSYNC
ที่ใช้โดย Choreographer และ SurfaceFlinger
แม้ว่าจะไม่ได้ออฟเซ็ตจาก VSync ของฮาร์ดแวร์ก็ตาม
ภาพต่อไปนี้แสดงโฟลว์ DispSync

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