EGLSurface และ 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 และปล่อยให้สิ่งอื่นเชื่อมต่อ

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

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

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

ANativeWindow

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

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