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