Android ใช้ API OpenGL ES (GLES) ในการแสดงผลกราฟิก Android ใช้ไลบรารี EGLเพื่อสร้างบริบท GLES และจัดเตรียมระบบการแสดงหน้าต่างสำหรับการแสดงผล GLES การเรียก GLES จะแสดงผลรูปหลายเหลี่ยมที่มีพื้นผิว ส่วนการเรียก EGL จะแสดงผลบนหน้าจอ
คุณต้องสร้างบริบท GL ก่อนจึงจะวาดด้วย GLES ได้ ใน EGL หมายถึงการสร้าง EGLContext และ EGLSurface การดำเนินการ GLES จะใช้กับบริบทปัจจุบัน ซึ่งเข้าถึงได้ผ่านพื้นที่เก็บข้อมูลเฉพาะเธรดแทนที่จะส่งเป็นอาร์กิวเมนต์ โค้ดการแสดงผลต้องทำงานในเธรด GLES ไม่ใช่เธรด UI
EGLSurfaces
EGLSurface อาจเป็นบัฟเฟอร์นอกหน้าจอที่ EGL จัดสรรให้ ซึ่งเรียกว่า pbuffer หรือหน้าต่างที่ระบบปฏิบัติการจัดสรรให้ การเรียกใช้ฟังก์ชัน
eglCreateWindowSurface()
จะสร้างพื้นผิวหน้าต่าง EGL
eglCreateWindowSurface()
รับออบเจ็กต์หน้าต่างเป็นอาร์กิวเมนต์ ซึ่งใน Android คือพื้นผิว Surface คือฝั่งผู้ผลิต
ของ BufferQueue Consumer ซึ่งคือ SurfaceView, SurfaceTexture, TextureView หรือ ImageReader จะสร้าง Surface
เมื่อคุณเรียกใช้ eglCreateWindowSurface()
EGL จะสร้างออบเจ็กต์ EGLSurface ใหม่และเชื่อมต่อกับอินเทอร์เฟซ Producer ของ BufferQueue ของออบเจ็กต์หน้าต่าง จากนั้นเป็นต้นไป การแสดงผลไปยัง EGLSurface
จะยกเลิกการต่อคิวบัฟเฟอร์ แสดงผลลงในบัฟเฟอร์ และต่อคิวบัฟเฟอร์เพื่อให้ผู้ใช้ใช้
EGL ไม่มีการเรียกใช้ฟังก์ชันล็อก/ปลดล็อก ออกคำสั่งวาดภาพและ
จากนั้นเรียกใช้ eglSwapBuffers()
เพื่อส่งเฟรมปัจจุบัน ชื่อเมธอด
มาจากสลับบัฟเฟอร์หน้าและหลังแบบเดิม แต่การ
ใช้งานจริงอาจแตกต่างกัน
เชื่อมโยง EGLSurface กับ Surface ได้ครั้งละ 1 รายการเท่านั้น (คุณเชื่อมต่อ Producer กับ BufferQueue ได้เพียงรายการเดียว) แต่หากทำลาย EGLSurface ระบบจะยกเลิกการเชื่อมต่อจาก BufferQueue และอนุญาตให้เชื่อมต่อรายการอื่นได้
เธรดหนึ่งๆ สามารถสลับระหว่าง EGLSurface หลายรายการได้โดยเปลี่ยนสิ่งที่current EGLSurface ต้องเป็นปัจจุบันในเธรดเดียวเท่านั้นในแต่ละครั้ง
EGL ไม่ใช่ลักษณะอีกอย่างของ Surface เช่น SurfaceHolder EGLSurface เป็นแนวคิดที่เกี่ยวข้องแต่เป็นอิสระ คุณวาดบน EGLSurface ที่ไม่ได้ สำรองข้อมูลโดย Surface และใช้ Surface โดยไม่ต้องใช้ EGL ได้ EGLSurface ช่วยให้ GLES มีพื้นที่สำหรับวาดภาพ
โปรดดูข้อกำหนดของ OpenGL ES และ EGL ในเอกสารคำจำกัดความ ความเข้ากันได้ของ Android
ANativeWindow
คลาส Surface สาธารณะได้รับการติดตั้งใช้งานในภาษาโปรแกรม Java
ใน C/C++ จะเทียบเท่ากับคลาส ANativeWindow ซึ่งAndroid NDK แสดงให้เห็นบางส่วน คุณ
รับ ANativeWindow จาก Surface ได้ด้วยANativeWindow_fromSurface()
การเรียก คุณสามารถล็อก แสดงผลในซอฟต์แวร์
และปลดล็อกแล้วโพสต์ได้เช่นเดียวกับรุ่นที่ใช้ภาษา Java ประเภทหน้าต่างเนทีฟพื้นฐานคือฝั่งผู้ผลิตของ BufferQueue
หากต้องการสร้างพื้นผิวหน้าต่าง EGL จากโค้ดเนทีฟ ให้ส่งอินสแตนซ์ของ
EGLNativeWindowType ไปยัง eglCreateWindowSurface()
EGLNativeWindowType เป็น
คำพ้องความหมายของ ANativeWindow คุณจึงแคสต์จากหนึ่งไปยังอีกหนึ่งได้