EGLSurfaces และ OpenGL ES

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

คุณต้องสร้างบริบท GL ก่อนวาดด้วย GLES ใน 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

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

ANativeWindow

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

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