গ্রাফিক্স,গ্রাফিক্স,গ্রাফিক্স,গ্রাফিক্স

অ্যান্ড্রয়েড গ্রাফিক্স HAL আইকন

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

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

অ্যাপ ডেভেলপাররা তিনটি উপায়ে স্ক্রিনে ছবি আঁকেন: Canvas , OpenGL ES বা Vulkan ব্যবহার করে।

অ্যান্ড্রয়েড গ্রাফিক্স উপাদান

ডেভেলপাররা যে রেন্ডারিং এপিআই-ই ব্যবহার করুক না কেন, সবকিছু একটি সারফেসের উপর রেন্ডার করা হয়। এই সারফেসটি একটি বাফার কিউ-এর প্রডিউসার সাইডকে প্রতিনিধিত্ব করে, যা প্রায়শই সারফেসফ্লিঙ্গার দ্বারা ব্যবহৃত হয়। অ্যান্ড্রয়েড প্ল্যাটফর্মে তৈরি প্রতিটি উইন্ডো একটি সারফেস দ্বারা সমর্থিত থাকে। রেন্ডার করা সমস্ত দৃশ্যমান সারফেস সারফেসফ্লিঙ্গার দ্বারা ডিসপ্লেতে কম্পোজিট করা হয়।

নিম্নলিখিত চিত্রটি দেখায় কিভাবে মূল উপাদানগুলো একসাথে কাজ করে:

চিত্র রেন্ডারিং উপাদান

চিত্র ১. পৃষ্ঠতলসমূহ যেভাবে রেন্ডার করা হয়।

প্রধান উপাদানগুলো নিম্নলিখিত বিভাগগুলিতে বর্ণনা করা হয়েছে।

ইমেজ স্ট্রিম প্রযোজক

একটি ইমেজ স্ট্রিম প্রডিউসার এমন যেকোনো কিছু হতে পারে যা ব্যবহারের জন্য গ্রাফিক বাফার তৈরি করে। উদাহরণস্বরূপ, OpenGL ES, Canvas 2D, এবং মিডিয়াসার্ভার ভিডিও ডিকোডার।

ইমেজ স্ট্রিম গ্রাহকরা

ইমেজ স্ট্রিমের সবচেয়ে সাধারণ গ্রাহক হলো সারফেসফ্লিঙ্গার (SurfaceFlinger), যা একটি সিস্টেম সার্ভিস। এটি উইন্ডো ম্যানেজার (Window Manager) থেকে প্রাপ্ত তথ্য ব্যবহার করে বর্তমানে দৃশ্যমান সারফেসগুলো গ্রহণ করে এবং সেগুলোকে ডিসপ্লেতে কম্পোজিট করে। সারফেসফ্লিঙ্গারই একমাত্র সার্ভিস যা ডিসপ্লের বিষয়বস্তু পরিবর্তন করতে পারে। সারফেসফ্লিঙ্গার একগুচ্ছ সারফেস কম্পোজ করার জন্য ওপেনজিএল (OpenGL) এবং হার্ডওয়্যার কম্পোজার (HWC) ব্যবহার করে।

অন্যান্য OpenGL ES অ্যাপও ইমেজ স্ট্রিম ব্যবহার করতে পারে, যেমন ক্যামেরা অ্যাপ ক্যামেরা প্রিভিউ ইমেজ স্ট্রিম ব্যবহার করে। নন-জিএল অ্যাপও ব্যবহারকারী হতে পারে, উদাহরণস্বরূপ ImageReader ক্লাস।

হার্ডওয়্যার কম্পোজার

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

হার্ডওয়্যার কম্পোজার (HAL) বাকি অর্ধেক কাজ সম্পন্ন করে এবং এটি সমস্ত অ্যান্ড্রয়েড গ্রাফিক্স রেন্ডারিংয়ের কেন্দ্রবিন্দু। HWC-কে অবশ্যই ইভেন্ট সমর্থন করতে হবে, যার মধ্যে একটি হলো VSync (আরেকটি হলো প্লাগ-এন্ড-প্লে HDMI সমর্থনের জন্য হটপ্লাগ)।

গ্র্যালক

ইমেজ প্রডিউসারদের অনুরোধ করা মেমরি বরাদ্দ করার জন্য গ্রাফিক্স মেমরি অ্যালোকেটর (Gralloc) প্রয়োজন হয়। বিস্তারিত জানতে BufferQueue এবং Gralloc দেখুন।

ডেটা প্রবাহ

নিম্নলিখিত ডায়াগ্রামটি অ্যান্ড্রয়েড গ্রাফিক্স পাইপলাইনকে চিত্রিত করে:

গ্রাফিক্স ডেটা প্রবাহ

চিত্র ২. অ্যান্ড্রয়েডের মাধ্যমে গ্রাফিক ডেটা প্রবাহ।

বাম দিকের অবজেক্টগুলো হলো রেন্ডারার, যা গ্রাফিক্স বাফার তৈরি করে, যেমন হোম স্ক্রিন, স্ট্যাটাস বার এবং সিস্টেম UI। সারফেসফ্লিঙ্গার হলো কম্পোজিটর এবং HWC হলো কম্পোজার।

বাফারকিউ

বাফারকিউ (BufferQueues) অ্যান্ড্রয়েড গ্রাফিক্স উপাদানগুলোর মধ্যে সংযোগ স্থাপন করে। এগুলো হলো একজোড়া কিউ, যা প্রডিউসার থেকে কনজিউমারের কাছে বাফারের অবিরাম আবর্তনকে মধ্যস্থতা করে। প্রডিউসাররা তাদের বাফার হস্তান্তর করার পর, ডিসপ্লেতে সবকিছু কম্পোজিট করার দায়িত্ব সারফেসফ্লিঙ্গারের (SurfaceFlinger) ওপর বর্তায়।

নিম্নলিখিত ডায়াগ্রামটি বাফারকিউ (BufferQueue) যোগাযোগ প্রক্রিয়াটি ব্যাখ্যা করে:

বাফারকিউ যোগাযোগ প্রক্রিয়া

চিত্র ৩. বাফারকিউ যোগাযোগ প্রক্রিয়া।

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

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

বাফারকিউ তিনটি ভিন্ন মোডে কাজ করতে পারে:

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

এই কাজের বেশিরভাগটা সম্পন্ন করার জন্য, সারফেসফ্লিঙ্গার আর দশটা সাধারণ ওপেনজিএল ইএস ক্লায়েন্টের মতোই কাজ করে। তাই, উদাহরণস্বরূপ, যখন সারফেসফ্লিঙ্গার সক্রিয়ভাবে এক বা দুটি বাফারকে একত্রিত করে তৃতীয় একটি বাফার তৈরি করে, তখন এটি ওপেনজিএল ইএস ব্যবহার করে।

হার্ডওয়্যার কম্পোজার HAL বাকি অর্ধেক কাজ সম্পন্ন করে। এই HAL সমস্ত অ্যান্ড্রয়েড গ্রাফিক্স রেন্ডারিংয়ের কেন্দ্রীয় বিন্দু হিসেবে কাজ করে।

, অ্যান্ড্রয়েড গ্রাফিক্স HAL আইকন

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

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

অ্যাপ ডেভেলপাররা তিনটি উপায়ে স্ক্রিনে ছবি আঁকেন: Canvas , OpenGL ES বা Vulkan ব্যবহার করে।

অ্যান্ড্রয়েড গ্রাফিক্স উপাদান

ডেভেলপাররা যে রেন্ডারিং এপিআই-ই ব্যবহার করুক না কেন, সবকিছু একটি সারফেসের উপর রেন্ডার করা হয়। এই সারফেসটি একটি বাফার কিউ-এর প্রডিউসার সাইডকে প্রতিনিধিত্ব করে, যা প্রায়শই সারফেসফ্লিঙ্গার দ্বারা ব্যবহৃত হয়। অ্যান্ড্রয়েড প্ল্যাটফর্মে তৈরি প্রতিটি উইন্ডো একটি সারফেস দ্বারা সমর্থিত থাকে। রেন্ডার করা সমস্ত দৃশ্যমান সারফেস সারফেসফ্লিঙ্গার দ্বারা ডিসপ্লেতে কম্পোজিট করা হয়।

নিম্নলিখিত চিত্রটি দেখায় কিভাবে মূল উপাদানগুলো একসাথে কাজ করে:

চিত্র রেন্ডারিং উপাদান

চিত্র ১. পৃষ্ঠতলসমূহ যেভাবে রেন্ডার করা হয়।

প্রধান উপাদানগুলো নিম্নলিখিত বিভাগগুলিতে বর্ণনা করা হয়েছে।

ইমেজ স্ট্রিম প্রযোজক

একটি ইমেজ স্ট্রিম প্রডিউসার এমন যেকোনো কিছু হতে পারে যা ব্যবহারের জন্য গ্রাফিক বাফার তৈরি করে। উদাহরণস্বরূপ, OpenGL ES, Canvas 2D, এবং মিডিয়াসার্ভার ভিডিও ডিকোডার।

ইমেজ স্ট্রিম গ্রাহকরা

ইমেজ স্ট্রিমের সবচেয়ে সাধারণ গ্রাহক হলো সারফেসফ্লিঙ্গার (SurfaceFlinger), যা একটি সিস্টেম সার্ভিস। এটি উইন্ডো ম্যানেজার (Window Manager) থেকে প্রাপ্ত তথ্য ব্যবহার করে বর্তমানে দৃশ্যমান সারফেসগুলো গ্রহণ করে এবং সেগুলোকে ডিসপ্লেতে কম্পোজিট করে। সারফেসফ্লিঙ্গারই একমাত্র সার্ভিস যা ডিসপ্লের বিষয়বস্তু পরিবর্তন করতে পারে। সারফেসফ্লিঙ্গার একগুচ্ছ সারফেস কম্পোজ করার জন্য ওপেনজিএল (OpenGL) এবং হার্ডওয়্যার কম্পোজার (HWC) ব্যবহার করে।

অন্যান্য OpenGL ES অ্যাপও ইমেজ স্ট্রিম ব্যবহার করতে পারে, যেমন ক্যামেরা অ্যাপ ক্যামেরা প্রিভিউ ইমেজ স্ট্রিম ব্যবহার করে। নন-জিএল অ্যাপও ব্যবহারকারী হতে পারে, উদাহরণস্বরূপ ImageReader ক্লাস।

হার্ডওয়্যার কম্পোজার

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

হার্ডওয়্যার কম্পোজার (HAL) বাকি অর্ধেক কাজ সম্পন্ন করে এবং এটি সমস্ত অ্যান্ড্রয়েড গ্রাফিক্স রেন্ডারিংয়ের কেন্দ্রবিন্দু। HWC-কে অবশ্যই ইভেন্ট সমর্থন করতে হবে, যার মধ্যে একটি হলো VSync (আরেকটি হলো প্লাগ-এন্ড-প্লে HDMI সমর্থনের জন্য হটপ্লাগ)।

গ্র্যালক

ইমেজ প্রডিউসারদের অনুরোধ করা মেমরি বরাদ্দ করার জন্য গ্রাফিক্স মেমরি অ্যালোকেটর (Gralloc) প্রয়োজন হয়। বিস্তারিত জানতে BufferQueue এবং Gralloc দেখুন।

ডেটা প্রবাহ

নিম্নলিখিত ডায়াগ্রামটি অ্যান্ড্রয়েড গ্রাফিক্স পাইপলাইনকে চিত্রিত করে:

গ্রাফিক্স ডেটা প্রবাহ

চিত্র ২. অ্যান্ড্রয়েডের মাধ্যমে গ্রাফিক ডেটা প্রবাহ।

বাম দিকের অবজেক্টগুলো হলো রেন্ডারার, যা গ্রাফিক্স বাফার তৈরি করে, যেমন হোম স্ক্রিন, স্ট্যাটাস বার এবং সিস্টেম UI। সারফেসফ্লিঙ্গার হলো কম্পোজিটর এবং HWC হলো কম্পোজার।

বাফারকিউ

বাফারকিউ (BufferQueues) অ্যান্ড্রয়েড গ্রাফিক্স উপাদানগুলোর মধ্যে সংযোগ স্থাপন করে। এগুলো হলো একজোড়া কিউ, যা প্রডিউসার থেকে কনজিউমারের কাছে বাফারের অবিরাম আবর্তনকে মধ্যস্থতা করে। প্রডিউসাররা তাদের বাফার হস্তান্তর করার পর, ডিসপ্লেতে সবকিছু কম্পোজিট করার দায়িত্ব সারফেসফ্লিঙ্গারের (SurfaceFlinger) ওপর বর্তায়।

নিম্নলিখিত ডায়াগ্রামটি বাফারকিউ (BufferQueue) যোগাযোগ প্রক্রিয়াটি ব্যাখ্যা করে:

বাফারকিউ যোগাযোগ প্রক্রিয়া

চিত্র ৩. বাফারকিউ যোগাযোগ প্রক্রিয়া।

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

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

বাফারকিউ তিনটি ভিন্ন মোডে কাজ করতে পারে:

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

এই কাজের বেশিরভাগটা সম্পন্ন করার জন্য, সারফেসফ্লিঙ্গার আর দশটা সাধারণ ওপেনজিএল ইএস ক্লায়েন্টের মতোই কাজ করে। তাই, উদাহরণস্বরূপ, যখন সারফেসফ্লিঙ্গার সক্রিয়ভাবে এক বা দুটি বাফারকে একত্রিত করে তৃতীয় একটি বাফার তৈরি করে, তখন এটি ওপেনজিএল ইএস ব্যবহার করে।

হার্ডওয়্যার কম্পোজার HAL বাকি অর্ধেক কাজ সম্পন্ন করে। এই HAL সমস্ত অ্যান্ড্রয়েড গ্রাফিক্স রেন্ডারিংয়ের কেন্দ্রীয় বিন্দু হিসেবে কাজ করে।