เลเยอร์และจอแสดงผล

เลเยอร์และจอแสดงผลเป็นสององค์ประกอบพื้นฐานที่แสดงถึงงานองค์ประกอบและการโต้ตอบกับฮาร์ดแวร์การแสดงผล

เลเยอร์

เลเยอร์เป็นหน่วยที่สำคัญที่สุดขององค์ประกอบ ชั้นคือการรวมกันของ พื้นผิว และตัวอย่างของ SurfaceControl แต่ละชั้นมีชุดของคุณสมบัติที่กำหนดวิธีการโต้ตอบกับชั้นอื่นๆ คุณสมบัติของเลเยอร์มีอธิบายไว้ในตารางด้านล่าง

คุณสมบัติ คำอธิบาย
ตำแหน่ง กำหนดตำแหน่งที่เลเยอร์ปรากฏบนจอแสดงผล รวมถึงข้อมูลเช่นตำแหน่งของขอบชั้นของและลำดับ Z เทียบกับชั้นอื่น ๆ (ไม่ว่ามันควรจะเป็นในด้านหน้าหรือด้านหลังชั้นอื่น ๆ )
เนื้อหา กำหนดวิธีการนำเสนอเนื้อหาที่แสดงบนเลเยอร์ภายในขอบเขตที่กำหนดโดยคุณสมบัติตำแหน่ง รวมข้อมูล เช่น การครอบตัด (เพื่อขยายส่วนหนึ่งของเนื้อหาเพื่อเติมเต็มขอบเขตของเลเยอร์) และการแปลง (เพื่อแสดงเนื้อหาที่หมุนหรือพลิกกลับ)
องค์ประกอบ กำหนดวิธีการประกอบเลเยอร์กับเลเยอร์อื่นๆ รวมถึงข้อมูลเช่นโหมดและค่า alpha ชั้นกว้างสำหรับการผสม อัลฟา compositing
การเพิ่มประสิทธิภาพ ให้ข้อมูลที่ไม่จำเป็นอย่างยิ่งในการประกอบเลเยอร์อย่างถูกต้อง แต่สามารถใช้โดยอุปกรณ์ Hardware Composer (HWC) เพื่อปรับวิธีการจัดองค์ประกอบให้เหมาะสม รวมถึงข้อมูลต่างๆ เช่น บริเวณที่มองเห็นได้ของเลเยอร์ และส่วนใดของเลเยอร์ที่ได้รับการอัปเดตตั้งแต่เฟรมก่อนหน้า

จอแสดงผล

จอแสดงผลเป็นอีกหนึ่งหน่วยที่สำคัญขององค์ประกอบ ระบบสามารถมีจอแสดงผลได้หลายจอ และสามารถเพิ่มหรือลบจอแสดงผลระหว่างการทำงานปกติของระบบได้ การแสดงผลถูกเพิ่ม/ลบออกตามคำขอของ HWC หรือตามคำขอของกรอบงาน HWC ร้องขออุปกรณ์แสดงเพิ่มหรือลบออกเมื่อจอแสดงผลภายนอกมีการเชื่อมต่อหรือตัดการเชื่อมต่อจากอุปกรณ์ที่เรียกว่า hotplugging ลูกค้าขอแสดงเสมือนมีเนื้อหาที่จะกลายเป็นบัฟเฟอร์ปิดหน้าจอแทนที่จะเป็นจอแสดงผลทางกายภาพ

จอแสดงผลเสมือน

SurfaceFlinger สนับสนุนการแสดงผลภายใน (ที่สร้างขึ้นในโทรศัพท์มือถือหรือแท็บเล็ต) จอแสดงผลภายนอก (เช่นโทรทัศน์เชื่อมต่อผ่าน HDMI) และหนึ่งหรือแสดงเสมือนจริงมากขึ้นที่ทำให้ composited เอาท์พุทที่มีอยู่ภายในระบบ จอแสดงผลเสมือนสามารถใช้บันทึกหน้าจอหรือส่งหน้าจอผ่านเครือข่ายได้ เฟรมที่สร้างขึ้นสำหรับการแสดงผลเสมือนจะถูกเขียนไปยัง BufferQueue

การแสดงผลเสมือนอาจใช้ชุดเลเยอร์เดียวกันกับจอแสดงผลหลัก (เลเยอร์สแต็ก) หรือมีชุดของตัวเอง ไม่มี VSYNC สำหรับจอแสดงผลเสมือน ดังนั้น VSYNC สำหรับจอแสดงผลภายในจะทริกเกอร์องค์ประกอบสำหรับจอแสดงผลทั้งหมด

ในการใช้งาน HWC ที่รองรับการแสดงผลเสมือนสามารถประกอบเข้ากับ OpenGL ES (GLES), HWC หรือทั้ง GLES และ HWC ได้ ในการใช้งานที่ไม่รองรับ การแสดงผลเสมือนจะถูกรวมเข้าด้วยกันโดยใช้ GLES

กรณีศึกษา: บันทึกหน้าจอ

screenrecord คำสั่ง ให้ผู้ใช้สามารถบันทึกทุกอย่างที่ปรากฏบนหน้าจอเป็น .mp4 แฟ้มบนดิสก์ ในการดำเนินการนี้ ระบบจะรับเฟรมผสมจาก SurfaceFlinger เขียนลงในตัวเข้ารหัสวิดีโอ จากนั้นจึงเขียนข้อมูลวิดีโอที่เข้ารหัสลงในไฟล์ ตัวแปลงสัญญาณวิดีโอจะถูกจัดการโดยกระบวนการแยก ( mediaserver ) ดังนั้นบัฟเฟอร์กราฟิกขนาดใหญ่ต้องย้ายไปรอบ ๆ ระบบ เพื่อให้มีความท้าทายมากขึ้น เป้าหมายคือการบันทึกวิดีโอ 60 fps ที่ความละเอียดสูงสุด กุญแจสำคัญในการทำให้งานนี้มีประสิทธิภาพคือ BufferQueue

MediaCodec ชั้นช่วยให้ app ที่จะให้ข้อมูลที่เป็นไบต์ดิบในบัฟเฟอร์หรือผ่านพื้นผิว เมื่อ screenrecord ร้องขอเข้าถึงเข้ารหัสวิดีโอที่ mediaserver สร้างกระบวนการ BufferQueue เชื่อมต่อตัวเองไปอีกด้านของผู้บริโภคแล้วผ่านด้านหลังผลิตเพื่อ screenrecord เป็นพื้นผิว

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

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

กรณีศึกษา: จำลองการแสดงผลรอง

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

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