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 คือสัญญาณสามสัญญาณที่มีช่วงเวลาและเฟสออฟเซ็ตเดียวกัน:

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

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

DisSync

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

DispSync เป็นซอฟต์แวร์ Phase-Lock Loop (PLL) ที่สร้างสัญญาณ VSYNC และ SF_VSYNC ที่นักออกแบบท่าเต้นและ 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 นาน

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