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, การแสดงเริ่มต้นการแสดงเฟรมในขณะที่ยังไม่มี SurfaceFlinger เริ่มต้น compositing หน้าต่างสำหรับกรอบ N + 1 การป้อนข้อมูลแอปจับที่ค้างอยู่และสร้างกรอบ N + 2

การซิงโครไนซ์กับ VSYNC ให้เวลาแฝงที่สม่ำเสมอ ช่วยลดข้อผิดพลาดในแอปและ SurfaceFlinger และลดการแสดงผลที่เลื่อนเข้าและออกจากเฟสระหว่างกัน สิ่งนี้ถือว่าเวลาแอพและ SurfaceFlinger ต่อเฟรมไม่แตกต่างกันอย่างมาก เวลาแฝงอย่างน้อยสองเฟรม

ในการแก้ไขปัญหานี้ คุณสามารถใช้การชดเชย VSYNC เพื่อลดเวลาในการตอบสนองของอินพุตต่อการแสดงผลโดยสร้างสัญญาณแอปและองค์ประกอบที่สัมพันธ์กับฮาร์ดแวร์ VSYNC เป็นไปได้เนื่องจากแอปและองค์ประกอบมักใช้เวลาน้อยกว่า 33 มิลลิวินาที

ผลลัพธ์ของ VSYNC offset คือ 3 สัญญาณที่มีช่วงเวลาเดียวกันและ offset phase:

  • HW_VSYNC_0 - จอแสดงผลจะเริ่มต้นการแสดงเฟรมถัดไป
  • VSYNC - App อ่านการป้อนข้อมูลและสร้างเฟรมถัดไป
  • SF_VSYNC - SurfaceFlinger เริ่มต้น compositing สำหรับเฟรมถัดไป

ด้วยออฟเซ็ต VSYNC SurfaceFlinger จะได้รับบัฟเฟอร์และประกอบเฟรมในขณะที่แอปประมวลผลอินพุตและแสดงผลเฟรมพร้อมกัน

DispSync

DispSync รักษาโมเดลของเหตุการณ์ VSYNC ที่ใช้ฮาร์ดแวร์เป็นระยะๆ ของจอแสดงผล และใช้โมเดลนั้นเพื่อดำเนินการเรียกกลับที่เฟสออฟเซ็ตเฉพาะจากเหตุการณ์ VSYNC ของฮาร์ดแวร์

DispSync คือซอฟต์แวร์ phase-lock loop (PLL) ที่สร้างสัญญาณ VSYNC และ SF_VSYNC ที่ใช้โดย Choreographer และ SurfaceFlinger แม้ว่าจะไม่ได้ออฟเซ็ตจากฮาร์ดแวร์ VSYNC

โฟลว์ DispSync

การไหลเวียนของรูปที่ 1 DispSync

DispSync มีคุณสมบัติดังต่อไปนี้:

  • อ้างอิง - HW_VSYNC_0
  • เอาท์พุท - Vsync และ SF_VSYNC
  • ข้อเสนอแนะ - Retire timestamps สัญญาณจากรั้วฮาร์ดแวร์นักแต่งเพลง

VSYNC/ออฟเซ็ตการเกษียณ

การประทับเวลาของสัญญาณของรั้วที่เลิกใช้แล้วต้องตรงกับ HW VSYNC แม้ในอุปกรณ์ที่ไม่ได้ใช้เฟสออฟเซ็ต มิฉะนั้น ข้อผิดพลาดดูเหมือนจะรุนแรงกว่าที่เป็นอยู่ แผงอัจฉริยะมักมีเดลต้าที่รั้วการเลิกใช้งานเป็นจุดสิ้นสุดของการเข้าถึงหน่วยความจำโดยตรง (DMA) เพื่อแสดงหน่วยความจำ แต่สวิตช์การแสดงผลจริงและ HW VSYNC จะใช้เวลาในภายหลัง

PRESENT_TIME_OFFSET_FROM_VSYNC_NS ตั้งอยู่ในอุปกรณ์ BoardConfig.mk Makefile ขึ้นอยู่กับตัวควบคุมการแสดงผลและคุณสมบัติของแผง เวลาจากการประทับเวลาของรั้วที่เลิกใช้ไปจนถึงสัญญาณ HW VSYNC จะวัดเป็นนาโนวินาที

VSYNC และ SF_VSYNC ออฟเซ็ต

VSYNC_EVENT_PHASE_OFFSET_NS และ SF_VSYNC_EVENT_PHASE_OFFSET_NS เป็นชุดตามแบบอนุรักษ์นิยมในกรณีการใช้งานโหลดสูงเช่นองค์ประกอบ GPU บางส่วนในระหว่างการเปลี่ยนหน้าต่างหรือ Chrome เลื่อนผ่านหน้าเว็บที่มีภาพเคลื่อนไหว ออฟเซ็ตเหล่านี้ช่วยให้แสดงแอปได้นานและใช้เวลาในการจัดองค์ประกอบ GPU นาน

มองเห็นได้ชัดเจนมากกว่าหนึ่งหรือสองมิลลิวินาที เพื่อลดเวลาในการตอบสนองโดยไม่เพิ่มจำนวนข้อผิดพลาด ให้รวมการทดสอบข้อผิดพลาดอัตโนมัติอย่างละเอียด