กราฟิก

ไอคอนกราฟิก Android 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

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