สถาปัตยกรรมกราฟิก

สิ่งที่นักพัฒนาทุกคนควรรู้เกี่ยวกับ Surfaces, SurfaceHolder, EGLSurface, SurfaceView, GLSurfaceView, SurfaceTexture, TextureView, SurfaceFlinger และ Vulkan

หน้านี้อธิบายองค์ประกอบที่สำคัญของสถาปัตยกรรมกราฟิกระดับระบบ Android และวิธีการใช้งานโดยเฟรมเวิร์กแอพและระบบมัลติมีเดีย จุดเน้นอยู่ที่การที่บัฟเฟอร์ของข้อมูลกราฟิกเคลื่อนที่ผ่านระบบอย่างไร หากคุณเคยสงสัยว่าเหตุใด SurfaceView และ TextureView จึงทำงานในลักษณะเดียวกัน หรือวิธีที่ Surface และ EGLSurface โต้ตอบกัน แสดงว่าคุณมาถูกที่แล้ว

ถือว่ามีความคุ้นเคยบางอย่างกับอุปกรณ์ Android และการพัฒนาแอป คุณไม่จำเป็นต้องมีความรู้โดยละเอียดเกี่ยวกับเฟรมเวิร์กของแอป และมีการกล่าวถึงการเรียก API เพียงเล็กน้อย แต่เนื้อหาไม่ทับซ้อนกับเอกสารสาธารณะอื่นๆ เป้าหมายคือการให้รายละเอียดเกี่ยวกับเหตุการณ์สำคัญที่เกี่ยวข้องกับการเรนเดอร์เฟรมสำหรับเอาต์พุต เพื่อช่วยให้คุณตัดสินใจได้อย่างชาญฉลาดเมื่อออกแบบแอป เพื่อให้บรรลุเป้าหมายนี้ เราทำงานจากล่างขึ้นบน โดยอธิบายว่าคลาส UI ทำงานอย่างไร แทนที่จะใช้งานคลาสเหล่านั้นอย่างไร

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

ส่วนประกอบระดับต่ำ

  • BufferQueue และ gralloc BufferQueue เชื่อมต่อบางสิ่งที่สร้างบัฟเฟอร์ของข้อมูลกราฟิก ( โปรดิวเซอร์ ) กับสิ่งที่ยอมรับข้อมูลสำหรับการแสดงผลหรือการประมวลผลเพิ่มเติม ( ผู้บริโภค ) การจัดสรรบัฟเฟอร์จะดำเนินการผ่านการจัดสรรหน่วยความจำ gralloc ที่ใช้งานผ่านอินเทอร์เฟซ HAL เฉพาะผู้จำหน่าย
  • SurfaceFlinger, Hardware Composer และจอแสดงผลเสมือน SurfaceFlinger ยอมรับบัฟเฟอร์ข้อมูลจากหลายแหล่ง รวมเข้าด้วยกัน และส่งไปยังจอแสดงผล Hardware Composer HAL (HWC) กำหนดวิธีที่มีประสิทธิภาพสูงสุดในการคอมโพสิตบัฟเฟอร์ด้วยฮาร์ดแวร์ที่มีอยู่ และจอแสดงผลเสมือนจะทำให้เอาต์พุตแบบคอมโพสิตพร้อมใช้งานภายในระบบ (การบันทึกหน้าจอหรือการส่งหน้าจอผ่านเครือข่าย)
  • พื้นผิว ผืนผ้าใบ และ SurfaceHolder พื้นผิวสร้างคิวบัฟเฟอร์ที่ SurfaceFlinger มักใช้งาน เมื่อเรนเดอร์บนพื้นผิว ผลลัพธ์จะจบลงในบัฟเฟอร์ที่ถูกส่งไปยังผู้บริโภค Canvas API นำเสนอการใช้งานซอฟต์แวร์ (พร้อมรองรับการเร่งความเร็วด้วยฮาร์ดแวร์) สำหรับการวาดภาพบนพื้นผิวโดยตรง (ทางเลือกระดับต่ำแทน OpenGL ES) สิ่งใดก็ตามที่เกี่ยวข้องกับมุมมองเกี่ยวข้องกับ SurfaceHolder ซึ่ง API ช่วยให้สามารถรับและตั้งค่าพารามิเตอร์พื้นผิว เช่น ขนาดและรูปแบบได้
  • EGLSurface และ OpenGL ES OpenGL ES (GLES) กำหนด API การเรนเดอร์กราฟิกที่ออกแบบมาเพื่อรวมกับ EGL ซึ่งเป็นไลบรารีที่สามารถสร้างและเข้าถึงหน้าต่างผ่านระบบปฏิบัติการ (ในการวาดรูปหลายเหลี่ยมที่มีพื้นผิว ให้ใช้การเรียก GLES หากต้องการการเรนเดอร์บนหน้าจอ ให้ใช้การเรียก EGL ). หน้านี้ยังครอบคลุมถึง ANativeWindow ซึ่งเทียบเท่ากับ C/C++ ของคลาส Java Surface ที่ใช้ในการสร้างพื้นผิวหน้าต่าง EGL จากโค้ดเนทีฟ
  • วัลแคน . Vulkan เป็น API ข้ามแพลตฟอร์มที่มีค่าใช้จ่ายต่ำสำหรับกราฟิก 3 มิติประสิทธิภาพสูง เช่นเดียวกับ OpenGL ES Vulkan มีเครื่องมือสำหรับการสร้างกราฟิกคุณภาพสูงแบบเรียลไทม์ในแอป ข้อดีของ Vulkan ได้แก่ การลดโอเวอร์เฮดของ CPU และการรองรับภาษา SPIR-V Binary Intermediate

ส่วนประกอบระดับสูง

  • SurfaceView และ GLSurfaceView SurfaceView ผสมผสานพื้นผิวและมุมมองเข้าด้วยกัน ส่วนประกอบมุมมองของ SurfaceView ประกอบขึ้นโดย SurfaceFlinger (ไม่ใช่แอป) ทำให้สามารถเรนเดอร์จากเธรด/กระบวนการที่แยกจากกัน และแยกจากเรนเดอร์ UI ของแอป GLSurfaceView มีคลาสตัวช่วยในการจัดการบริบท EGL การสื่อสารแบบอินเตอร์เธรด และการโต้ตอบกับวงจรกิจกรรม (แต่ไม่จำเป็นต้องใช้ GLES)
  • พื้นผิว . SurfaceTexture ผสมผสานพื้นผิวและพื้นผิว GLES เพื่อสร้าง BufferQueue ที่แอปของคุณเป็นผู้บริโภค เมื่อผู้ผลิตเข้าคิวบัฟเฟอร์ใหม่ มันจะแจ้งเตือนแอปของคุณ ซึ่งจะปล่อยบัฟเฟอร์ที่เก็บไว้ก่อนหน้านี้ รับบัฟเฟอร์ใหม่จากคิว และทำการเรียก EGL เพื่อให้บัฟเฟอร์พร้อมใช้งานสำหรับ GLES ในรูปแบบพื้นผิวภายนอก Android 7.0 เพิ่มการรองรับสำหรับการเล่นวิดีโอพื้นผิวที่ปลอดภัย เปิดใช้งาน GPU หลังการประมวลผลเนื้อหาวิดีโอที่ได้รับการป้องกัน
  • TextureView . TextureView รวมมุมมองเข้ากับ SurfaceTexture TextureView ล้อม SurfaceTexture และรับผิดชอบในการตอบสนองต่อการโทรกลับและรับบัฟเฟอร์ใหม่ เมื่อวาดภาพ TextureView จะใช้เนื้อหาของบัฟเฟอร์ที่ได้รับล่าสุดเป็นแหล่งข้อมูล โดยแสดงผลทุกที่และทุกแห่งที่สถานะมุมมองระบุว่าควร การจัดองค์ประกอบมุมมองจะดำเนินการด้วย GLES เสมอ ซึ่งหมายความว่าการอัปเดตเนื้อหาอาจทำให้องค์ประกอบมุมมองอื่นๆ ต้องวาดใหม่เช่นกัน