หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

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 offset 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 ถูกตั้งค่าใน BoardConfig.mk makefile ของอุปกรณ์ ขึ้นอยู่กับตัวควบคุมการแสดงผลและลักษณะแผงควบคุม เวลาจากการประทับเวลารั้วเกษียณไปจนถึงสัญญาณ HW VSYNC จะวัดเป็นนาโนวินาที

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

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

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