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

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

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

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

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

คอมโพเนนต์ระดับล่าง

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

คอมโพเนนต์ระดับสูง

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