สัญญาณ 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 มิลลิวินาทีจะสังเกตเห็นได้ ผสานรวมการทดสอบข้อผิดพลาดอัตโนมัติอย่างละเอียดเพื่อลดเวลาในการตอบสนองโดยไม่เพิ่มจำนวนข้อผิดพลาดอย่างมีนัยสำคัญ