از 27 مارس 2025، توصیه می کنیم از android-latest-release به جای aosp-main برای ساختن و کمک به AOSP استفاده کنید. برای اطلاعات بیشتر، به تغییرات AOSP مراجعه کنید.
با مجموعهها، منظم بمانید
ذخیره و طبقهبندی محتوا براساس اولویتهای شما.
اندروید از OpenGL ES (GLES) API برای ارائه گرافیک استفاده می کند. برای ایجاد زمینه های GLES و ارائه یک سیستم پنجره برای رندرهای GLES، Android از کتابخانه EGL استفاده می کند. فراخوانیهای GLES چند ضلعیهای بافتدار را رندر میکنند، در حالی که فراخوانهای EGL رندرهایی را روی صفحه نمایش میدهند.
قبل از ترسیم با GLES، باید یک زمینه GL ایجاد کنید. در EGL، این به معنای ایجاد یک EGLContext و یک EGLSurface است. عملیات GLES در زمینه فعلی اعمال می شود، که به جای ارسال به عنوان آرگومان، از طریق ذخیره سازی رشته محلی قابل دسترسی است. کد رندر باید روی رشته GLES فعلی اجرا شود، نه رشته UI.
سطوح EGLS
EGLSurface می تواند یک بافر خارج از صفحه باشد که توسط EGL تخصیص داده شده است، که pbuffer نامیده می شود، یا یک پنجره اختصاص داده شده توسط سیستم عامل. فراخوانی تابع eglCreateWindowSurface() سطوح پنجره EGL را ایجاد می کند. eglCreateWindowSurface() یک شی پنجره را به عنوان آرگومان می گیرد که در اندروید یک سطح است. یک سطح، سمت تولید کننده یک BufferQueue است. مصرف کنندگان ، که SurfaceView، SurfaceTexture، TextureView یا ImageReader هستند، سطوح را ایجاد می کنند. هنگامی که eglCreateWindowSurface() را فرا میخوانید، EGL یک شی EGLSurface جدید ایجاد میکند و آن را به رابط تولیدکننده BufferQueue شی پنجره متصل میکند. از آن نقطه به بعد، رندر کردن به آن EGLSurface باعث میشود که یک بافر در صف قرار گیرد، در آن رندر شود و برای استفاده توسط مصرفکننده در صف قرار گیرد.
EGL تماس های قفل/باز کردن قفل را ارائه نمی دهد. دستورات ترسیم را صادر کنید و سپس eglSwapBuffers() برای ارسال فریم فعلی فراخوانی کنید. نام روش از تعویض سنتی بافرهای جلو و عقب گرفته شده است، اما اجرای واقعی ممکن است متفاوت باشد.
فقط یک EGLSurface می تواند در یک زمان با یک سطح مرتبط شود (شما می توانید فقط یک تولید کننده متصل به BufferQueue داشته باشید)، اما اگر EGLSurface را از بین ببرید از BufferQueue جدا می شود و اجازه می دهد چیز دیگری وصل شود.
یک رشته معین میتواند با تغییر میزان فعلی بین چندین سطح EGLS جابجا شود. یک EGLSurface باید فقط در یک رشته در یک زمان جاری باشد.
EGL جنبه دیگری از یک سطح نیست (مانند SurfaceHolder). EGLSurface یک مفهوم مرتبط اما مستقل است. می توانید روی یک سطح EGLS طراحی کنید که توسط سطحی پشتیبان آن نیست و می توانید از سطحی بدون EGL استفاده کنید. EGLSurface فقط مکانی برای طراحی GLES فراهم می کند.
برای الزامات OpenGL ES و EGL به سند تعریف سازگاری Android مراجعه کنید.
ANativeWindow
کلاس سطح عمومی در زبان برنامه نویسی جاوا پیاده سازی شده است. معادل آن در C/C++ کلاس ANativeWindow است که توسط Android NDK نیمه در معرض نمایش قرار گرفته است. شما می توانید ANativeWindow را از یک سطح با فراخوانی ANativeWindow_fromSurface() دریافت کنید. درست مانند پسرعموی جاوا زبانش، میتوانید آن را قفل کنید، در نرمافزار رندر کنید و قفل و پست کنید. نوع اصلی پنجره اصلی ، سمت تولیدکننده BufferQueue است.
برای ایجاد یک سطح پنجره EGL از کد اصلی، یک نمونه از EGLNativeWindowType را به eglCreateWindowSurface() ارسال کنید. EGLNativeWindowType مترادف ANativeWindow است، بنابراین می توانید یکی را به دیگری ارسال کنید.
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی.
[[["درک آسان","easyToUnderstand","thumb-up"],["مشکلم را برطرف کرد","solvedMyProblem","thumb-up"],["غیره","otherUp","thumb-up"]],[["اطلاعاتی که نیاز دارم وجود ندارد","missingTheInformationINeed","thumb-down"],["بیشازحد پیچیده/ مراحل بسیار زیاد","tooComplicatedTooManySteps","thumb-down"],["قدیمی","outOfDate","thumb-down"],["مشکل ترجمه","translationIssue","thumb-down"],["مشکل کد / نمونهها","samplesCodeIssue","thumb-down"],["غیره","otherDown","thumb-down"]],["تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی."],[],[],null,["# EGLSurfaces and OpenGL ES\n\nAndroid uses the [OpenGL ES (GLES)](https://www.khronos.org/opengles/)\nAPI to render graphics. To create GLES contexts\nand provide a windowing system for GLES renderings, Android uses the\n[EGL\nlibrary](https://www.khronos.org/egl). GLES calls render textured polygons, while EGL calls put renderings on\nscreens.\n\nBefore you draw with GLES, you need to create a GL context. In EGL,\nthis means creating an EGLContext and an EGLSurface. GLES operations apply to\nthe current context, which is accessed through thread-local storage rather than\npassed as an argument. Rendering code should execute on a current GLES thread,\nnot the UI thread.\n\nEGLSurfaces\n-----------\n\nThe EGLSurface can be an off-screen buffer allocated by EGL, called a\n*pbuffer* , or a window allocated by the operating system. Calling the\n`eglCreateWindowSurface()` function creates EGL window surfaces.\n`eglCreateWindowSurface()` takes a *window object* as an\nargument, which on Android is a surface. A surface is the *producer*\nside of a BufferQueue. *Consumers* , which are SurfaceView,\nSurfaceTexture, TextureView, or ImageReader, create surfaces.\nWhen you call `eglCreateWindowSurface()`, EGL creates a new\nEGLSurface object and connects it to the producer interface of the window\nobject's BufferQueue. From that point onward, rendering to that EGLSurface\nresults in a buffer being dequeued, rendered into, and queued for use by the\nconsumer.\n\n| Though windows are typically displayed, in this case, the output of an EGLSurface window may not appear on the display.\n\nEGL doesn't provide lock/unlock calls. Issue drawing commands and\nthen call `eglSwapBuffers()` to submit the current frame. The\nmethod name comes from the traditional swap of front and back buffers, but the actual\nimplementation may be different.\n\nOnly one EGLSurface can be associated with a surface at a time (you can have\nonly one producer connected to a BufferQueue), but if you destroy the\nEGLSurface it disconnects from the BufferQueue and lets something else\nconnect.\n\nA given thread can switch between multiple EGLSurfaces by changing what's\n*current*. An EGLSurface must be current on only one thread at a time.\n\nEGL isn't another aspect of a surface (like SurfaceHolder). EGLSurface is a\nrelated but independent concept. You can draw on an EGLSurface that isn't\nbacked by a surface, and you can use a surface without EGL. EGLSurface just\nprovides GLES with a place to draw.\n\nRefer to the Android [Compatibility\nDefinition Document](/docs/compatibility/overview) for OpenGL ES and EGL requirements.\n\nANativeWindow\n-------------\n\nThe public surface class is implemented in the Java programming language. The\nequivalent in C/C++ is the ANativeWindow class, semi-exposed by the [Android NDK](https://developer.android.com/ndk/index.html). You\ncan get the ANativeWindow from a surface with the `ANativeWindow_fromSurface()`\ncall. Just like its Java-language cousin, you can lock it, render in software,\nand unlock-and-post. The basic *native window* type is the producer side of a\nBufferQueue.\n\nTo create an EGL window surface from native code, pass an instance of\nEGLNativeWindowType to `eglCreateWindowSurface()`. EGLNativeWindowType is\na synonym for ANativeWindow, so you can cast one to the other."]]