SurfaceFlinger และ WindowManager

SurfaceFlinger ยอมรับบัฟเฟอร์ สร้างบัฟเฟอร์ และส่งบัฟเฟอร์ไปยังจอแสดงผล WindowManager จัดเตรียมบัฟเฟอร์และข้อมูลเมตาของหน้าต่างให้กับ SurfaceFlinger ซึ่ง SurfaceFlinger ใช้ในการประกอบพื้นผิวเข้ากับจอแสดงผล

SurfaceFlinger

SurfaceFlinger ยอมรับบัฟเฟอร์ได้สองวิธี: ผ่าน BufferQueue และ SurfaceControl หรือผ่าน AsurfaceControl

วิธีหนึ่งที่ SurfaceFlinger ยอมรับบัฟเฟอร์คือผ่าน BufferQueue และ SurfaceControl เมื่อแอพมาที่พื้นหน้า แอพจะขอบัฟเฟอร์จาก WindowManager WindowManager ร้องขอเลเยอร์จาก SurfaceFlinger เลเยอร์คือการรวมกันของ พื้นผิว ซึ่งประกอบด้วย BufferQueue และ SurfaceControl ซึ่งมีข้อมูลเมตาของเลเยอร์ เช่น กรอบแสดงผล SurfaceFlinger สร้างเลเยอร์และส่งไปยัง WindowManager จากนั้น WindowManager จะส่งพื้นผิวไปยังแอป แต่ยังคงให้ SurfaceControl จัดการลักษณะที่ปรากฏของแอปบนหน้าจอ

Android 10 เพิ่ม AsurfaceControl ซึ่งเป็นอีกวิธีหนึ่งที่ SurfaceFlinger สามารถรับบัฟเฟอร์ได้ AsurfaceControl รวมพื้นผิวและ SurfaceControl ไว้ในแพ็คเกจธุรกรรมเดียวที่ส่งไปยัง SurfaceFlinger AsurfaceControl เชื่อมโยงกับเลเยอร์ซึ่งแอปอัปเดตผ่าน ASurfaceTransactions จากนั้นแอปจะรับข้อมูลเกี่ยวกับ ASurfaceTransactions ผ่านการเรียกกลับที่ส่งผ่าน ASurfaceTransactionStats ที่มีข้อมูล เช่น เวลาสลัก เวลารับข้อมูล และอื่นๆ

ตารางต่อไปนี้มีรายละเอียดเพิ่มเติมเกี่ยวกับ AsurfaceControl และส่วนประกอบที่เกี่ยวข้อง

ส่วนประกอบ คำอธิบาย
ASurfaceControl ปิด SurfaceControl และเปิดใช้งานแอปเพื่อสร้าง SurfaceControls ที่สอดคล้องกับเลเยอร์บนจอแสดงผล

สามารถสร้างเป็นลูกของ ANativeWindow หรือเป็นลูกของ AsurfaceControl อื่นได้
ASurfaceTransaction Wraps Transaction เพื่อให้ไคลเอนต์สามารถแก้ไขคุณสมบัติการอธิบายของเลเยอร์ เช่น เรขาคณิต และส่งบัฟเฟอร์ที่อัปเดตไปยัง SurfaceFlinger
ASurfaceTransactionStats ส่งข้อมูลเกี่ยวกับธุรกรรมที่ได้นำเสนอ เช่น เวลาในการล็อค เวลารับ และกรอบการปล่อยก่อนหน้า ไปยังแอปผ่านการเรียกกลับที่ลงทะเบียนล่วงหน้า

แม้ว่าแอปจะส่งบัฟเฟอร์ได้ทุกเมื่อ แต่ SurfaceFlinger จะตื่นขึ้นเพื่อยอมรับบัฟเฟอร์ระหว่างการรีเฟรชจอภาพเท่านั้น ซึ่งอาจแตกต่างกันไปตามอุปกรณ์ วิธีนี้ช่วยลดการใช้หน่วยความจำและหลีกเลี่ยงการฉีกขาดที่มองเห็นได้บนหน้าจอ ซึ่งอาจเกิดขึ้นได้เมื่ออัปเดตหน้าจอกลางการรีเฟรช

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

หลังจากที่ SurfaceFlinger ได้รวบรวมบัฟเฟอร์ทั้งหมดสำหรับเลเยอร์ที่มองเห็นได้ จะถาม Hardware Composer (HWC) ว่าควรจัดองค์ประกอบอย่างไร หาก HWC ทำเครื่องหมายประเภทองค์ประกอบของเลเยอร์เป็นองค์ประกอบของไคลเอ็นต์ SurfaceFlinger จะรวมเลเยอร์เหล่านั้น จากนั้น SurfaceFlinger จะส่งบัฟเฟอร์เอาต์พุตไปยัง HWC

WindowManager

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

การหมุนล่วงหน้า

โอเวอร์เลย์ฮาร์ดแวร์จำนวนมากไม่รองรับการหมุน วิธีแก้ไขคือเปลี่ยนบัฟเฟอร์ก่อนถึง SurfaceFlinger Android รองรับคำใบ้แบบสอบถาม ( NATIVE_WINDOW_TRANSFORM_HINT ) ใน ANativeWindow เพื่อแสดงถึงการแปลงที่มีแนวโน้มมากที่สุดที่จะนำไปใช้กับบัฟเฟอร์โดย SurfaceFlinger โปรแกรมควบคุม GL สามารถใช้คำใบ้นี้เพื่อแปลงล่วงหน้าบัฟเฟอร์ก่อนที่จะถึง SurfaceFlinger เพื่อที่ว่าเมื่อบัฟเฟอร์มาถึง จะได้รับการแปลงอย่างถูกต้อง

ตัวอย่างเช่น เมื่อได้รับคำแนะนำให้หมุน 90 องศา ให้สร้างและใช้เมทริกซ์กับบัฟเฟอร์เพื่อป้องกันไม่ให้ทำงานเมื่อสิ้นสุดหน้า เพื่อประหยัดพลังงาน ให้ทำการหมุนล่วงหน้า สำหรับรายละเอียด โปรดดูอินเทอร์เฟซ ANativeWindow ที่กำหนดไว้ใน system/core/include/system/window.h