VSYNC

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

HWC สร้างเหตุการณ์ VSYNC และส่งเหตุการณ์ไปยัง SurfaceFlinger ผ่าน Callback คือ

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 แบบฮาร์ดแวร์เป็นระยะๆ ของ Display และใช้โมเดลนั้นเพื่อเรียกใช้ Callback ในระยะที่เจาะจง จากเหตุการณ์ VSYNC ด้วยฮาร์ดแวร์

DispSync คือลูปล็อกเฟสของซอฟต์แวร์ (PLL) ที่สร้าง สัญญาณ VSYNC และ SF_VSYNC ที่ Choreographer และ SurfaceFlinger ใช้ แม้ว่า ไม่ได้หักลบจาก VSYNC ของฮาร์ดแวร์

ขั้นตอน DispSync

รูปที่ 1 ขั้นตอน DispSync

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

  • ข้อมูลอ้างอิง — HW_VSYNC_0
  • เอาต์พุต — VSYNC และ SF_VSYNC
  • ความคิดเห็น — เลิกใช้การประทับเวลาของสัญญาณรั้วจาก Security Composer

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 ที่นานขึ้น

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