CPU Rendering (সফ্টওয়্যার রেন্ডারিং) হল GPU ব্যবহার না করে কেন্দ্রীয় প্রসেসর দ্বারা চিত্র গঠনের প্রক্রিয়া। এই মোডে, ট্রান্সফর্মেশন, রাস্টারাইজেশন এবং টেক্সচারিংয়ের সমস্ত গণনা গ্রাফিক্স পাইপলাইনের পরিবর্তে সফ্টওয়্যার অ্যালগরিদমের মাধ্যমে CPU-তে সম্পাদিত হয়। Apple Developer Documentation (2025) অনুসারে, GPU কনটেক্সট আরম্ভ করার আগে অ্যাপ্লিকেশন চালু করার সময় 100% ক্ষেত্রে সফ্টওয়্যার রেন্ডারিং ব্যবহার করা হয় এবং iOS-এ UI ফ্রেমওয়ার্কের জন্য এটি প্রাথমিক মোড হিসেবে রয়ে গেছে। ডেভেলপাররা সামঞ্জস্যতা এবং নির্ধারকতার জন্য গুরুত্বপূর্ণ কাজের জন্য CPU Rendering বেছে নেন।
মূল বিষয়
CPU Rendering একটি চিত্র গঠন পদ্ধতি যেখানে গ্রাফিক্স পাইপলাইনের সমস্ত ধাপ গাণিতিক গণনার মাধ্যমে কেন্দ্রীয় প্রসেসরে সম্পাদিত হয়। GPU-র বিপরীতে, যেখানে রাস্টারাইজেশন এবং টেক্সচারিং বিশেষায়িত ব্লকে নির্মিত, CPU সেগুলি সর্বজনীন SSE/NEON নির্দেশের মাধ্যমে সম্পাদন করে।
ঐতিহাসিকভাবে, সমস্ত রেন্ডারিং সফ্টওয়্যার-ভিত্তিক ছিল — প্রথম গ্রাফিকাল ইন্টারফেস (Xerox Alto, 1973) এবং 3D গেম (Quake, 1996) CPU-তে রেন্ডার হতো। “software renderer” শব্দটি CPU Rendering-এর প্রতিশব্দ হয়ে ওঠে। 1990-এর দশকের শেষে সাশ্রয়ী 3D এক্সেলেরেটর আসার সাথে সাথে হার্ডওয়্যার ত্বরণে রূপান্তর শুরু হয়, কিন্তু সফ্টওয়্যার রেন্ডারিং ফলব্যাক পদ্ধতি হিসেবে টিকে থাকে।
Akamai (2025) অনুসারে, CPU Rendering 35% মোবাইল ওয়েব সেশনে প্রাথমিক রেন্ডারিং মোড হিসেবে ব্যবহৃত হয় — দুর্বল ডিভাইসে, এমুলেটরে এবং GPU ত্বরণ বন্ধ থাকলে। iOS এবং Android প্ল্যাটফর্মে, UI ফ্রেমওয়ার্ক (UIKit, Android View) GPU কমান্ড আরম্ভ করার আগে প্রথম কয়েকটি ফ্রেম সবসময় CPU-তে রেন্ডার করে।
আধুনিক প্রসেসর SIMD নির্দেশ (SSE4.2, AVX-512, ARM NEON) সমর্থন করে, যা আংশিকভাবে GPU সমান্তরালতা অনুকরণ করে। তবে, ভৌত কোরের সংখ্যা (4–12) এবং বিশেষায়িত রাস্টারাইজেশন ব্লকের অভাব জটিল গ্রাফিক্সে CPU Rendering কর্মক্ষমতা সীমিত করে।
সফ্টওয়্যার পাইপলাইন হার্ডওয়্যারের মতো একই ধাপ অন্তর্ভুক্ত করে: ভার্টেক্স ট্রান্সফর্মেশন, ক্লিপিং, রাস্টারাইজেশন, টেক্সচারিং এবং পিক্সেল আউটপুট। পার্থক্য হল প্রতিটি ধাপ ফিক্সড GPU ব্লকের পরিবর্তে C++ বা অ্যাসেম্বলি কোড এর মাধ্যমে সফ্টওয়্যারে বাস্তবায়িত হয়।
CPU Rendering-এ ভার্টেক্স ট্রান্সফর্মেশন ম্যাট্রিক্স গুণনের মাধ্যমে সম্পাদিত হয় — প্রজেকশন এবং মডেলিংয়ের জন্য 4x4। 10,000 পলিগন সহ, এটি প্রতি ফ্রেমে 40,000 ভেক্টর গুণন — একটি ভার যা CPU অপ্টিমাইজড কোড সহ 5–10 ms-এ সামলায়। রাস্টারাইজেশন সবচেয়ে ভারী ধাপ, যার জন্য প্রতিটি ত্রিভুজের জন্য পিক্সেল কভারেজ গণনা প্রয়োজন।
মোবাইল প্রসেসরে, ARM NEON 128-বিট প্রশস্ত ভেক্টর নির্দেশের মাধ্যমে সফ্টওয়্যার রেন্ডারিং ত্বরান্বিত করে। ARM (2025) অনুসারে, একটি NEON-অপ্টিমাইজড সফ্টওয়্যার রেন্ডারার একই ক্লক ফ্রিকোয়েন্সিতে Cortex-X4-এ স্কেলার বাস্তবায়নের চেয়ে 3–4 গুণ দ্রুত চলে।
সফ্টওয়্যার রেন্ডারিং CPU-তে দৃশ্য প্রস্তুত করার মাধ্যমে শুরু হয়: জ্যামিতি (ভার্টেক্স, পলিগন) ম্যাট্রিক্স অপারেশনের মাধ্যমে বিশ্ব স্থানাঙ্ক থেকে পর্দা স্থানাঙ্কে রূপান্তরিত হয়। তারপর ক্লিপিং সম্পাদিত হয় — ক্যামেরার দৃশ্যক্ষেত্রের বাইরের জ্যামিতি অপসারণ।
CPU রাস্টারাইজেশন স্ক্যানলাইন অ্যালগরিদম বা ব্যারিসেন্ট্রিক স্থানাঙ্কের মাধ্যমে প্রতিটি ত্রিভুজকে পিক্সেলে বিভক্ত করে। প্রতিটি পিক্সেলের জন্য, টেক্সচার, আলোক এবং স্বচ্ছতা বিবেচনা করে রঙ গণনা করা হয়। ফলাফল framebuffer-এ লেখা হয় — RAM-তে একটি পিক্সেল অ্যারে।
GPU রেন্ডারিং থেকে মূল পার্থক্য হল পিক্সেল স্তরে সমান্তরালতার অভাব। CPU পিক্সেলগুলি ক্রমান্বয়ে বা 4–8 কোরে সীমিত সমান্তরালতার সাথে প্রক্রিয়া করে। টেক্সচারিং সহ 1080p ফ্রেমের (2 মিলিয়ন পিক্সেল) জন্য, CPU-তে 15–30 ms বনাম GPU-তে 2–5 ms প্রয়োজন।
// একটি ত্রিভুজের সরলীকৃত CPU রাস্টারাইজেশন
void rasterizeTriangle(uint32_t* buffer, int width,
Vertex v0, Vertex v1, Vertex v2) {
int minX = max(0, min(v0.x, v1.x, v2.x));
int maxX = min(width, max(v0.x, v1.x, v2.x));
int minY = max(0, min(v0.y, v1.y, v2.y));
for (int y = minY; y <= maxY; y++) {
for (int x = minX; x <= maxX; x++) {
if (pixelInTriangle(x, y, v0, v1, v2)) {
buffer[y * width + x] = 0xFF3498DB;
}
}
}
}
ফাংশনটি ত্রিভুজের বাউন্ডিং বক্স স্ক্যান করে এবং ব্যারিসেন্ট্রিক স্থানাঙ্কের মাধ্যমে প্রতিটি পিক্সেল পরীক্ষা করে। লক্ষ লক্ষ পিক্সেলের জন্য, এই ধরনের লুপ CPU-তে মিলিসেকেন্ডে সম্পাদিত হয়, কিন্তু হাজার হাজার ত্রিভুজের জটিল দৃশ্যের জন্য সময় রৈখিকভাবে বৃদ্ধি পায়।
CPU Rendering এবং GPU Rendering-এর মধ্যে পার্থক্য প্রসেসর আর্কিটেকচার দ্বারা নির্ধারিত হয়। CPU শাখা পূর্বাভাস সহ অনুক্রমিক কাজের জন্য অপ্টিমাইজড, GPU হাজার হাজার থ্রেডের সাথে বৃহৎ আকারের সমান্তরালতার জন্য। এই মৌলিক পার্থক্য প্রতিটি পদ্ধতির প্রয়োগ ক্ষেত্র নির্ধারণ করে।
| প্যারামিটার | CPU Rendering | GPU Rendering |
|---|---|---|
| সমান্তরালতা | 4–12 থ্রেড | 512–4096 থ্রেড |
| FLOPS | 50–200 GFLOPS | 500–2400 GFLOPS |
| শক্তি খরচ | 2–8 W প্রতি রেন্ডারিং | 2–8 W প্রতি রেন্ডারিং |
| নির্ধারকতা | সম্পূর্ণ | ড্রাইভার-নির্ভর |
| ডিবাগিং | সহজ (GDB, LLDB) | জটিল (RenderDoc, XCode) |
| টেক্সচার | RAM-এ | ভিডিও মেমোরিতে (VRAM) |
CPU Rendering নির্ধারকতায় জেতে — একই ইনপুট ডেটা সবসময় একই আউটপুট দেয়। এটি UI ফ্রেমওয়ার্কের জন্য গুরুত্বপূর্ণ, যেখানে প্রতিটি পিক্সেল লেআউটের সাথে মিলতে হবে। GPU ড্রাইভার জুড়ে ফ্লোটিং-পয়েন্ট রাউন্ডিং পার্থক্যের কারণে ভুলত্রুটি আনতে পারে।
কম জটিলতা (100–500 প্রিমিটিভ) সহ 2D গ্রাফিক্সের জন্য, CPU Rendering প্রায়শই বাসের মাধ্যমে ডেটা স্থানান্তর এবং শেডার কম্পাইলেশনের ওভারহেডের অনুপস্থিতির কারণে GPU-র চেয়ে দ্রুত হয়। Google Android Team (2025) অনুসারে, Android-এর View সিস্টেমে সফ্টওয়্যার রেন্ডারিং একটি সাধারণ স্ক্রিনের জন্য 2–3 ms নেয়, যেখানে GPU-তে হার্ডওয়্যার ত্বরণ সহ 3–5 ms লাগে।
সফ্টওয়্যার রেন্ডারিং সেই সব পরিস্থিতিতে চাহিদায় রয়েছে যেখানে GPU উপলব্ধ নয়, অপ্রয়োজনীয় বা প্রয়োজনীয় নির্ধারকতা প্রদান করে না। আধুনিক ডেভেলপমেন্টে CPU Rendering-এর প্রধান প্রয়োগ ক্ষেত্রগুলি দেখি।
Android View সিস্টেম সমস্ত UI উপাদান CPU-তে রেন্ডার করে এবং তারপর ফলাফল GPU-তে কম্পোজিটিংয়ের জন্য পাঠায়। প্রতিটি View onDraw(Canvas) কল করে, যা CPU-র মাধ্যমে Bitmap-এ অঙ্কন করে। তার পরেই HWUI GPU-তে স্তরগুলি কম্পোজ করে। এটি GPU ড্রাইভার থেকে স্বাধীন নির্ধারক UI আচরণ নিশ্চিত করে।
iOS-এ UIKit-ও CPU রেন্ডারিং দিয়ে শুরু হয়। Core Animation CPU-তে ব্যাকিং স্টোরে CALayer রেন্ডার করে এবং তারপর GPU-তে টেক্সচার পাঠায়। WWDC 2024 অনুসারে, সফ্টওয়্যার ধাপ ফ্রেম রেন্ডারিং সময়ের 30–50% নেয়, বাকি অংশ GPU কম্পোজিটিং।
SVG রেন্ডারিং ঐতিহ্যগতভাবে CPU-তে সম্পাদিত হয় কারণ এটির জন্য জটিল বেজিয়ার বক্ররেখা তৈরি এবং পূরণ প্রয়োজন। librsvg এবং Skia-র মতো লাইব্রেরিগুলি CPU-তে SVG প্রক্রিয়া করে, বক্ররেখাগুলিকে ত্রিভুজে ভেঙে এবং পূরণ করে। Google Chrome Team (2025) অনুসারে, Skia CPU-তে আধুনিক মোবাইল প্রসেসরে SVG আইকন 0.3–1.5 ms-এ রেন্ডার করে।
PDF নথিতে জটিল নেস্টেড গ্রাফিক্স থাকে: ফন্ট, ভেক্টর উপাদান, রাস্টার ইমেজ এবং রূপান্তর। মোবাইল অ্যাপ্লিকেশনগুলি PDFKit (iOS) এবং PdfRenderer (Android) এর মতো ফ্রেমওয়ার্কের মাধ্যমে PDF CPU-তে রেন্ডার করে। প্রদর্শন নির্ভুলতা এবং PDF 2.0 মান সমর্থনের জন্য প্রতিটি উপাদানের সফ্টওয়্যার প্রক্রিয়াকরণ প্রয়োজন।
মোবাইল প্ল্যাটফর্মগুলি ARM আর্কিটেকচার এবং সীমিত শক্তি খরচ বিবেচনা করে CPU Rendering বাস্তবায়ন করে। দেখা যাক Android এবং iOS-এ সফ্টওয়্যার রেন্ডারিং কীভাবে কাজ করে।
Android Canvas হার্ডওয়্যার ত্বরণ বন্ধ থাকলে সম্পূর্ণরূপে CPU-তে কাজ করে। Canvas ক্লাসে প্রিমিটিভ অঙ্কনের পদ্ধতি রয়েছে যা Skia — Google-এর 2D লাইব্রেরি — এর মাধ্যমে সম্পাদিত হয়। Skia সফ্টওয়্যার এবং GPU ব্যাকএন্ড সমর্থন করে, hardwareAccelerated ফ্ল্যাগের ভিত্তিতে সুইচ করে।
সফ্টওয়্যার Canvas RAM-এ Bitmap তৈরি করে, Skia Software Renderer-এর মাধ্যমে এতে কমান্ড অঙ্কন করে এবং তারপর স্ক্রিনে আউটপুট করে। সমস্ত অপারেশন অপ্টিমাইজেশনের জন্য NEON নির্দেশ ব্যবহার করে CPU-তে সম্পাদিত হয়। Skia Team (2025) অনুসারে, NEON ত্বরণ ব্লেন্ড এবং মাস্কিং অপারেশনের জন্য 40–60% বৃদ্ধি দেয়।
// Bitmap-এর মাধ্যমে সফ্টওয়্যার রেন্ডারিং
val bitmap = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
val paint = Paint().apply {
color = Color.RED
textSize = 24f
}
canvas.drawText("CPU Render", 10f, 50f, paint)
imageView.setImageBitmap(bitmap)
Bitmap CPU মেমোরিতে তৈরি করা হয়, এতে অঙ্কন কমান্ড সম্পাদিত হয়, তারপর প্রস্তুত ইমেজ ImageView-এর মাধ্যমে প্রদর্শিত হয়। এই পদ্ধতিটি ওয়াটারমার্কিং, চার্ট এবং ডায়নামিক ইমেজের জন্য ব্যবহৃত হয় যেখানে প্রতিটি পিক্সেলের উপর সম্পূর্ণ নিয়ন্ত্রণ গুরুত্বপূর্ণ।
Core Graphics রাস্টার এবং ভেক্টর গ্রাফিক্সের জন্য Apple-এর ফ্রেমওয়ার্ক, যা প্রধানত CPU-তে কাজ করে। CGContext Apple-এর অত্যন্ত অপ্টিমাইজড লাইব্রেরি ব্যবহার করে সফ্টওয়্যার মোডে সমস্ত অঙ্কন অপারেশন সম্পাদন করে। Core Graphics Quartz 2D-কে চালিত করে — 25 বছরের ইতিহাস সহ একটি ইঞ্জিন।
iOS-এ, Core Graphics ফলাফল GPU-তে কম্পোজিটিংয়ের জন্য Core Animation-এ পাঠায়। Apple Engineering (2025) অনুসারে, Core Graphics UIKit-এ 80% UI অঙ্কন CPU-তে পরিচালনা করে, যখন Metal কম্পোজিটিং GPU-তে প্রস্তুত টেক্সচার একত্রিত করে। UIGraphicsImageRenderer CPU-ভিত্তিক রাস্টার ইমেজ রেন্ডারিংয়ের জন্য একটি আধুনিক র্যাপার।
CPU Rendering-এর অপ্টিমাইজেশন কর্মক্ষমতার জন্য গুরুত্বপূর্ণ কারণ সফ্টওয়্যার রেন্ডারিং UI ফ্রেমওয়ার্কে CPU সাইকেলের প্রধান ভোক্তা। সফ্টওয়্যার অঙ্কন ত্বরান্বিত করার মূল পদ্ধতিগুলি দেখি।
সবচেয়ে কার্যকর পদ্ধতি হল যা পরিবর্তিত হয়নি তা পুনরায় অঙ্কন না করা। যদি বিষয়বস্তু স্থির হয়, তবে এটি একবার Bitmap বা CGLayer-এ রেন্ডার করুন এবং প্রস্তুত ফলাফল কপি করুন। Android-এ এটি ক্যাশড Bitmap সহ View.setLayerType(LAYER_TYPE_SOFTWARE) এর মাধ্যমে বাস্তবায়িত হয়। iOS-এ — drawsAsynchronously এবং CALayer.shouldRasterize এর মাধ্যমে।
Dirty rectangles ব্যবহার করুন — স্ক্রিনের কোন ক্ষেত্রগুলি পরিবর্তিত হয়েছে তা ট্র্যাক করুন এবং কেবল সেগুলি পুনরায় অঙ্কন করুন। Android ViewSystem স্বয়ংক্রিয়ভাবে অকার্যকর ক্ষেত্র গণনা করে। iOS CALayer পুনরায় অঙ্কন ক্ষেত্র সীমিত করতে setNeedsDisplayInRect ব্যবহার করে।
পিক্সেল অপারেশনের (ব্লেন্ড, মাস্কিং) জন্য, CPU-র SIMD নির্দেশ ব্যবহার করুন। Android Skia ARM প্রসেসরের জন্য স্বয়ংক্রিয়ভাবে NEON ব্যবহার করে। iOS Core Graphics Accelerate ফ্রেমওয়ার্কের মাধ্যমে ভেক্টরাইজড। Google (2025) অনুসারে, Skia-তে NEON-অপ্টিমাইজড ব্লেন্ড অপারেশন স্কেলার কোডের চেয়ে 3–5 গুণ দ্রুত চলে।
// NEON-অপ্টিমাইজড পিক্সেল ব্লেন্ডিং (ARM)
#include <arm_neon.h>
void blendNEON(uint32_t* dst, const uint32_t* src, int count) {
for (int i = 0; i < count; i += 4) {
uint8x16_t a = vld1q_u8((uint8_t*)(src + i));
uint8x16_t b = vld1q_u8((uint8_t*)(dst + i));
uint8x16_t r = vhaddq_u8(a, b);
vst1q_u8((uint8_t*)(dst + i), r);
}
}
NEON নির্দেশ একটি অপারেশনে 16 পিক্সেল (128 বিট) প্রক্রিয়া করে। ARM Cortex-X4 পাইপলাইনিংয়ের সাথে মিলিয়ে, এটি সফ্টওয়্যার কপি এবং ব্লেন্ডিংয়ের জন্য প্রতি সেকেন্ডে 500 মিলিয়ন পিক্সেল পর্যন্ত থ্রুপুট প্রদান করে — 60 FPS-এ FullHD স্ক্রিনের জন্য যথেষ্ট।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
CPU Rendering অল্প সংখ্যক প্রিমিটিভ (500 পর্যন্ত) সহ GPU-র চেয়ে দ্রুত, কারণ ডেটা স্থানান্তর এবং শেডার কম্পাইলেশনের কোনো ওভারহেড নেই। 50–100 View সহ UI স্ক্রিনের জন্য, সফ্টওয়্যার রেন্ডারিং প্রায়শই GPU পাইপলাইনের চেয়ে কম সময় নেয়।
Android View সিস্টেম নির্ধারক রেন্ডারিং এর জন্য CPU-তে অঙ্কন করে — প্রতিটি পিক্সেল GPU ত্রুটি ছাড়াই কোডের সাথে সঠিকভাবে মেলে। অঙ্কনের পরে, স্তরগুলি GPU কম্পোজিটিংয়ের জন্য HWUI-তে পাঠানো হয়, যা CPU নির্ভুলতাকে GPU কর্মক্ষমতার সাথে যুক্ত করে।
রিয়েল-টাইম 3D গ্রাফিক্সের জন্য, CPU Rendering অদক্ষ। GPU প্রতি সেকেন্ডে 100 মিলিয়ন ত্রিভুজ রেন্ডার করে, CPU — 5–10 মিলিয়ন। ব্যতিক্রম হল প্রিভিউ বা এক্সপোর্টের জন্য পৃথক ফ্রেম রেন্ডার করা, যেখানে নির্ধারকতা গতির চেয়ে গুরুত্বপূর্ণ।
Android-এ, Developer Options-এ Profile GPU Rendering ব্যবহার করুন। iOS-এ — Instruments-এ Core Animation profiler। 16 ms-এর উপরে সবুজ বার CPU রেন্ডারিং বিলম্ব নির্দেশ করে। Android ম্যানিফেস্টে hardwareAccelerated ফ্ল্যাগও পরীক্ষা করুন।
Skia হল Google-এর 2D গ্রাফিক্স লাইব্রেরি যা Android, Chrome এবং Flutter-এ ব্যবহৃত হয়। Skia সফ্টওয়্যার এবং GPU ব্যাকএন্ড সমর্থন করে। CPU মোডে, এটি NEON নির্দেশ ব্যবহার করে অপ্টিমাইজড Software Renderer-এর মাধ্যমে সমস্ত অপারেশন সম্পাদন করে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন