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 ต่อเฟรมไม่แตกต่างกันอย่างมาก เวลาแฝงอย่างน้อยสองเฟรม

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

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

  • HW_VSYNC_0 — จอภาพเริ่มแสดงเฟรมถัดไป
  • VSYNC — แอปอ่านอินพุตและสร้างเฟรมถัดไป
  • SF_VSYNC — SurfaceFlinger เริ่มผสมสำหรับเฟรมถัดไป

ด้วยออฟเซ็ต 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
  • คำติชม — เลิกใช้การประทับเวลาของสัญญาณรั้วจาก Hardware Composer

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

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

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

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

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

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