SurfaceFlinger จะยอมรับบัฟเฟอร์ คอมโพสิทบัฟเฟอร์ และส่งบัฟเฟอร์ไปยังจอแสดงผล WindowManager ให้ SurfaceFlinger ที่มีบัฟเฟอร์และหน้าต่าง ข้อมูลเมตาที่ SurfaceFlinger ใช้กับพื้นผิวแบบผสมไปยังจอแสดงผล
SurfaceFlinger
SurfaceFlinger ยอมรับบัฟเฟอร์ได้ 2 วิธี ได้แก่ ผ่าน BufferQueue และ SurfaceControl หรือผ่าน ASurfaceControl
วิธีหนึ่งที่ SurfaceFlinger ยอมรับบัฟเฟอร์คือการทำผ่าน BufferQueue SurfaceControl เมื่อแอปปรากฏขึ้นที่เบื้องหน้า แอปจะขอบัฟเฟอร์จาก WindowManager จากนั้น WindowManager จะขอเลเยอร์จาก SurfaceFlinger เลเยอร์คือชุดค่าผสมของ surface ซึ่งมี BufferQueue และ SurfaceControl ซึ่งมีข้อมูลเมตาของเลเยอร์ เช่น เฟรมการแสดงผล SurfaceFlinger จะสร้างเลเยอร์และส่งไปยัง WindowManager ผู้จัดการหน้าต่าง จากนั้นส่ง Surface ไปยังแอป แต่คง SurfaceControl ไว้ที่ ควบคุมลักษณะที่ปรากฏของแอปบนหน้าจอ
Android 10 เพิ่ม ASurfaceControl ซึ่งเป็นอีก วิธีที่ SurfaceFlinger รับบัฟเฟอร์ได้ ASurfaceControl จะรวมพื้นผิวและ SurfaceControl ไว้ในแพ็กเกจธุรกรรมเดียวที่ส่งไปยัง SurfaceFlinger ASurfaceControl จะเชื่อมโยงกับเลเยอร์ ซึ่งแอปจะอัปเดตผ่าน ASurfaceTransactions จากนั้นแอปจะได้รับข้อมูลเกี่ยวกับ ASurfaceTransactions ผ่านคอลแบ็กที่ส่ง ASurfaceTransactionStats ซึ่งมีข้อมูล เช่น เวลาแตะ เวลารับ เป็นต้น
ตารางต่อไปนี้มีรายละเอียดเพิ่มเติมเกี่ยวกับ ASurfaceControl และคอมโพเนนต์ที่เกี่ยวข้อง
ส่วนประกอบ | คำอธิบาย |
---|---|
ASurfaceControl | แพ็กเกจนี้จะรวม SurfaceControl และช่วยให้แอปสร้าง SurfaceControl ที่สอดคล้องกับเลเยอร์บนจอแสดงผลได้ สร้างเป็นองค์ประกอบย่อยของ ANativeWindow หรือเป็นองค์ประกอบย่อยของ ASurfaceControl อื่นได้ |
ธุรกรรมของ ASurface | ตัดธุรกรรมเพื่อทำให้ลูกค้าสามารถแก้ไขคำอธิบายของเลเยอร์ได้ เช่น เรขาคณิต และส่งบัฟเฟอร์ที่อัปเดตแล้วไปยัง SurfaceFlinger |
ASurfaceTransactionStats | ส่งข้อมูลเกี่ยวกับธุรกรรมที่แสดง เช่น เวลาแตะ เวลารับ และรั้วการปล่อยก่อนหน้า ไปยังแอปผ่านการเรียกกลับที่ลงทะเบียนไว้ล่วงหน้า |
แม้ว่าแอปจะส่งบัฟเฟอร์ได้ทุกเมื่อ แต่ SurfaceFlinger จะทำงานในเวลา ยอมรับบัฟเฟอร์ระหว่างการรีเฟรชจอแสดงผล ซึ่งอาจแตกต่างกันไปขึ้นอยู่กับ อุปกรณ์ ซึ่งจะช่วยลดการใช้หน่วยความจำและหลีกเลี่ยงการฉีกขาดที่มองเห็นได้จาก ซึ่งอาจเกิดขึ้นได้เมื่ออัปเดตหน้าจอระหว่างรีเฟรช
เมื่อจอแสดงผลอยู่ระหว่างการรีเฟรช จอแสดงผลจะส่ง VSYNC ไปยัง SurfaceFlinger สัญญาณ VSYNC บ่งชี้ว่าจอแสดงผลสามารถ สดชื่นโดยไม่ต้องฉีกขาด เมื่อ SurfaceFlinger ได้รับสัญญาณ VSYNC ก็จะเรียกดูรายการเลเยอร์เพื่อหาบัฟเฟอร์ใหม่ หากแพลตฟอร์มFlinger พบ ทำให้ SurfaceFlinger ได้บัฟเฟอร์ใหม่ หากไม่เป็นเช่นนั้น SurfaceFlinger จะทำงานต่อ เพื่อใช้บัฟเฟอร์ที่ได้มาก่อนหน้านี้ SurfaceFlinger ต้องแสดงบางอย่างเสมอ เพื่อให้มีบัฟเฟอร์ข้อมูลเดียว หากไม่เคยส่งบัฟเฟอร์ในเลเยอร์ ระบบจะไม่สนใจเลเยอร์นั้น
หลังจาก SurfaceFlinger รวบรวมบัฟเฟอร์ทั้งหมดสําหรับเลเยอร์ที่มองเห็นแล้ว ก็จะถามเครื่องมือคอมโพสิตฮาร์ดแวร์ (HWC) ว่าควรใช้การคอมโพสอย่างไร หาก HWC ระบุว่าประเภทการคอมโพสเลเยอร์เป็นการคอมโพสของไคลเอ็นต์ SurfaceFlinger จะคอมโพสเลเยอร์เหล่านั้น จากนั้น SurfaceFlinger จะส่งบัฟเฟอร์เอาต์พุตไปยัง HWC
ผู้จัดการหน้าต่าง
WindowManager ควบคุมออบเจ็กต์ window ซึ่งเป็นคอนเทนเนอร์สำหรับออบเจ็กต์ view ออบเจ็กต์หน้าต่างจะได้รับการสนับสนุนโดย บนพื้นผิวของวัตถุ WindowManager ดูแลวงจรการใช้งาน อินพุต และโฟกัส เหตุการณ์, การวางแนวหน้าจอ, การเปลี่ยน, ภาพเคลื่อนไหว, ตำแหน่ง, การเปลี่ยนรูปแบบ z-order และลักษณะอื่นๆ อีกมากมายของหน้าต่าง WindowManager ส่ง ข้อมูลเมตาของหน้าต่างไปยัง SurfaceFlinger เพื่อให้ SurfaceFlinger สามารถใช้ข้อมูลนั้นเพื่อ พื้นผิวผสมบนหน้าจอ
การหมุนเวียนล่วงหน้า
การวางซ้อนฮาร์ดแวร์จำนวนมากไม่รองรับการหมุน (และแม้ว่าจะรองรับ ก็ต้องใช้พลังงานในการประมวลผล) ทางออกคือการเปลี่ยนรูปแบบบัฟเฟอร์ก่อนที่จะส่งไปยัง SurfaceFlinger Android รองรับคำแนะนำการค้นหา
(NATIVE_WINDOW_TRANSFORM_HINT
) ใน ANativeWindow
ไปยัง
แสดงถึงการเปลี่ยนรูปแบบที่มีแนวโน้มว่าจะใช้กับบัฟเฟอร์
SurfaceFlinger ไดรเวอร์ GL สามารถใช้คำแนะนำนี้เพื่อเปลี่ยนรูปแบบบัฟเฟอร์ล่วงหน้าก่อนที่จะส่งไปยัง SurfaceFlinger เพื่อให้บัฟเฟอร์ได้รับการเปลี่ยนรูปแบบอย่างถูกต้องเมื่อมาถึง
ตัวอย่างเช่น เมื่อได้รับคำแนะนำให้หมุน 90 องศา ให้สร้างและใช้
เพื่อป้องกันไม่ให้บัฟเฟอร์ยาวจนสุดของหน้า เพื่อบันทึก
เพื่อการหมุนเวียนข้อมูลล่วงหน้า โปรดดูรายละเอียดที่ANativeWindow
อินเทอร์เฟซที่กำหนดไว้ใน system/core/include/system/window.h