গ্র্যাফিক

Android Graphics HAL আইকন

Android ফ্রেমওয়ার্ক 2D ও 3D-এর জন্য বিভিন্ন ধরনের গ্রাফিক্স রেন্ডারিং API অফার করে যা গ্রাফিক্স ড্রাইভারের প্রস্তুতকারক ইমপ্লিমেন্টেশনের সাথে ইন্টার‍্যাক্ট করে, তাই সেইসব API কীভাবে উচ্চ স্তরে কাজ করে সেই বিষয়ে ভালো ধারণা থাকা গুরুত্বপূর্ণ। এই পৃষ্ঠায় গ্রাফিক্স হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) সম্পর্কে বলা হয়েছে যেটির উপর ভিত্তি করে এইসব ড্রাইভার তৈরি করা হয়েছে। এই বিভাগটি নিয়ে এগিয়ে যাওয়ার আগে, নিম্নলিখিত শব্দগুলির সাথে নিজেকে পরিচিত করুন:

ক্যানভাস (সাধারণ শব্দ), Canvas (API এলিমেন্ট)
ক্যানভাস হল এমন একটি ড্রয়িং সারফেস যা বিটম্যাপ বা Surface অবজেক্টের বিপরীতে আসল বিট কম্পোজিট করা ম্যানেজ করে। Canvas ক্লাসে বিটম্যাপ, লাইন, বৃত্ত, আয়তক্ষেত্র, টেক্সট ইত্যাদি স্ট্যান্ডার্ড কম্পিউটার ড্রয়িংয়ের জন্য পদ্ধতি আছে এবং এটি বিটম্যাপ বা সারফেসের সাথে যুক্ত। ক্যানভাস হল স্ক্রিনে 2D অবজেক্ট আঁকার সবচেয়ে সহজ ও সরল উপায়। বেস ক্লাস হল Canvas.
অঙ্কনযোগ্য
ড্রয়েবল হল কম্পাইল করা ভিজ্যুয়াল রিসোর্স যা ব্যাকগ্রাউন্ড, শীর্ষক বা স্ক্রিনের অন্যান্য অংশ হিসেবে ব্যবহার করা যেতে পারে। ড্রয়েবল সাধারণত অন্য UI এলিমেন্টে লোড করা হয়, যেমন ব্যাকগ্রাউন্ড ছবি হিসেবে। ড্রয়েবল ইভেন্ট গ্রহণ করতে পারে না, তবে অ্যানিমেশন অবজেক্ট বা ইমেজ লাইব্রেরির মতো সাবক্লাস চালু করতে, স্টেট ও শিডিউলিংয়ের মতো বিভিন্ন প্রপার্টি অ্যাসাইন করে। ড্রয়েবল রিসোর্স ফাইল থেকে অনেক ড্রয়েবল অবজেক্ট লোড করা হয় — XML বা বিটম্যাপ ফাইল যা ছবিকে বর্ণনা করে। ড্রয়েবল রিসোর্স android.graphics.drawable-এর সাবক্লাসে কম্পাইল করা হয়। ড্রয়েবল ও অন্যান্য রিসোর্স সম্পর্কে আরও জানতে, অ্যাপ রিসোর্সের ওভারভিউ দেখুন।
লেআউট রিসোর্স
লেআউট রিসোর্স হল একটি XML ফাইল যা অ্যাক্টিভিটি স্ক্রিনের লেআউট বর্ণনা করে। আরও তথ্যের জন্য, লেআউট রিসোর্স দেখুন।
নাইন-প্যাচ (9-প্যাচ, NinePatch)
নাইন-প্যাচ হল একটি রিসাইজ করা যায় এমন বিটম্যাপ রিসোর্স যা ডিভাইসে ব্যাকগ্রাউন্ড বা অন্যান্য ছবির জন্য ব্যবহার করা যেতে পারে। আরও তথ্যের জন্য, Nine-patch দেখুন।
OpenGL ES
OpenGL ES হল 2D ও 3D গ্রাফিক্স রেন্ডার করার জন্য একটি ক্রস-প্ল্যাটফর্ম API। Android, হার্ডওয়্যার-অ্যাক্সিলারেটেড 3D রেন্ডারিংয়ের জন্য OpenGL ES লাইব্রেরি প্রদান করে। 2D রেণ্ডারিংয়ের জন্য, ক্যানভাস হল আরও সহজ বিকল্প। OpenGL ES Android নেটিভ ডেভেলপমেন্ট কিটে (NDK) উপলভ্য। android.opengl এবং javax.microedition.khronos.opengles প্যাকেজ OpenGL ES কার্যকারিতা এক্সপোজ করে।
সারফেস (সাধারণ শব্দ), Surface (API এলিমেন্ট)
সারফেস হল মেমরির একটি ব্লক যা স্ক্রিনে কম্পোজিট করা হয়। ড্রয়িংয়ের জন্য সারফেস ক্যানভাস হোল্ড করে এবং লেয়ার আঁকতে ও Surface অবজেক্টের সাইজ পরিবর্তন করতে বিভিন্ন হেল্পার পদ্ধতি প্রদান করে। সরাসরি Surface ক্লাস ব্যবহার করার পরিবর্তে SurfaceView ক্লাস ব্যবহার করুন।
সারফেস ভিউ (সাধারণ শব্দ), SurfaceView (API এলিমেন্ট)
সারফেস ভিউ হল একটি View অবজেক্ট যা ড্রয়িংয়ের জন্য একটি Surface অবজেক্টকে র‍্যাপ করে এবং এর সাইজ ও ফর্ম্যাট ডাইনামিক নির্দিষ্ট করার পদ্ধতি প্রকাশ করে। সারফেস ভিউ, UI থ্রেড থেকে আলাদাভাবে ড্র করার একটি উপায় প্রদান করে এটি গেম বা ক্যামেরা প্রিভিউয়ের মতো রিসোর্স-ইনটেনসিভ অপারেশনের জন্য ব্যবহার করা হয়, কিন্তু এর ফলে অতিরিক্ত মেমরি ব্যবহার হয়। সারফেস ভিউ ক্যানভাস ও OpenGL ES গ্রাফিক্স, দু'টিই সাপোর্ট করে। SurfaceView অবজেক্টের মূল ক্লাস হল SurfaceView।
থিম
থিম হল প্রপার্টির একটি সেট, যেমন টেক্সটের সাইজ ও ব্যাকগ্রাউন্ড কালার, যা বিভিন্ন ডিফল্ট ডিসপ্লে সেটিংস নির্ধারণ করতে একসাথে বান্ডেল করা হয়। Android কয়েকটি স্ট্যান্ডার্ড থিম প্রদান করে, যা R.style -এ তালিকাভুক্ত এবং Theme_ দিয়ে শুরু হয়।
ভিউ (সাধারণ শব্দ), View (API এলিমেন্ট)
ভিউ স্ক্রিনে একটি আয়তক্ষেত্রাকার এলাকা আঁকে এবং ক্লিক, কিস্ট্রোক এবং অন্যান্য ইন্টার‍্যাকশন ইভেন্ট ম্যানেজ করে। View ক্লাস হল অ্যাক্টিভিটি বা ডায়ালগ স্ক্রিনের বেশিরভাগ লেআউট কম্পোনেন্টের মূল ক্লাস, যেমন টেক্সট বক্স ও উইন্ডো। একটি View অবজেক্ট তার পেরেন্ট অবজেক্ট (দেখুন ViewGroup) থেকে নিজেকে আঁকার জন্য কল রিসিভ করে এবং তার পেরেন্ট অবজেক্টকে তার পছন্দের সাইজ এবং লোকেশন সম্পর্কে জানায়, যা পেরেন্ট সম্মান নাও করতে পারে। আরও তথ্যের জন্য, View দেখুন।
ভিউ গ্রুপ (সাধারণ শব্দ), ViewGroup (API এলিমেন্ট)
ভিউ গ্রুপ, চাইল্ড ভিউয়ের সেটকে গ্রুপ করে। চাইল্ড ভিউ কোথায় পজিশন করা হবে এবং সেগুলি কত বড় হতে পারে তা নির্ধারণ করার দায়িত্ব ভিউ গ্রুপের। এছাড়াও, উপযুক্ত হলে প্রতিটি ভিউকে নিজেকে ড্র করার জন্য কল করার দায়িত্বও ভিউ গ্রুপের। কিছু ভিউ গ্রুপ দেখা যায় না এবং সেগুলি শুধুমাত্র লেআউটের জন্য, অন্যদিকে অন্যগুলিতে একটি অন্তর্নিহিত UI থাকে, যেমন একটি স্ক্রল করা তালিকা বক্স। ভিউ গ্রুপ android.widget প্যাকেজে আছে, তবে ViewGroup ক্লাসকে এক্সটেন্ড করে।
ভিউ হায়ারার্কি
ভিউ হায়ারার্কি হল ভিউ ও ভিউ গ্রুপ অবজেক্টের এমন একটি ব্যবস্থা যা কোনও অ্যাপের প্রতিটি কম্পোনেন্টের জন্য ইউজার ইন্টারফেসকে সংজ্ঞায়িত করে। হায়ারার্কিতে ভিউ গ্রুপ থাকে যার মধ্যে এক বা একাধিক চাইল্ড ভিউ বা ভিউ গ্রুপ থাকে। Android SDK-এর সাথে দেওয়া Hierarchy Viewer ব্যবহার করে আপনি ডিবাগিং ও অপ্টিমাইজেশনের জন্য ভিউ হায়ারার্কির ভিজ্যুয়াল উপস্থাপনা পেতে পারেন।
Vulkan
Vulkan হল হাই-পারফর্ম্যান্স 3D গ্রাফিক্সের জন্য একটি লো-ওভারহেড ক্রস-প্ল্যাটফর্ম API।
উইজেট
উইজেট হল সম্পূর্ণভাবে প্রয়োগ করা ভিউ সাবক্লাসের একটি সেট যা ফর্ম এলিমেন্ট এবং অন্যান্য UI কম্পোনেন্ট, যেমন টেক্সট বক্স বা পপ-আপ মেনু রেন্ডার করে। কারণ, উইজেট সম্পূর্ণভাবে প্রয়োগ করা হয়েছে, এটি নিজেই পরিমাপ করা, আঁকা এবং স্ক্রিন ইভেন্টে প্রতিক্রিয়া জানানো ম্যানেজ করে। উইজেটগুলি android.widget প্যাকেজে আছে।
উইন্ডো (সাধারণ শব্দ), Window (API এলিমেন্ট)
Android অ্যাপে, উইন্ডো হল এমন একটি অবজেক্ট যা 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 কমিউনিকেশন প্রসেস।

BufferQueue-এ এমন যুক্তি থাকে যা ইমেজ স্ট্রিম প্রডিউসার ও ইমেজ স্ট্রিম কনজিউমারকে একসাথে বেঁধে রাখে। ক্যামেরা HAL বা OpenGL ES গেমের তৈরি করা ক্যামেরা প্রিভিউ হল ইমেজ প্রডিউসারের কিছু উদাহরণ। SurfaceFlinger বা OpenGL ES স্ট্রিম দেখায় এমন অন্য কোনও অ্যাপ হল ইমেজ কনজিউমারের কিছু উদাহরণ, যেমন ক্যামেরা অ্যাপ ক্যামেরা ভিউফাইন্ডার দেখায়।

BufferQueue হল একটি ডেটা স্ট্রাকচার যা একটি বাফার পুলকে একটি সারির সাথে একত্রিত করে এবং প্রসেসের মধ্যে বাফার পাস করার জন্য Binder ইন্টার-প্রসেস কমিউনিকেশন (IPC) ব্যবহার করে। প্রডিউসার ইন্টারফেস বা আপনি গ্রাফিক বাফার তৈরি করতে চান এমন কাউকে যা পাস করেন, তা হল IGraphicBufferProducer (SurfaceTexture-এর অংশ)। অন্যান্য কাজের মধ্যে, BufferQueue প্রায়ই কোনও সারফেসে রেন্ডার করতে এবং GL Consumer-এর সাথে ব্যবহার করতে ব্যবহৃত হয়।

BufferQueue তিনটি আলাদা মোডে কাজ করতে পারে:

সিনক্রোনাস-লাইক মোড
BufferQueue সাধারণত সিনক্রোনাস-লাইক মোডে কাজ করে, যেখানে প্রযোজকের থেকে আসা প্রতিটি বাফার গ্রাহকের কাছে যায়। এই মোডে কোনও বাফার কখনও বাতিল করা হয় না। আর যদি প্রডিউসার খুব দ্রুত বাফার তৈরি করে, তাহলে তা খালি হওয়ার আগেই ব্লক হয়ে যায় এবং বাফার খালি হওয়ার জন্য অপেক্ষা করে।
নন-ব্লকিং মোড
এছাড়াও, BufferQueue নন-ব্লকিং মোডে কাজ করতে পারে যেখানে এটি সেইসব ক্ষেত্রে বাফারের জন্য অপেক্ষা করার পরিবর্তে একটি সমস্যা তৈরি করে। এই মোডে কোনও বাফার কখনও বাতিল করা হয় না। এটি অ্যাপ্লিকেশন সফ্টওয়্যারে সম্ভাব্য ডেডলক এড়াতে সহায়ক, যা গ্রাফিক্স ফ্রেমওয়ার্কের জটিল নির্ভরতা বুঝতে নাও পারে।
ডিসকার্ড মোড
BufferQueue-কে পুরনো বাফার বাতিল করার জন্য কনফিগার করা হতে পারে যাতে সমস্যা তৈরি না হয় বা অপেক্ষা করতে না হয়। যেমন, টেক্সচার ভিউতে GL রেন্ডারিং করা এবং যত দ্রুত সম্ভব ড্র করার সময় বাফার ড্রপ করতে হবে।

এই কাজের বেশিরভাগ পরিচালনা করতে, SurfaceFlinger ঠিক অন্য OpenGL ES ক্লায়েন্টের মতো কাজ করে। তাই SurfaceFlinger যখন সক্রিয়ভাবে একটি বা দুটি বাফারকে কম্পোজিট করে তৃতীয় একটি বাফার তৈরি করে, যেমন, এটি OpenGL ES ব্যবহার করছে।

Hardware Composer HAL বাকি অর্ধেক কাজ করে। এই HAL, সব Android গ্রাফিক্স রেন্ডারিংয়ের জন্য সেন্ট্রাল পয়েন্ট হিসেবে কাজ করে।