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 থেকে ডিসকানেক্ট হয়ে যায় এবং অন্য কিছুকে কানেক্ট করতে দেয়।

কোনও প্রদত্ত থ্রেড, কী বর্তমান তা পরিবর্তন করার মাধ্যমে একাধিক EGLSurface-এর মধ্যে পরিবর্তন করতে পারে। একটি EGLSurface অবশ্যই একবারে শুধুমাত্র একটি থ্রেডে বর্তমান থাকতে হবে।

EGL হল SurfaceHolder-এর মতো সারফেসের অন্য কোনও দিক নয়। EGLSurface হল একটি সম্পর্কিত কিন্তু স্বতন্ত্র ধারণা। আপনি এমন EGLSurface-এ আঁকতে পারবেন যা সারফেস দ্বারা ব্যাক-আপ করা নেই এবং আপনি EGL ছাড়া সারফেস ব্যবহার করতে পারবেন। EGLSurface, GLES-কে ড্র করার জন্য একটি জায়গা প্রদান করে।

OpenGL ES ও EGL সংক্রান্ত প্রয়োজনীয়তার জন্য Android মানানসই সংজ্ঞা সংক্রান্ত ডকুমেন্ট দেখুন।

ANativeWindow

পাবলিক সারফেস ক্লাস Java প্রোগ্রামিং ভাষায় প্রয়োগ করা হয়। C/C++-এ এর সমতুল্য হল ANativeWindow ক্লাস, যা Android NDK-এর মাধ্যমে আংশিকভাবে এক্সপোজ করা হয়। আপনি ANativeWindow_fromSurface() কলের মাধ্যমে কোনও সারফেস থেকে ANativeWindow পেতে পারেন। এর জাভা-ভাষার সমগোত্রীয়ের মতো, আপনি এটি লক করতে, সফ্টওয়্যারে রেন্ডার করতে, এবং আনলক করে পোস্ট করতে পারবেন। সাধারণ নেটিভ উইন্ডো হল BufferQueue-এর প্রোডিউসার সাইড।

নেটিভ কোড থেকে EGL উইন্ডো সারফেস তৈরি করতে, eglCreateWindowSurface()-এ EGLNativeWindowType-এর একটি ইনস্ট্যান্স পাস করুন। EGLNativeWindowType হল ANativeWindow-এর সমার্থক শব্দ, তাই আপনি একটি থেকে অন্যটিতে কাস্ট করতে পারবেন।