CPU Rendering (yazılımsal işleme), GPU kullanılmadan merkezi işlemci tarafından görüntü oluşturma sürecidir. Bu modda, dönüşüm, rasterleştirme ve doku oluşturma hesaplamalarının tümü, grafik hattı yerine yazılım algoritmaları aracılığıyla CPU'da gerçekleştirilir. Apple Developer Documentation'a (2025) göre, yazılımsal işleme, GPU bağlamı başlatılmadan önce uygulama başlatılırken vakaların %100'ünde kullanılır ve iOS'ta UI çerçeveleri için birincil mod olarak kalır. Geliştiriciler, uyumluluk ve belirlilik açısından kritik görevler için CPU Rendering'i seçer.
Ana Noktalar
CPU Rendering, grafik hattının tüm aşamalarının matematiksel hesaplamalar aracılığıyla merkezi işlemcide yürütüldüğü bir görüntü oluşturma yöntemidir. Rasterleştirme ve doku oluşturmanın özel bloklara yerleştirildiği GPU'nun aksine, CPU bunları evrensel SSE/NEON talimatları aracılığıyla gerçekleştirir.
Tarihsel olarak, tüm işleme yazılım tabanlıydı — ilk grafik arayüzler (Xerox Alto, 1973) ve 3D oyunlar (Quake, 1996) CPU'da işleniyordu. “software renderer” terimi CPU Rendering ile eş anlamlı hale geldi. Donanım hızlandırmaya geçiş, 1990'ların sonunda uygun fiyatlı 3D hızlandırıcıların ortaya çıkmasıyla başladı, ancak yazılımsal işleme yedek mekanizma olarak kaldı.
Akamai'e (2025) göre CPU Rendering, mobil web oturumlarının %35'inde birincil işleme modu olarak kullanılır — zayıf cihazlarda, öykünücülerde ve GPU hızlandırması devre dışı bırakıldığında. iOS ve Android platformlarında, UI çerçeveleri (UIKit, Android View) GPU komutları başlatılmadan önce ilk birkaç kareyi her zaman CPU'da işler.
Modern işlemciler, GPU paralelliğini kısmen taklit eden SIMD talimatlarını (SSE4.2, AVX-512, ARM NEON) destekler. Ancak, fiziksel çekirdek sayısı (4–12) ve özel rasterleştirme bloklarının eksikliği, karmaşık grafiklerde CPU Rendering performansını sınırlar.
Yazılım hattı, donanımla aynı aşamaları içerir: köşe dönüşümü, kırpma, rasterleştirme, doku oluşturma ve piksel çıkışı. Fark, her aşamanın sabit GPU blokları yerine C++ veya assembly kodu aracılığıyla yazılımda uygulanmasıdır.
CPU Rendering'de köşe dönüşümü, matris çarpımı yoluyla gerçekleştirilir — projeksiyon ve modelleme için 4x4. 10.000 çokgen ile bu, kare başına 40.000 vektör çarpımıdır — optimize edilmiş kodla CPU'nun 5–10 ms'de başa çıktığı bir yük. Rasterleştirme, her üçgen için piksel kapsama alanı hesaplaması gerektiren en ağır aşamadır.
Mobil işlemcilerde, ARM NEON 128 bit genişliğindeki vektör talimatları aracılığıyla yazılımsal işlemeyi hızlandırır. ARM'e (2025) göre, NEON optimize edilmiş bir yazılım işleyici, aynı saat frekansında Cortex-X4'te skaler uygulamadan 3–4 kat daha hızlı çalışır.
Yazılımsal işleme, CPU'da sahne hazırlığı ile başlar: geometri (köşeler, çokgenler) matris işlemleri aracılığıyla dünya koordinatlarından ekran koordinatlarına dönüştürülür. Ardından kırpma gerçekleştirilir — kameranın görüş alanı dışındaki geometrinin kaldırılması.
CPU rasterleştirme, tarama çizgisi (scanline) algoritması veya barycentric koordinatlar aracılığıyla her üçgeni piksellere böler. Her piksel için doku, aydınlatma ve saydamlık dikkate alınarak renk hesaplanır. Sonuç, framebuffer'a — RAM'deki bir piksel dizisine — yazılır.
GPU işlemeden temel fark, piksel seviyesinde paralellik eksikliğidir. CPU pikselleri sıralı olarak veya 4–8 çekirdekte sınırlı paralellikle işler. Doku oluşturma ile 1080p kare (2 milyon piksel) için CPU'da 15–30 ms gerekirken GPU'da 2–5 ms gerekir.
// Tek bir üçgenin basitleştirilmiş CPU rasterleştirmesi
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;
}
}
}
}
İşlev, üçgenin sınırlayıcı kutusunu tarar ve her pikseli barycentric koordinatlar aracılığıyla kontrol eder. Milyonlarca piksel için böyle bir döngü CPU'da milisaniyeler içinde yürütülür, ancak binlerce üçgen içeren karmaşık sahnelerde zaman doğrusal olarak artar.
CPU Rendering ve GPU Rendering arasındaki fark, işlemci mimarisi tarafından belirlenir. CPU, dal tahmini ile sıralı görevler için optimize edilmiştir, GPU ise binlerce iş parçacığı ile büyük ölçekli paralellik için. Bu temel fark, her yaklaşımın uygulama alanlarını belirler.
| Parametre | CPU Rendering | GPU Rendering |
|---|---|---|
| Paralellik | 4–12 iş parçacığı | 512–4096 iş parçacığı |
| FLOPS | 50–200 GFLOPS | 500–2400 GFLOPS |
| Güç tüketimi | 2–8 W işleme başına | 2–8 W işleme başına |
| Belirlilik | Tam | Sürücüye bağlı |
| Hata ayıklama | Kolay (GDB, LLDB) | Karmaşık (RenderDoc, XCode) |
| Dokular | RAM'de | Video belleğinde (VRAM) |
CPU Rendering belirlilikte kazanır — aynı giriş verileri her zaman aynı çıktıyı üretir. Bu, her pikselin düzenle eşleşmesi gereken UI çerçeveleri için kritiktir. GPU, sürücüler arasındaki kayan nokta yuvarlama farklılıkları nedeniyle yanlışlıklara neden olabilir.
Düşük karmaşıklıktaki (100–500 ilkel) 2D grafikler için CPU Rendering, veri aktarımı ve gölgelendirici derleme yükü olmaması nedeniyle genellikle GPU'dan daha hızlıdır. Google Android Team'e (2025) göre, Android'in View sisteminde yazılımsal işleme tipik bir ekran için 2–3 ms sürerken GPU'da donanım hızlandırması ile 3–5 ms sürer.
Yazılımsal işleme, GPU'nun mevcut olmadığı, gereksiz olduğu veya gerekli belirliliği sağlamadığı senaryolarda talep görmeye devam etmektedir. Modern geliştirmede CPU Rendering'in ana uygulama alanlarına bakalım.
Android View sistemi, tüm UI öğelerini CPU'da işler ve ardından sonucu GPU'ya birleştirme için iletir. Her View, CPU aracılığıyla bir Bitmap üzerine çizen onDraw(Canvas)'ı çağırır. Ancak bundan sonra HWUI katmanları GPU'da birleştirir. Bu, GPU sürücüsünden bağımsız olarak belirlenebilir UI davranışını garanti eder.
iOS'ta UIKit de CPU işleme ile başlar. Core Animation, CPU'da bir yedekleme deposunda CALayer işler ve ardından dokuları GPU'ya gönderir. WWDC 2024'e göre, yazılım aşaması kare işleme süresinin %30–50'sini alır, geri kalanı GPU birleştirmedir.
SVG işleme geleneksel olarak CPU'da gerçekleştirilir çünkü karmaşık Bezier eğrilerinin oluşturulmasını ve doldurulmasını gerektirir. librsvg ve Skia gibi kütüphaneler SVG'yi CPU'da işleyerek eğrileri üçgenlere böler ve doldurur. Google Chrome Team'e (2025) göre Skia, CPU'da modern mobil işlemcilerde SVG simgelerini 0.3–1.5 ms'de işler.
PDF belgeleri karmaşık iç içe grafikler içerir: yazı tipleri, vektör öğeleri, raster görüntüler ve dönüşümler. Mobil uygulamalar, PDFKit (iOS) ve PdfRenderer (Android) gibi çerçeveler aracılığıyla PDF'yi CPU'da işler. Görüntüleme doğruluğu ve PDF 2.0 standardı desteği, her öğenin yazılım tarafından işlenmesini gerektirir.
Mobil platformlar, CPU Rendering'i ARM mimarisini ve sınırlı güç tüketimini dikkate alarak uygular. Android ve iOS'ta yazılımsal işlemenin nasıl çalıştığına bakalım.
Android Canvas, donanım hızlandırması devre dışı bırakıldığında tamamen CPU'da çalışır. Canvas sınıfı, Google'ın 2D kütüphanesi olan Skia aracılığıyla yürütülen ilkel çizim yöntemlerini içerir. Skia, yazılım ve GPU arka uçlarını destekler ve hardwareAccelerated bayrağına göre geçiş yapar.
Yazılım Canvas'ı RAM'de bir Bitmap oluşturur, Skia Software Renderer aracılığıyla üzerine komutlar çizer ve ardından ekrana çıktılar. Tüm işlemler, optimizasyon için NEON talimatları kullanılarak CPU'da gerçekleştirilir. Skia Team'e (2025) göre NEON hızlandırması, birleştirme ve maskeleme işlemleri için %40–60 artış sağlar.
// Bitmap aracılığıyla yazılımsal işleme
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 belleğinde oluşturulur, üzerinde çizim komutları yürütülür, ardından bitmiş görüntü ImageView aracılığıyla görüntülenir. Bu yaklaşım, her piksel üzerinde tam kontrolün önemli olduğu filigran, grafik ve dinamik görüntüler için kullanılır.
Core Graphics, öncelikle CPU'da çalışan Apple'ın raster ve vektör grafik çerçevesidir. CGContext, Apple'ın yüksek düzeyde optimize edilmiş kütüphanelerini kullanarak tüm çizim işlemlerini yazılım modunda gerçekleştirir. Core Graphics, 25 yıllık geçmişe sahip bir motor olan Quartz 2D'yi çalıştırır.
iOS'ta Core Graphics, sonucu GPU'da birleştirme için Core Animation'a iletir. Apple Engineering'e (2025) göre Core Graphics, UIKit'te UI çiziminin %80'ini CPU'da işlerken, Metal birleştirme GPU'da hazır dokuları bir araya getirir. UIGraphicsImageRenderer, CPU tabanlı raster görüntü işleme için modern bir sarmalayıcıdır.
CPU Rendering optimizasyonu, yazılımsal işleme UI çerçevelerinde CPU döngülerinin ana tüketicisi olduğu için performans açısından kritiktir. Yazılımsal çizimi hızlandırmak için temel yöntemlere bakalım.
En etkili yöntem, değişmeyeni yeniden çizmemektir. İçerik statikse, bir kez Bitmap veya CGLayer'da işleyin ve hazır sonucu kopyalayın. Android'de bu, önbelleğe alınmış Bitmap ile View.setLayerType(LAYER_TYPE_SOFTWARE) aracılığıyla uygulanır. iOS'ta — drawsAsynchronously ve CALayer.shouldRasterize aracılığıyla.
Dirty rectangles kullanın — ekranın hangi alanlarının değiştiğini izleyin ve yalnızca bunları yeniden çizin. Android ViewSystem otomatik olarak geçersiz bölgeyi hesaplar. iOS CALayer, yeniden çizim alanını sınırlamak için setNeedsDisplayInRect kullanır.
Piksel işlemleri (birleştirme, maskeleme) için CPU'nun SIMD talimatlarını kullanın. Android Skia, ARM işlemciler için otomatik olarak NEON kullanır. iOS Core Graphics, Accelerate çerçevesi aracılığıyla vektörleştirilir. Google'e (2025) göre Skia'da NEON optimize edilmiş birleştirme işlemleri, skaler koddan 3–5 kat daha hızlı çalışır.
// NEON optimize edilmiş piksel birleştirme (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 talimatları, tek bir işlemde 16 pikseli (128 bit) işler. ARM Cortex-X4 ardışık düzeniyle birleştiğinde, bu yazılımsal kopyalama ve birleştirme için saniyede 500 milyon piksele kadar verim sağlar — 60 FPS'de bir FullHD ekran için yeterli.
Sıkça Sorulan Sorular
CPU Rendering, az sayıda ilkel (500'e kadar) ile veri aktarımı ve gölgelendirici derleme yükü olmaması nedeniyle GPU'dan daha hızlıdır. 50–100 View içeren UI ekranları için yazılımsal işleme genellikle GPU hattından daha az zaman alır.
Android View sistemi, belirlenebilir işleme için CPU'da çizer — her piksel, GPU yanlışlıkları olmadan koda tam olarak karşılık gelir. Çizimden sonra katmanlar GPU birleştirmesi için HWUI'ye iletilir ve CPU doğruluğu GPU performansıyla birleştirilir.
Gerçek zamanlı 3D grafikler için CPU Rendering verimsizdir. GPU saniyede 100 milyon üçgen işlerken CPU 5–10 milyon işler. İstisna, belirliliğin hızdan daha önemli olduğu önizleme veya dışa aktarma için tek tek karelerin işlenmesidir.
Android'de Geliştirici Seçenekleri'nde Profile GPU Rendering kullanın. iOS'ta — Instruments'ta Core Animation profilleyicisi. 16 ms'nin üzerindeki yeşil çubuk CPU işleme gecikmelerini gösterir. Ayrıca Android manifestosundaki hardwareAccelerated bayrağını kontrol edin.
Skia, Android, Chrome ve Flutter'da kullanılan Google'ın 2D grafik kütüphanesidir. Skia, yazılım ve GPU arka ucunu destekler. CPU modunda, NEON talimatlarını kullanarak optimize edilmiş bir Software Renderer aracılığıyla tüm işlemleri gerçekleştirir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun