Google is committed to advancing racial equity for Black communities. See how.
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

กราฟิก

ไอคอน Android Graphics HAL

เฟรมเวิร์กของ Android นำเสนอ API การแสดงผลกราฟิกที่หลากหลายสำหรับ 2D และ 3D ที่โต้ตอบกับการใช้งานไดรเวอร์กราฟิกของผู้ผลิตดังนั้นจึงเป็นสิ่งสำคัญที่จะต้องมีความเข้าใจที่ดีว่า API เหล่านั้นทำงานอย่างไรในระดับที่สูงขึ้น หน้านี้แนะนำเลเยอร์นามธรรมของฮาร์ดแวร์กราฟิก (HAL) ที่ไดรเวอร์เหล่านั้นสร้างขึ้น

นักพัฒนาแอปพลิเคชันวาดภาพบนหน้าจอได้สามวิธี: ด้วย Canvas , OpenGL ES หรือ Vulkan

ส่วนประกอบกราฟิกของ Android

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

แผนภาพต่อไปนี้แสดงให้เห็นว่าส่วนประกอบสำคัญทำงานร่วมกันอย่างไร:

ส่วนประกอบการแสดงภาพ

รูปที่ 1. วิธีแสดงพื้นผิว

ส่วนประกอบหลักอธิบายไว้ด้านล่าง:

ผู้ผลิตสตรีมรูปภาพ

ผู้ผลิตสตรีมรูปภาพสามารถเป็นอะไรก็ได้ที่สร้างบัฟเฟอร์กราฟิกสำหรับการบริโภค ตัวอย่าง ได้แก่ OpenGL ES, Canvas 2D และตัวถอดรหัสวิดีโอสื่อกลาง

ผู้บริโภคสตรีมรูปภาพ

ผู้ใช้สตรีมภาพที่พบมากที่สุดคือ SurfaceFlinger ซึ่งเป็นบริการระบบที่ใช้พื้นผิวที่มองเห็นได้ในปัจจุบันและประกอบเข้ากับจอแสดงผลโดยใช้ข้อมูลที่ Window Manager ให้มา SurfaceFlinger เป็นบริการเดียวที่สามารถปรับเปลี่ยนเนื้อหาของการแสดงผลได้ SurfaceFlinger ใช้ OpenGL และ Hardware Composer เพื่อสร้างกลุ่มของพื้นผิว

แอป OpenGL ES อื่น ๆ สามารถใช้สตรีมภาพได้เช่นกันเช่นแอปกล้องถ่ายรูปที่ใช้สตรีมภาพตัวอย่างของกล้อง แอปพลิเคชันที่ไม่ใช่ GL สามารถเป็นผู้บริโภคได้เช่นกันตัวอย่างเช่นคลาส ImageReader

นักแต่งเพลงฮาร์ดแวร์

นามธรรมของฮาร์ดแวร์สำหรับระบบย่อยการแสดงผล SurfaceFlinger สามารถมอบหมายงานองค์ประกอบบางอย่างให้กับ Hardware Composer เพื่อถ่ายโอนงานจาก OpenGL และ GPU SurfaceFlinger ทำหน้าที่เป็นเพียงไคลเอนต์ OpenGL ES อื่น ดังนั้นเมื่อ SurfaceFlinger กำลังรวมบัฟเฟอร์หนึ่งหรือสองตัวเป็นหนึ่งในสามอย่างแข็งขันจึงใช้ OpenGL ES ทำให้การคอมโพสิตพลังงานต่ำกว่าการให้ GPU ทำการคำนวณทั้งหมด

Hardware Composer HAL ดำเนินการอีกครึ่งหนึ่งของงานและเป็นจุดศูนย์กลางสำหรับการแสดงผลกราฟิก Android ทั้งหมด Hardware Composer ต้องรองรับเหตุการณ์ซึ่งหนึ่งในนั้นคือ VSYNC (อีกอันคือ hotplug สำหรับการสนับสนุน plug-and-playHDMI)

Gralloc

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

การไหลของข้อมูล

ดูแผนภาพต่อไปนี้สำหรับภาพของท่อส่งกราฟิก Android:

การไหลของข้อมูลกราฟิก

รูปที่ 2. การไหลของข้อมูลกราฟิกผ่าน Android

วัตถุทางด้านซ้ายคือตัวแสดงผลที่สร้างบัฟเฟอร์กราฟิกเช่นหน้าจอหลักแถบสถานะและ UI ของระบบ SurfaceFlinger เป็นผู้เรียบเรียงและ Hardware Composer เป็นผู้เรียบเรียง

บัฟเฟอร์คิว

BufferQueues ให้กาวระหว่างส่วนประกอบกราฟิกของ Android นี่คือคู่ของคิวที่เป็นสื่อกลางของวงจรบัฟเฟอร์ที่คงที่จากผู้ผลิตไปยังผู้บริโภค เมื่อผู้ผลิตเลิกบัฟเฟอร์ SurfaceFlinger จะรับผิดชอบในการประกอบทุกอย่างลงบนจอแสดงผล

ดูแผนภาพต่อไปนี้สำหรับกระบวนการสื่อสาร BufferQueue

กระบวนการสื่อสาร BufferQueue

รูปที่ 3. กระบวนการสื่อสาร BufferQueue

BufferQueue มีตรรกะที่เชื่อมโยงผู้ผลิตสตรีมรูปภาพและผู้บริโภคสตรีมรูปภาพเข้าด้วยกัน ตัวอย่างบางส่วนของผู้ผลิตภาพ ได้แก่ ตัวอย่างกล้องที่ผลิตโดยเกม HAL หรือ OpenGL ES ของกล้อง ตัวอย่างของผู้บริโภครูปภาพ ได้แก่ SurfaceFlinger หรือแอปอื่นที่แสดงสตรีม OpenGL ES เช่นแอปกล้องที่แสดงช่องมองภาพของกล้อง

BufferQueue เป็นโครงสร้างข้อมูลที่รวมบัฟเฟอร์พูลกับคิวและใช้ Binder IPC เพื่อส่งผ่านบัฟเฟอร์ระหว่างกระบวนการ อินเทอร์เฟซผู้ผลิตหรือสิ่งที่คุณส่งต่อให้กับผู้ที่ต้องการสร้างบัฟเฟอร์กราฟิกคือ IGraphicBufferProducer (ส่วนหนึ่งของ SurfaceTexture ) BufferQueue มักใช้ในการแสดงผลไปยัง Surface และใช้กับ GL Consumer รวมถึงงานอื่น ๆ

BufferQueue สามารถทำงานได้สามโหมด:

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

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

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

ในการดำเนินงานส่วนใหญ่ SurfaceFlinger ทำหน้าที่เป็นเพียงไคลเอนต์ OpenGL ES อื่น ดังนั้นเมื่อ SurfaceFlinger กำลังรวมบัฟเฟอร์หนึ่งหรือสองตัวเป็นหนึ่งในสามอย่างแข็งขันจึงใช้ OpenGL ES

นักแต่งเพลงฮาร์ดแวร์ HAL ดำเนินการอีกครึ่งหนึ่งของงาน HAL นี้ทำหน้าที่เป็นจุดศูนย์กลางสำหรับการแสดงผลกราฟิก Android ทั้งหมด