VSync

สัญญาณ 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

DispSync flow

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