EGLSurfaces และ OpenGL ES

Android ใช้ OpenGL ES (GLES) API เพื่อแสดงผลกราฟิก ในการสร้างบริบท GLES และจัดเตรียมระบบหน้าต่างสำหรับการเรนเดอร์ GLES Android จะใช้ ไลบรารี EGL GLES เรียกแสดงรูปหลายเหลี่ยมแบบมีพื้นผิว ในขณะที่การเรียก EGL จะแสดงผลบนหน้าจอ

ก่อนที่คุณจะวาดด้วย GLES คุณต้องสร้างบริบท GL ใน EGL นี่หมายถึงการสร้าง EGLContext และ EGLsurface การดำเนินการ GLES ใช้กับบริบทปัจจุบัน ซึ่งเข้าถึงได้ผ่านการจัดเก็บเธรดโลคัลแทนที่จะส่งผ่านเป็นอาร์กิวเมนต์ รหัสการแสดงผลควรรันบนเธรด GLES ปัจจุบัน ไม่ใช่เธรด UI

EGLSurfaces

EGLSurface สามารถเป็นบัฟเฟอร์นอกหน้าจอที่จัดสรรโดย EGL เรียกว่า pbuffer หรือหน้าต่างที่ระบบปฏิบัติการจัดสรร การเรียกใช้ eglCreateWindowSurface() จะสร้างพื้นผิวหน้าต่าง EGL eglCreateWindowSurface() รับ วัตถุหน้าต่าง เป็นอาร์กิวเมนต์ ซึ่งบน Android เป็นพื้นผิว พื้นผิวคือด้าน ผู้ผลิต ของ BufferQueue ผู้บริโภค ซึ่งได้แก่ SurfaceView, SurfaceTexture, TextureView หรือ ImageReader สร้างพื้นผิว เมื่อคุณเรียก eglCreateWindowSurface() EGL จะสร้างวัตถุ EGLSurface ใหม่และเชื่อมต่อกับอินเทอร์เฟซผู้ผลิตของ BufferQueue ของวัตถุหน้าต่าง จากจุดนั้นเป็นต้นมา การเรนเดอร์ไปยัง EGLSurface นั้นจะส่งผลให้บัฟเฟอร์ถูกจัดคิว แสดงผล และเข้าคิวสำหรับผู้บริโภค

EGL ไม่มีการล็อก/ปลดล็อกการโทร ออกคำสั่งวาดแล้วเรียก eglSwapBuffers() เพื่อส่งเฟรมปัจจุบัน ชื่อเมธอดมาจากการสลับบัฟเฟอร์ด้านหน้าและด้านหลังแบบดั้งเดิม แต่การใช้งานจริงอาจแตกต่างกัน

EGLSurface เดียวเท่านั้นที่สามารถเชื่อมโยงกับพื้นผิวในแต่ละครั้ง (คุณสามารถมีผู้ผลิตเพียงรายเดียวที่เชื่อมต่อกับ BufferQueue) แต่ถ้าคุณทำลาย EGLSurface มันจะยกเลิกการเชื่อมต่อจาก BufferQueue และให้อย่างอื่นเชื่อมต่อ

เธรดที่กำหนดสามารถสลับไปมาระหว่าง EGLSurfaces หลายรายการโดยเปลี่ยนสิ่งที่เป็น ปัจจุบัน EGLSurface ต้องเป็นปัจจุบันในเธรดเดียวเท่านั้นในแต่ละครั้ง

EGL ไม่ใช่อีกแง่มุมหนึ่งของพื้นผิว (เช่น SurfaceHolder) EGLSurface เป็นแนวคิดที่เกี่ยวข้องแต่มีความเป็นอิสระ คุณสามารถวาดบนพื้นผิว EGL ที่ไม่มีพื้นผิวรองรับ และคุณสามารถใช้พื้นผิวที่ไม่มี EGL ได้ EGLsurface ให้ GLES มีที่สำหรับวาด

โปรดดู เอกสารข้อกำหนดความเข้ากันได้ ของ Android สำหรับข้อกำหนด OpenGL ES และ EGL

ANativeWindow

คลาสพื้นผิวสาธารณะถูกนำมาใช้ในภาษาการเขียนโปรแกรม Java เทียบเท่าใน C/C++ คือคลาส ANativeWindow กึ่งเปิดเผยโดย Android NDK คุณสามารถรับ ANativeWindow จากพื้นผิวด้วยการ ANativeWindow_fromSurface() เช่นเดียวกับลูกพี่ลูกน้องในภาษา Java คุณสามารถล็อก แสดงผลในซอฟต์แวร์ และปลดล็อกและโพสต์ได้ ประเภท หน้าต่าง พื้นฐานพื้นฐานคือด้านผู้ผลิตของ BufferQueue

ในการสร้างพื้นผิวหน้าต่าง EGL จากโค้ดเนทีฟ ให้ส่งอินสแตนซ์ของ EGLNativeWindowType ไปที่ eglCreateWindowSurface() EGLNativeWindowType เป็นคำพ้องความหมายสำหรับ ANativeWindow ดังนั้นคุณจึงสามารถส่งรายการหนึ่งไปยังอีกรายการหนึ่งได้