CPU Rendering (proqram təqliri) — GPU-dan istifadə etmədən mərkəzi prosessor tərəfindən təsvirin formalaşdırılması prosesidir. Bu rejimdə transformasiya, rasterləşdirmə və fakturalamanın bütün hesablamaları qrafik konveyeri vasitəsilə deyil, proqram alqoritmləri ilə CPU-da yerinə yetirilir. Apple Developer Documentation (2025) məlumatlarına görə, proqram təqliri GPU kontekstinin işə salınmasına qədər tətbiqin işə salınması zamanı 100% hallarda tətbiq edilir və iOS-da UI çərçivələri üçün əsas rejim olaraq qalır. Tərtibatçılar uyğumluq və determinizm üçün kritik olan tapşırıqlar üçün CPU Rendering seçirlər.
Əsas Məqamlar
CPU Rendering — qrafik konveyerinin bütün mərhələlərinin riyazi hesablamalar vasitəsilə mərkəzi prosessorda yerinə yetirildiyi təsvirin formalaşdırılması üsuludur. Rasterləşdirmə və fakturalamanın ixtisaslaşdırılmış bloklara daxil edildiyi GPU-dan fərqli olaraq, CPU onları universal SSE/NEON təlimatları vasitəsilə yerinə yetirir.
Tarixən bütün təqlir proqram xarakterli idi — ilk qrafik interfeyslər (Xerox Alto, 1973) və 3D oyunlar (Quake, 1996) CPU-da təqlir olunurdu. «Software renderer» termini CPU Rendering-in sinonimi kimi qəbul edilmişdir. Avadanlıq sürətləndirilməsinə keçid 1990-cı illərin sonunda əlçatan 3D sürətləndiricilərinin meydana çıxması ilə başladı, lakin proqram təqliri ehtiyat mexanizmi olaraq qaldı.
Akamai (2025) məlumatlarına görə, CPU Rendering mobil veb seansların 35%-də əsas təqlir rejimi kimi istifadə olunur — zəif cihazlarda, emulyatorlarda və GPU sürətləndirilməsi söndürüldükdə. iOS və Android platformalarında UI çərçivələri (UIKit, Android View) ilk bir neçə çərçivəni həmişə GPU əmrləri işə salınana qədər CPU-da təqlir edir.
Müastir prosessorlar GPU paralelliyini qismən təqlid edən SIMD təlimatlarını (SSE4.2, AVX-512, ARM NEON) dəstəkləyir. Bununla belə, fiziki nüvə sayı (4–12) və ixtisaslaşdırılmış rasterləşdirmə bloklarının olmaması mürəkkəb qrafikada CPU Rendering performansını məhdudlaşdırır.
Proqram konveyeri avadanlıq konveyeri ilə eyni mərhələləri əhatə edir: təpə nöqtələrinin transformasiyası, kəsmə, rasterləşdirmə, fakturalama və piksellərin çıxarılması. Fərq ondadır ki, hər bir mərhələ sabit GPU blokları vasitəsilə deyil, C++ və ya assembler kodu ilə proqram şəkildə həyata keçirilir.
CPU Rendering-də təpə nöqtələrinin transformasiyası matris vurulması ilə yerinə yetirilir — proyeksiya və modelləşdirmə üçün 4x4. 10 000 çoxbucaqlıda bu, çərçivə başına 40 000 vektor vurulması deməkdir — optimallaşdırılmış kodla CPU-nun 5–10 ms ərzində öhdəsindən gəldiyi yük. Rasterləşdirmə ən ağır mərhələdir və hər üçbucaq üçün piksel örtüməsinin hesablanmasını tələb edir.
Mobil prosessorlarda ARM NEON 128 bit genişlikdə vektor təlimatları vasitəsilə proqram təqlirini sürətləndirir. ARM (2025) məlumatlarına görə, NEON optimallaşdırılmış software renderer eyni saat tezliyində Cortex-X4-də skalyar tətbiqdən 3–4 dəfə sürətli işləyir.
Proqram təqliri CPU-da səhnənin hazırlanması ilə başlayır: həndəsə (təpə nöqtələri, çoxbucaqlılar) matris əməliyyatları vasitəsilə dünya koordinatlarından ekran koordinatlarına çevrilir. Sonra kəsmə aparılır — kamera baxış sahəsindən kənarda olan həndəsə silinir.
CPU rasterləşdirməsi hər üçbucağı skan xətti (scanline) alqoritmi və ya barysentrik koordinatlar vasitəsilə piksellərə bölür. Hər piksel üçün fakturalar, işıqlandırma və şəffaflıq nəzərə alınmaqla rəng hesablanır. Nəticə framebuffer-də — operativ yaddaşdakı piksel massivində qeyd olunur.
GPU təqlirindən əsas fərq — piksel səviyyəsində paralelliyin olmamasıdır. CPU pikselləri ardıcıl və ya 4–8 nüvə vasitəsilə kiçik paralelliklə emal edir. Fakturalama ilə 1080p çərçivə (2 milyon piksel) üçün CPU-da 15–30 ms, GPU-da isə 2–5 ms tələb olunur.
// Tək üçbucağın sadələşdirilmiş CPU rasterləşdirməsi
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;
}
}
}
}
Funksiya üçbucağın bounding box-nı gəzir və hər pikselin mənsubiyyətini barysentrik koordinatlar vasitəsilə yoxlayır. Milyonlarla piksel üçün belə bir dövran CPU-da millisaniyələr ərzində yerinə yetirilir, lakin minlərlə üçbucaqlı mürəkkəb səhnələrdə vaxt xətti olaraq artır.
CPU Rendering və GPU Rendering arasındakı fərq prosessorların arxitekturası ilə müyyən edilir. CPU budaqlanma proqnozlaşdırılması ilə ardıcıl tapşırıqlar üçün, GPU isə minlərlə iplik ilə küçləndirilmiş paralellik üçün optimallaşdırılmışdır. Bu fundamental fərq hər yanaşmanın tətbiq sahələrini müyyən edir.
| Parametr | CPU Rendering | GPU Rendering |
|---|---|---|
| Paralellik | 4–12 iplik | 512–4096 iplik |
| FLOPS | 50–200 GFLOPS | 500–2400 GFLOPS |
| Enerji istehlakı | 2–8 Vt təqlir üçün | 2–8 Vt təqlir üçün |
| Determinizm | Tam | Sürücüdən asılıdır |
| Sazlama | Asan (GDB, LLDB) | Çətin (RenderDoc, XCode) |
| Fakturalar | Operativ yaddaşda | Video yaddaşda (VRAM) |
CPU Rendering determinizmdə üstünlük qazanır — eyni giriş məlumatları həmişə eyni nəticəni verir. Bu, hər pikselin dizayna uyğun olmalı olduğu UI çərçivələri üçün vacibdir. GPU müxtəlif sürücülərdə float nöqtə yuvarlaqlaşdırma xüsusiyyətlərinə görə səhvlərə yol verə bilər.
Aşağı mürəkkəblikli 2D qrafika üçün (100–500 primitiv) CPU Rendering tez-tez GPU-dan daha sürətli olur, çünki verilənlərin magistral üzərində ötürülməsi və shader kompilyasiyası üçün əlavə xərclər yoxdur. Google Android Team (2025) məlumatlarına görə, Android View sistemində proqram təqliri tipik ekran üçün 2–3 ms, GPU-da avadanlıq sürətləndirilməsi ilə isə 3–5 ms çəkir.
Proqram təqliri GPU-nun əlçatan olmadığı, lazımsız olduğu və ya tələb olunan determinizmi təmin etmədiyi ssenarilərdə tələb olunmağa davam edir. Müastir inkişafda CPU Rendering-in əsas tətbiq sahələrinə nəzər salaq.
Android View sistemi bütün UI elementlərini CPU-da təqlir edir, sonra isə nəticəni kompozisiya üçün GPU-ya ötürür. Hər View onDraw(Canvas) çağırır, o da CPU vasitəsilə Bitmap üzərində çəkir. Yalnız bundan sonra HWUI təbəqələri GPU-da kompozisiya edir. Bu, GPU sürücüsündən asılı olmayaraq UI-nin deterministik davranışını təmin edir.
iOS-da UIKit də CPU təqliri ilə başlayır. Core Animation CALayer-i CPU-da backing store-da təqlir edir, sonra fakturaları GPU-ya göndərir. WWDC 2024 məlumatlarına görə, proqram mərhələsi çərçivə təqlir vaxtının 30–50%-ni təşkil edir, qalanı GPU kompozisiyasıdır.
SVG təqliri ənənəvi olaraq CPU-da yerinə yetirilir, çünki mürəkkəb Bezier əyrilərinin və onların doldurulmasının qurulmasını tələb edir. librsvg və Skia kimi kitabxanalar SVG-ni CPU-da emal edir, əyriləri üçbucaqlara bölür və onları rəngləndirir. Google Chrome Team (2025) məlumatlarına görə, CPU-dakı Skia SVG ikonlarını müastir mobil prosessorlarda 0.3–1.5 ms ərzində təqlir edir.
PDF sənədləri mürəkkəb iç-içə qrafika ehtiva edir: şriftlər, vektor elementləri, raster şəkillər və transformasiyalar. Mobil tətbiqlər PDF-i PDFKit (iOS) və PdfRenderer (Android) kimi çərçivələr vasitəsilə CPU-da təqlir edir. Göstərmə dəqiqliyi və PDF 2.0 standartının dəstəyi hər bir elementin proqram emalını tələb edir.
Mobil platformalar CPU Rendering-i ARM arxitekturası və məhdud enerji istehlakı nəzərə alınmaqla həyata keçirir. Android və iOS-da proqram təqlirinin necə işlədiyinə baxaq.
Android Canvas avadanlıq sürətləndirilməsi söndürüldükdə tamamilə CPU-da işləyir. Canvas sinfi Skia — Google-un 2D kitabxanası vasitəsilə yerinə yetirilən primitivlərin çəkilməsi üçün metodlar ehtiva edir. Skia proqram və GPU backend-lərini dəstəkləyir və hardwareAccelerated bayrağı ilə keçid edir.
Proqram Canvas operativ yaddaşda Bitmap yaradır, Skia Software Renderer vasitəsilə onun üzərində əmrləri çəkir və sonra ekrana göstərir. Bütün əməliyyatlar optimallaşdırma üçün NEON təlimatlarından istifadə etməklə CPU-da yerinə yetirilir. Skia Team (2025) məlumatlarına görə, NEON sürətləndirilməsi blend və maskeleme əməliyyatları üçün 40–60% performans artımı verir.
// Bitmap vasitəsilə proqram təqliri
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 yaddaşında yaradılır, onun üzərində çəkmə əmrləri yerinə yetirilir, sonra hazır şəkil ImageView vasitəsilə göstərilir. Bu yanaşma hər piksel üzərində tam nəzarətin vacib olduğu su nişanı, qrafiklər və dinamik şəkillər üçün istifadə olunur.
Core Graphics — Apple-ın əsasən CPU-da işləyən raster və vektor qrafikası üçün çərçivəsidir. CGContext bütün çəkmə əməliyyatlarını Apple-ın yüksək optimallaşdırılmış kitabxanalarından istifadə edərək proqram rejimində yerinə yetirir. Core Graphics 25 illik tarixə malik Quartz 2D mühərrikini dəstəkləyir.
iOS-da Core Graphics nəticəni GPU-da kompozisiya üçün Core Animation-a ötürür. Apple Engineering (2025) məlumatlarına görə, Core Graphics UIKit-də UI çəkiməsinin 80%-ni CPU-da emal edir, Metal kompozisiyası isə hazır fakturaları GPU-da toplayır. UIGraphicsImageRenderer CPU-da raster şəkillərin təqliri üçün müastir sarğıcdır.
CPU Rendering optimallaşdırılması performans üçün vacibdir, çünki proqram təqliri UI çərçivələrində CPU dövrlərinin əsas istehlakçısıdır. Proqram təqlirinin sürətləndirilməsinin əsas üsullarına baxaq.
Ən təsirli üsul dəyişməyən şeyi yenidən ékməməkdir. Məzmun statikdirsə, onu bir dəfə Bitmap və ya CGLayer-də təqlir edin və hazır nəticəni köçürün. Android-də bu, keşlənən Bitmap ilə View.setLayerType(LAYER_TYPE_SOFTWARE) vasitəsilə həyata keçirilir. iOS-da — drawsAsynchronously və CALayer.shouldRasterize vasitəsilə.
Çirkli dördbucaqlılar (dirty rectangles) istifadə edin — ekranın hansı sahələrinin dəyişdiyini izləyin və yalnız onları yenidən çəkin. Android ViewSystem avtomatik olaraq invalidated region-u hesablayır. iOS CALayer yenidən çəkmə sahəsini məhdudlaşdırmaq üçün setNeedsDisplayInRect istifadə edir.
Piksel əməliyyatları (blend, maskeleme) üçün CPU-nun SIMD təlimatlarından istifadə edin. Android Skia ARM prosessorları üçün avtomatik olaraq NEON-dan istifadə edir. iOS Core Graphics Accelerate framework vasitəsilə vektorlaşdırılır. Google (2025) məlumatlarına görə, Skia-da NEON optimallaşdırılmış blend əməliyyatları skalyar koddan 3–5 dəfə sürətli yerinə yetirilir.
// NEON optimallaşdırılmış piksel qarışdırma (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 təlimatları bir əməliyyatda 16 piksel (128 bit) emal edir. ARM Cortex-X4-ün konveyerləşdirməsi ilə birlikdə bu, proqram köçürülməsi və qarışdırılması zamanı saniyədə 500 milyon piksel ötürmə qabiliyyəti verir — 60 FPS ilə FullHD ekran üçün kifayətdir.
Tez-tez verilən suallar
CPU Rendering az sayda primitiv (500-ə qədər) olduqda GPU-dan daha sürətlidir, çünki verilənlərin ötürülməsi və shader kompilyasiyası üçün əlavə xərclər yoxdur. 50–100 View olan UI ekranları üçün proqram təqliri tez-tez GPU konveyerindən daha az vaxt aparır.
Android View sistemi deterministik təqlir üçün CPU-da çəkir — hər piksel GPU səhvləri olmadan koda dəqiq uyğun gəlir. Təqlirdən sonra təbəqələr GPU kompozisiyası üçün HWUI-ya ötürülür ki, bu da CPU-nun dəqiqliyini GPU-nun performansı ilə birləşdirir.
Real vaxt rejimində 3D qrafika üçün CPU Rendering səmərəsizdir. GPU saniyədə 100 milyon üçbucaq, CPU isə 5–10 milyon təqlir edir. İstisna, determinizmin sürətdən daha vacib olduğu ön baxış və ya ixrac üçün ayrıca çərçivələrin təqliridir.
Android-də Developer Options-da Profile GPU Rendering istifadə edin. iOS-da — Instruments-də Core Animation profiler. 16 ms-dən yuxarı yaşıl zolaq CPU təqlirinin gecikmələrini göstərir. Həmçinin Android manifestində hardwareAccelerated bayrağını yoxlayın.
Skia — Android, Chrome və Flutter-də istifadə olunan Google-un 2D qrafik kitabxanasıdır. Skia proqram və GPU backend-lərini dəstəkləyir. CPU rejimində o, NEON təlimatlarından istifadə edərək optimallaşdırılmış Software Renderer vasitəsilə bütün əməliyyatları yerinə yetirir.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun