เฟรมเวิร์กของ Android มี API การแสดงกราฟิกที่หลากหลายสำหรับ 2 มิติและ 3 มิติ ซึ่งโต้ตอบกับการใช้งานไดรเวอร์กราฟิกของผู้ผลิต ดังนั้นจึงควรทำความเข้าใจวิธีการทำงานของ API เหล่านั้นในระดับที่สูงขึ้น หน้านี้จะแนะนำ Hardware Abstraction Layer (HAL) ของกราฟิกซึ่งเป็นเลเยอร์ที่ไดรเวอร์เหล่านั้นสร้างขึ้น โปรดทำความคุ้นเคยกับคำศัพท์ต่อไปนี้ก่อนอ่านส่วนนี้ต่อ
Canvas (องค์ประกอบ API)Surface คลาส Canvas มีเมธอดสำหรับการวาดบิตแมป เส้น วงกลม สี่เหลี่ยมผืนผ้า ข้อความ และอื่นๆ ในคอมพิวเตอร์มาตรฐาน และผูกกับบิตแมปหรือพื้นผิว Canvas เป็นวิธีที่ง่ายที่สุดในการวาดออบเจ็กต์ 2 มิติบนหน้าจอ คลาสพื้นฐานคือ Canvas
android.graphics.drawable
ดูข้อมูลเพิ่มเติมเกี่ยวกับ Drawable และทรัพยากรอื่นๆ ได้ที่
ภาพรวมทรัพยากรของแอป
android.opengl
และ javax.microedition.khronos.opengles
จะแสดงฟังก์ชันการทำงานของ OpenGL ESSurface (องค์ประกอบ API)Surface ให้ใช้คลาส
SurfaceView
แทนคลาส
Surface โดยตรง
SurfaceView (องค์ประกอบ API)View ที่ห่อหุ้มออบเจ็กต์
Surface สำหรับการวาด และแสดงเมธอดเพื่อระบุขนาดและรูปแบบ
แบบไดนามิก Surface View เป็นวิธีในการวาดแยกจากเทรด UI
สำหรับการดำเนินการที่ใช้ทรัพยากรมาก เช่น เกมหรือการแสดงตัวอย่างกล้อง แต่จะใช้หน่วยความจำเพิ่มเติม
Surface View รองรับทั้งกราฟิก Canvas และ OpenGL ES
คลาสพื้นฐานสำหรับออบเจ็กต์ SurfaceView คือ
SurfaceView
R.style และขึ้นต้นด้วย Theme_View (องค์ประกอบ API)View เป็นคลาสพื้นฐาน
สำหรับคอมโพเนนต์เลย์เอาต์ส่วนใหญ่ของหน้าจอกิจกรรมหรือกล่องโต้ตอบ เช่น กล่องข้อความ
และหน้าต่าง ออบเจ็กต์ View จะรับการเรียกจากออบเจ็กต์ระดับบน (ดู
ViewGroup) เพื่อวาดตัวเอง และแจ้งออบเจ็กต์ระดับบน
เกี่ยวกับขนาดและตำแหน่งที่ต้องการ ซึ่งออบเจ็กต์ระดับบนอาจไม่สนใจ ดูข้อมูลเพิ่มเติมได้ที่
View
ViewGroup (องค์ประกอบ API)android.widget
package, but extend the
ViewGroup
class.
android.widget
แพ็กเกจ Window (องค์ประกอบ API)Window
คลาส Abstract ซึ่งระบุองค์ประกอบของ Window ทั่วไป
เช่น ลักษณะที่ปรากฏ ข้อความในแถบชื่อ รวมถึงตำแหน่งและเนื้อหาของ
เมนู กล่องโต้ตอบและกิจกรรมใช้การใช้งานของ
Window คลาสเพื่อแสดงออบเจ็กต์ Window คุณไม่จำเป็นต้องใช้คลาส Window หรือใช้ Window ในแอปนักพัฒนาแอปวาดรูปภาพลงบนหน้าจอได้ 3 วิธี ได้แก่ Canvas, OpenGL ES หรือ Vulkan
คอมโพเนนต์กราฟิกของ Android
ไม่ว่านักพัฒนาซอฟต์แวร์จะใช้ API การแสดงผลใด ระบบจะแสดงทุกอย่างลงบน Surface Surface แสดงถึงฝั่งผู้ผลิตของคิวบัฟเฟอร์ ซึ่งมักจะใช้โดย SurfaceFlinger Window ทุกรายการที่สร้างขึ้นในแพลตฟอร์ม Android ได้รับการสนับสนุนจาก Surface SurfaceFlinger จะรวม Surface ที่แสดงทั้งหมดลงบนจอแสดงผล
แผนภาพต่อไปนี้แสดงวิธีที่คอมโพเนนต์หลักทำงานร่วมกัน

รูปที่ 1 วิธีแสดง Surface
คอมโพเนนต์หลักมีคำอธิบายอยู่ในส่วนต่อไปนี้
ผู้ผลิตสตรีมรูปภาพ
ผู้ผลิตสตรีมรูปภาพอาจเป็นอะไรก็ได้ที่สร้างบัฟเฟอร์กราฟิกสำหรับการใช้งาน ตัวอย่าง ได้แก่ OpenGL ES, Canvas 2D และตัวถอดรหัสวิดีโอ mediaserver
ผู้ใช้สตรีมรูปภาพ
ผู้ใช้สตรีมรูปภาพที่พบบ่อยที่สุดคือ SurfaceFlinger ซึ่งเป็นบริการของระบบที่ใช้ Surface ที่มองเห็นได้ในปัจจุบันและรวม Surface เหล่านั้นลงบนจอแสดงผลโดยใช้ข้อมูลที่ Window Manager ให้ไว้ SurfaceFlinger เป็นบริการเดียวที่แก้ไขเนื้อหาของจอแสดงผลได้ SurfaceFlinger ใช้ OpenGL และ Hardware Composer (HWC) เพื่อรวมกลุ่ม Surface
แอป OpenGL ES อื่นๆ ก็ใช้สตรีมรูปภาพได้เช่นกัน เช่น แอปกล้องใช้สตรีมรูปภาพการแสดงตัวอย่างกล้อง แอปที่ไม่ใช่ GL ก็เป็นผู้ใช้ได้เช่นกัน เช่น คลาส ImageReader
Hardware Composer
Hardware Abstraction สำหรับระบบย่อยของจอแสดงผล SurfaceFlinger สามารถมอบหมายงานการรวมบางอย่างให้กับ HWC เพื่อลดภาระงานจาก OpenGL และ GPU SurfaceFlinger ทำหน้าที่เป็นเพียงไคลเอ็นต์ OpenGL ES อีกรายหนึ่ง ดังนั้น เมื่อ SurfaceFlinger รวมบัฟเฟอร์ 1 หรือ 2 รายการลงในบัฟเฟอร์ที่ 3 อย่างแข็งขัน เช่น SurfaceFlinger จะใช้ OpenGL ES ซึ่งทำให้การรวมใช้พลังงานน้อยกว่าการให้ GPU ทำการคำนวณทั้งหมด
Hardware Composer HAL จะทำงานอีกครึ่งหนึ่งและเป็นจุดศูนย์กลาง สำหรับการแสดงกราฟิกทั้งหมดของ Android HWC ต้องรองรับเหตุการณ์ ซึ่งเหตุการณ์หนึ่งคือ VSync (อีกเหตุการณ์หนึ่งคือ Hotplug สำหรับการรองรับ HDMI แบบ Plug and Play)
Gralloc
ตัวจัดสรรหน่วยความจำกราฟิก (Gralloc) จำเป็นสำหรับการจัดสรรหน่วยความจำที่ผู้ผลิตรูปภาพขอ ดูรายละเอียดได้ที่ BufferQueue และ Gralloc
โฟลว์ข้อมูล
แผนภาพต่อไปนี้แสดงไปป์ไลน์กราฟิกของ Android

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

รูปที่ 3 กระบวนการสื่อสารของ BufferQueue
BufferQueue มีตรรกะที่เชื่อมโยงผู้ผลิตสตรีมรูปภาพและผู้ใช้สตรีมรูปภาพเข้าด้วยกัน ตัวอย่างผู้ผลิตรูปภาพ ได้แก่ การแสดงตัวอย่างกล้องที่สร้างโดยกล้อง HAL หรือเกม OpenGL ES ตัวอย่างผู้ใช้รูปภาพ ได้แก่ SurfaceFlinger หรือแอปอื่นที่แสดงสตรีม OpenGL ES เช่น แอปกล้องที่แสดงช่องมองภาพของกล้อง
BufferQueue คือโครงสร้างข้อมูลที่รวมพูลบัฟเฟอร์เข้ากับคิว และใช้การสื่อสารระหว่างกระบวนการ (IPC) ของ Binder เพื่อส่งบัฟเฟอร์ระหว่างกระบวนการต่างๆ อินเทอร์เฟซผู้ผลิต หรือ
สิ่งที่คุณส่งให้ผู้ที่ต้องการสร้างบัฟเฟอร์กราฟิกคือ
IGraphicBufferProducer (ส่วนหนึ่งของ SurfaceTexture)
โดยมักจะใช้ BufferQueue เพื่อแสดงผลไปยัง Surface และใช้กับ GL
Consumer รวมถึงงานอื่นๆ
BufferQueue สามารถทำงานได้ 3 โหมด ได้แก่
SurfaceFlinger ทำหน้าที่เป็นเพียงไคลเอ็นต์ OpenGL ES อีกรายหนึ่งเพื่อทำงานส่วนใหญ่ ดังนั้น เมื่อ SurfaceFlinger รวมบัฟเฟอร์ 1 หรือ 2 รายการลงในบัฟเฟอร์ที่ 3 อย่างแข็งขัน เช่น SurfaceFlinger จะใช้ OpenGL ES
Hardware Composer HAL จะทำงานอีกครึ่งหนึ่ง HAL นี้ทำหน้าที่เป็นจุดศูนย์กลางสำหรับการแสดงกราฟิกทั้งหมดของ Android