Android ফ্রেমওয়ার্ক 2D ও 3D-এর জন্য বিভিন্ন ধরনের গ্রাফিক্স রেন্ডারিং API অফার করে যা গ্রাফিক্স ড্রাইভারের প্রস্তুতকারক ইমপ্লিমেন্টেশনের সাথে ইন্টার্যাক্ট করে, তাই সেইসব API কীভাবে উচ্চ স্তরে কাজ করে সেই বিষয়ে ভালো ধারণা থাকা গুরুত্বপূর্ণ। এই পৃষ্ঠায় গ্রাফিক্স হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) সম্পর্কে বলা হয়েছে যেটির উপর ভিত্তি করে এইসব ড্রাইভার তৈরি করা হয়েছে। এই বিভাগটি নিয়ে এগিয়ে যাওয়ার আগে, নিম্নলিখিত শব্দগুলির সাথে নিজেকে পরিচিত করুন:
Canvas (API এলিমেন্ট)Surface অবজেক্টের বিপরীতে
আসল বিট কম্পোজিট করা ম্যানেজ করে। Canvas ক্লাসে বিটম্যাপ, লাইন, বৃত্ত, আয়তক্ষেত্র, টেক্সট ইত্যাদি স্ট্যান্ডার্ড কম্পিউটার ড্রয়িংয়ের
জন্য পদ্ধতি আছে এবং
এটি বিটম্যাপ বা সারফেসের সাথে যুক্ত। ক্যানভাস হল স্ক্রিনে 2D অবজেক্ট আঁকার সবচেয়ে সহজ ও সরল উপায়।
বেস ক্লাস হল
Canvas.
android.graphics.drawable-এর সাবক্লাসে
কম্পাইল করা হয়।
ড্রয়েবল ও অন্যান্য রিসোর্স সম্পর্কে আরও জানতে, অ্যাপ রিসোর্সের ওভারভিউ দেখুন।
android.opengl
এবং javax.microedition.khronos.opengles
প্যাকেজ OpenGL ES কার্যকারিতা এক্সপোজ করে।Surface (API এলিমেন্ট)Surface অবজেক্টের সাইজ পরিবর্তন করতে বিভিন্ন হেল্পার পদ্ধতি প্রদান করে। সরাসরি
Surface ক্লাস ব্যবহার করার পরিবর্তে
SurfaceView
ক্লাস ব্যবহার করুন।
SurfaceView (API এলিমেন্ট)View অবজেক্ট যা ড্রয়িংয়ের জন্য একটি
Surface অবজেক্টকে র্যাপ করে এবং এর সাইজ ও ফর্ম্যাট ডাইনামিক
নির্দিষ্ট করার পদ্ধতি প্রকাশ করে। সারফেস ভিউ, UI থ্রেড থেকে আলাদাভাবে ড্র করার একটি উপায় প্রদান করে
এটি গেম বা ক্যামেরা প্রিভিউয়ের মতো রিসোর্স-ইনটেনসিভ অপারেশনের জন্য ব্যবহার করা হয়, কিন্তু এর ফলে
অতিরিক্ত মেমরি ব্যবহার হয়। সারফেস ভিউ ক্যানভাস ও OpenGL ES
গ্রাফিক্স, দু'টিই সাপোর্ট করে। SurfaceView অবজেক্টের মূল ক্লাস হল
SurfaceView।
R.style
-এ তালিকাভুক্ত এবং Theme_ দিয়ে শুরু হয়।View (API এলিমেন্ট)View ক্লাস হল অ্যাক্টিভিটি বা ডায়ালগ স্ক্রিনের বেশিরভাগ লেআউট কম্পোনেন্টের
মূল ক্লাস, যেমন টেক্সট বক্স
ও উইন্ডো। একটি View অবজেক্ট তার পেরেন্ট অবজেক্ট (দেখুন
ViewGroup) থেকে নিজেকে আঁকার জন্য কল রিসিভ করে এবং তার পেরেন্ট অবজেক্টকে
তার পছন্দের সাইজ এবং লোকেশন সম্পর্কে জানায়, যা পেরেন্ট
সম্মান নাও করতে পারে। আরও তথ্যের জন্য, View দেখুন।
ViewGroup (API এলিমেন্ট)android.widget
প্যাকেজে আছে, তবে
ViewGroup
ক্লাসকে এক্সটেন্ড করে।
android.widget
প্যাকেজে আছে। Window (API এলিমেন্ট)Window
অ্যাবস্ট্রাক্ট ক্লাস থেকে পাওয়া যায় এবং এটি জেনেরিক উইন্ডোর এলিমেন্ট নির্দিষ্ট করে, যেমন লুক অ্যান্ড ফিল, টাইটেল বারের টেক্সট এবং মেনুর লোকেশন ও কন্টেন্ট। ডায়ালগ ও অ্যাক্টিভিটি Window অবজেক্ট রেন্ডার করতে
Window ক্লাসের একটি প্রয়োগ ব্যবহার করে। আপনাকে Window ক্লাস ইমপ্লিমেন্ট করতে
হবে না অথবা আপনার অ্যাপে উইন্ডো ব্যবহার করতে হবে না।অ্যাপ ডেভেলপাররা তিনটি উপায়ে স্ক্রিনে ছবি আঁকেন: Canvas, OpenGL ES অথবা Vulkan ব্যবহার করে।
Android গ্রাফিক্স কম্পোনেন্ট
ডেভেলপাররা যে রেন্ডারিং API-ই ব্যবহার করুন না কেন, সবকিছুই একটি সারফেসে রেন্ডার করা হয়। সারফেস হল বাফার কিউয়ের প্রযোজক সাইড যা SurfaceFlinger প্রায়ই ব্যবহার করে। Android প্ল্যাটফর্মে তৈরি করা প্রতিটি উইন্ডো একটি সারফেস দ্বারা ব্যাক-আপ করা হয়। SurfaceFlinger-এর মাধ্যমে ডিসপ্লেতে রেন্ডার করা সমস্ত দৃশ্যমান সারফেস কম্পোজিট করা হয়।
নিচের ডায়াগ্রাম থেকে বোঝা যায় যে মূল কম্পোনেন্টগুলি কীভাবে একসাথে কাজ করে:

ছবি ১. সারফেস কীভাবে রেন্ডার করা হয়।
প্রধান কম্পোনেন্টগুলি নিম্নলিখিত বিভাগে বর্ণনা করা হয়েছে।
ইমেজ স্ট্রিম প্রোডিউসার
ইমেজ স্ট্রিম প্রডিউসার হল এমন কিছু যা ব্যবহারের জন্য গ্রাফিক বাফার তৈরি করে। OpenGL ES, Canvas 2D ও mediaserver ভিডিও ডিকোডার এর মধ্যে পড়ে।
ইমেজ স্ট্রিম কনজিউমার
ইমেজ স্ট্রিমের সবচেয়ে সাধারণ কনজিউমার হল SurfaceFlinger, এটি হল সিস্টেম পরিষেবা যা বর্তমানে দৃশ্যমান সারফেস কনজিউম করে এবং Window Manager-এর দেওয়া তথ্য ব্যবহার করে সেগুলিকে ডিসপ্লেতে কম্পোজিট করে। SurfaceFlinger হল একমাত্র পরিষেবা যা ডিসপ্লের কন্টেন্ট পরিবর্তন করতে পারে। SurfaceFlinger সারফেসের একটি গ্রুপ কম্পোজ করার জন্য OpenGL এবং হার্ডওয়্যার কম্পোজার (HWC) ব্যবহার করে।
অন্যান্য OpenGL ES অ্যাপও ইমেজ স্ট্রিম ব্যবহার করতে পারে, যেমন ক্যামেরা অ্যাপ ক্যামেরা প্রিভিউ ইমেজ স্ট্রিম ব্যবহার করে। নন-জিএল অ্যাপও গ্রাহক হতে পারে, যেমন ImageReader ক্লাস।
হার্ডওয়্যার কম্পোজার
ডিসপ্লে সাবসিস্টেমের জন্য হার্ডওয়্যার অ্যাবস্ট্রাকশন। SurfaceFlinger, OpenGL ও GPU-এর উপর থেকে কাজের চাপ কমাতে কিছু নির্দিষ্ট কম্পোজিশন সংক্রান্ত কাজ HWC-কে ডেলিগেট করতে পারে। SurfaceFlinger অন্য একটি OpenGL ES ক্লায়েন্ট হিসেবে কাজ করে। তাই SurfaceFlinger যখন সক্রিয়ভাবে একটি বা দুটি বাফারকে তৃতীয় একটি বাফারে কম্পোজিট করে, উদাহরণস্বরূপ, এটি OpenGL ES ব্যবহার করে। এর ফলে, কম্পোজিট করার প্রসেসটি GPU-কে সমস্ত কম্পিউটেশন করতে দেওয়ার চেয়ে কম পাওয়ার খরচ করে।
Hardware Composer HAL বাকি অর্ধেক কাজ করে এবং এটি সব Android গ্রাফিক্স রেন্ডারিংয়ের কেন্দ্রবিন্দু। HWC-কে অবশ্যই ইভেন্ট, সাপোর্ট করতে হবে, যার মধ্যে একটি হল VSync (অন্যটি হল প্লাগ-অ্যান্ড-প্লে HDMI সহায়তার জন্য হটপ্লাগ)।
Gralloc
ইমেজ প্রডিউসারদের অনুরোধ করা মেমরি অ্যালোকেট করার জন্য গ্রাফিক মেমরি অ্যালোকেটর (Gralloc) প্রয়োজন। আরও বিবরণের জন্য, BufferQueue ও Gralloc দেখুন।
ডেটা ফ্লো
নিচের ডায়াগ্রামে Android গ্রাফিক্স পাইপলাইন দেখানো হয়েছে:

ছবি ২. Android-এর মাধ্যমে গ্রাফিক ডেটা ফ্লো।
বাঁদিকে থাকা অবজেক্ট হল রেন্ডারার যা গ্রাফিক্স বাফার তৈরি করে, যেমন হোম স্ক্রিন, স্ট্যাটাস বার ও সিস্টেম UI. SurfaceFlinger হল কম্পোজিটর এবং HWC হল কম্পোজার।
BufferQueue
BufferQueues Android গ্রাফিক্স কম্পোনেন্টগুলির মধ্যে সংযোগ স্থাপন করে। এগুলি দুটি সারির একটি পেয়ার যা প্রডিউসার থেকে কনজিউমার পর্যন্ত বাফারগুলির অবিরাম চক্রকে মধ্যস্থতা করে। প্রযোজকরা তাদের বাফার হ্যান্ড-অফ করার পরে, ডিসপ্লেতে সবকিছু কম্পোজিট করার দায়িত্ব SurfaceFlinger-এর।
নিম্নলিখিত ডায়াগ্রাম BufferQueue কমিউনিকেশন প্রসেস ব্যাখ্যা করে:

ছবি ৩. BufferQueue কমিউনিকেশন প্রসেস।
BufferQueue-এ এমন যুক্তি থাকে যা ইমেজ স্ট্রিম প্রডিউসার ও ইমেজ স্ট্রিম কনজিউমারকে একসাথে বেঁধে রাখে। ক্যামেরা HAL বা OpenGL ES গেমের তৈরি করা ক্যামেরা প্রিভিউ হল ইমেজ প্রডিউসারের কিছু উদাহরণ। SurfaceFlinger বা OpenGL ES স্ট্রিম দেখায় এমন অন্য কোনও অ্যাপ হল ইমেজ কনজিউমারের কিছু উদাহরণ, যেমন ক্যামেরা অ্যাপ ক্যামেরা ভিউফাইন্ডার দেখায়।
BufferQueue হল একটি ডেটা স্ট্রাকচার যা একটি বাফার পুলকে একটি সারির সাথে একত্রিত করে এবং
প্রসেসের মধ্যে বাফার পাস করার জন্য Binder ইন্টার-প্রসেস কমিউনিকেশন (IPC) ব্যবহার করে। প্রডিউসার ইন্টারফেস বা
আপনি গ্রাফিক বাফার তৈরি করতে চান এমন কাউকে যা পাস করেন, তা হল
IGraphicBufferProducer (SurfaceTexture-এর অংশ)।
অন্যান্য কাজের মধ্যে, BufferQueue প্রায়ই কোনও সারফেসে রেন্ডার করতে এবং GL
Consumer-এর সাথে ব্যবহার করতে ব্যবহৃত হয়।
BufferQueue তিনটি আলাদা মোডে কাজ করতে পারে:
এই কাজের বেশিরভাগ পরিচালনা করতে, SurfaceFlinger ঠিক অন্য OpenGL ES ক্লায়েন্টের মতো কাজ করে। তাই SurfaceFlinger যখন সক্রিয়ভাবে একটি বা দুটি বাফারকে কম্পোজিট করে তৃতীয় একটি বাফার তৈরি করে, যেমন, এটি OpenGL ES ব্যবহার করছে।
Hardware Composer HAL বাকি অর্ধেক কাজ করে। এই HAL, সব Android গ্রাফিক্স রেন্ডারিংয়ের জন্য সেন্ট্রাল পয়েন্ট হিসেবে কাজ করে।