CPU Rendering: khái niệm, nguyên lý và cách hoạt động của kết xuất phần mềm

Tác giả: IT Sectr Đã đăng: 2026-06-11 Thời gian đọc: 8 phút

CPU Rendering (kết xuất phần mềm) là quá trình tạo hình ảnh bởi bộ xử lý trung tâm mà không sử dụng GPU. Ở chế độ này, tất cả các tính toán biến đổi, rasterization và tạo kết cấu được thực hiện trên CPU thông qua các thuật toán phần mềm thay vì qua pipeline đồ họa. Theo tài liệu Apple Developer (2025), kết xuất phần mềm được sử dụng trong 100% trường hợp khi khởi động ứng dụng trước khi khởi tạo ngữ cảnh GPU và vẫn là chế độ chính cho các framework UI trên iOS. Các nhà phát triển chọn CPU Rendering cho các tác vụ quan trọng về tính tương thích và tính xác định.

Những điểm chính

  • CPU Rendering — vẽ phần mềm được thực hiện trên CPU mà không có bộ tăng tốc đồ họa.
  • Ưu điểm: tính xác định, dễ gỡ lỗi, hoạt động trên thiết bị không có GPU và kiểm soát pixel hoàn toàn.
  • Nhược điểm: hiệu suất thấp trên đồ họa phức tạp, tiêu thụ điện năng cao và song song hạn chế.
  • Sử dụng: kết xuất UI của framework (Android View, UIKit), kết xuất SVG, PDF và các khung hình đầu tiên của ứng dụng.
  • Tối ưu hóa kết xuất phần mềm bao gồm lưu đệm kết quả, giảm thiểu vẽ lại và sử dụng thao tác bit.

CPU Rendering là gì?

CPU Rendering là phương pháp tạo hình ảnh trong đó tất cả các giai đoạn của pipeline đồ họa được thực thi trên bộ xử lý trung tâm thông qua các tính toán toán học. Không giống như GPU, nơi rasterization và tạo kết cấu được tích hợp trong các khối chuyên dụng, CPU thực hiện chúng thông qua các lệnh SSE/NEON phổ quát.

Trong lịch sử, tất cả kết xuất đều dựa trên phần mềm — các giao diện đồ họa đầu tiên (Xerox Alto, 1973) và trò chơi 3D (Quake, 1996) được kết xuất trên CPU. Thuật ngữ “software renderer” đã trở thành đồng nghĩa với CPU Rendering. Quá trình chuyển đổi sang tăng tốc phần cứng bắt đầu với sự xuất hiện của các bộ tăng tốc 3D giá phải chăng vào cuối những năm 1990, nhưng kết xuất phần mềm vẫn tồn tại như một cơ chế dự phòng.

Theo Akamai (2025), CPU Rendering được sử dụng trong 35% phiên web di động làm chế độ kết xuất chính — trên các thiết bị yếu, trong trình giả lập và khi tăng tốc GPU bị tắt. Trên nền tảng iOS và Android, các framework UI (UIKit, Android View) luôn kết xuất vài khung hình đầu tiên trên CPU trước khi khởi tạo lệnh GPU.

Các bộ xử lý hiện đại hỗ trợ lệnh SIMD (SSE4.2, AVX-512, ARM NEON), bắt chước một phần song song GPU. Tuy nhiên, số lượng lõi vật lý (4–12) và thiếu các khối rasterization chuyên dụng hạn chế hiệu suất CPU Rendering trên đồ họa phức tạp.

Các giai đoạn kết xuất phần mềm

Pipeline phần mềm bao gồm các giai đoạn giống như phần cứng: biến đổi đỉnh, cắt, rasterization, tạo kết cấu và xuất pixel. Sự khác biệt là mỗi giai đoạn được triển khai bằng phần mềm thông qua mã C++ hoặc assembly, thay vì qua các khối GPU cố định.

Biến đổi đỉnh trong CPU Rendering được thực hiện thông qua nhân ma trận — 4x4 cho chiếu và mô hình hóa. Với 10.000 đa giác, đây là 40.000 phép nhân vector mỗi khung hình — tải mà CPU xử lý trong 5–10 ms với mã được tối ưu hóa. Rasterization là giai đoạn nặng nhất, yêu cầu tính toán vùng phủ pixel cho mỗi tam giác.

Trong bộ xử lý di động, ARM NEON tăng tốc kết xuất phần mềm thông qua các lệnh vector rộng 128 bit. Theo ARM (2025), trình kết xuất phần mềm được tối ưu hóa NEON chạy nhanh hơn 3–4 lần so với triển khai vô hướng trên Cortex-X4 ở cùng tần số xung nhịp.

Kết xuất phần mềm hoạt động như thế nào?

Kết xuất phần mềm bắt đầu bằng việc chuẩn bị cảnh trên CPU: hình học (đỉnh, đa giác) được biến đổi từ tọa độ thế giới sang tọa độ màn hình thông qua các thao tác ma trận. Sau đó, cắt được thực hiện — loại bỏ hình học nằm ngoài trường nhìn của camera.

CPU rasterization chia mỗi tam giác thành các pixel thông qua thuật toán dòng quét (scanline) hoặc tọa độ trọng tâm. Đối với mỗi pixel, màu sắc được tính toán có tính đến kết cấu, ánh sáng và độ trong suốt. Kết quả được ghi vào framebuffer — một mảng pixel trong RAM.

Sự khác biệt chính so với kết xuất GPU là thiếu song song ở cấp độ pixel. CPU xử lý pixel tuần tự hoặc với song song hạn chế trên 4–8 lõi. Đối với khung hình 1080p (2 triệu pixel) với tạo kết cấu, điều này cần 15–30 ms trên CPU so với 2–5 ms trên GPU.

cpp
// Rasterization CPU đơn giản hóa của một tam giác
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;
            }
        }
    }
}

Hàm quét hộp bao quanh tam giác và kiểm tra từng pixel thông qua tọa độ trọng tâm. Đối với hàng triệu pixel, vòng lặp như vậy thực thi trong mili giây trên CPU, nhưng đối với các cảnh phức tạp với hàng nghìn tam giác, thời gian tăng tuyến tính.

So sánh kết xuất CPU và GPU

Sự khác biệt giữa CPU Rendering và GPU Rendering được xác định bởi kiến trúc bộ xử lý. CPU được tối ưu hóa cho các tác vụ tuần tự với dự đoán rẽ nhánh, GPU cho song song hàng loạt với hàng nghìn luồng. Sự khác biệt cơ bản này xác định các lĩnh vực ứng dụng của mỗi phương pháp.

Tham sốCPU RenderingGPU Rendering
Song song4–12 luồng512–4096 luồng
FLOPS50–200 GFLOPS500–2400 GFLOPS
Tiêu thụ điện năng2–8 W mỗi lần kết xuất2–8 W mỗi lần kết xuất
Tính xác địnhHoàn toànPhụ thuộc vào trình điều khiển
Gỡ lỗiDễ (GDB, LLDB)Phức tạp (RenderDoc, XCode)
Kết cấuTrong RAMTrong bộ nhớ video (VRAM)

CPU Rendering thắng về tính xác định — dữ liệu đầu vào giống nhau luôn cho kết quả đầu ra giống nhau. Điều này rất quan trọng đối với các framework UI, nơi mỗi pixel phải khớp với bố cục. GPU có thể gây ra sự không chính xác do khác biệt làm tròn dấu phẩy động giữa các trình điều khiển.

Đối với đồ họa 2D có độ phức tạp thấp (100–500 nguyên thủy), CPU Rendering thường nhanh hơn GPU do không có chi phí truyền dữ liệu qua bus và biên dịch shader. Theo Google Android Team (2025), kết xuất phần mềm trong hệ thống View của Android mất 2–3 ms cho một màn hình điển hình so với 3–5 ms với tăng tốc phần cứng trên GPU.

CPU Rendering được sử dụng ở đâu

Kết xuất phần mềm vẫn được ưa chuộng trong các tình huống mà GPU không khả dụng, không cần thiết hoặc không cung cấp tính xác định cần thiết. Hãy xem xét các lĩnh vực ứng dụng chính của CPU Rendering trong phát triển hiện đại.

Framework UI và chuẩn bị khung hình

Hệ thống Android View kết xuất tất cả các phần tử UI trên CPU, sau đó chuyển kết quả sang GPU để tổng hợp. Mỗi View gọi onDraw(Canvas), vẽ trên Bitmap thông qua CPU. Chỉ sau đó HWUI mới tổng hợp các lớp trên GPU. Điều này đảm bảo hành vi UI xác định không phụ thuộc vào trình điều khiển GPU.

UIKit trên iOS cũng bắt đầu bằng kết xuất CPU. Core Animation kết xuất CALayer vào bộ lưu trữ đệm trên CPU, sau đó gửi kết cấu đến GPU. Theo WWDC 2024, giai đoạn phần mềm chiếm 30–50% thời gian kết xuất khung hình, phần còn lại là tổng hợp GPU.

SVG và đồ họa vector

Kết xuất SVG theo truyền thống được thực hiện trên CPU vì nó yêu cầu xây dựng các đường cong Bezier phức tạp và tô màu chúng. Các thư viện như librsvg và Skia xử lý SVG trên CPU, chia đường cong thành các tam giác và tô màu. Theo Google Chrome Team (2025), Skia trên CPU kết xuất biểu tượng SVG trong 0.3–1.5 ms trên các bộ xử lý di động hiện đại.

Kết xuất PDF

Tài liệu PDF chứa đồ họa lồng nhau phức tạp: phông chữ, phần tử vector, hình ảnh raster và các phép biến đổi. Các ứng dụng di động kết xuất PDF trên CPU thông qua các framework như PDFKit (iOS) và PdfRenderer (Android). Độ chính xác hiển thị và hỗ trợ tiêu chuẩn PDF 2.0 yêu cầu xử lý phần mềm cho từng phần tử.

CPU Rendering trên nền tảng di động

Nền tảng di động triển khai CPU Rendering có tính đến kiến trúc ARM và mức tiêu thụ điện năng hạn chế. Hãy xem cách kết xuất phần mềm hoạt động trên Android và iOS.

Android: Canvas trên CPU

Android Canvas khi tắt tăng tốc phần cứng hoạt động hoàn toàn trên CPU. Lớp Canvas chứa các phương thức vẽ nguyên thủy được thực thi thông qua Skia — thư viện 2D của Google. Skia hỗ trợ backend phần mềm và GPU, chuyển đổi dựa trên cờ hardwareAccelerated.

Canvas phần mềm tạo Bitmap trong RAM, vẽ các lệnh lên đó thông qua Skia Software Renderer và sau đó xuất ra màn hình. Tất cả các thao tác được thực hiện trên CPU sử dụng lệnh NEON để tối ưu hóa. Theo Skia Team (2025), tăng tốc NEON mang lại mức tăng 40–60% cho các thao tác blend và mặt nạ.

kotlin
// Kết xuất phần mềm qua 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 được tạo trong bộ nhớ CPU, các lệnh vẽ được thực thi trên đó, sau đó hình ảnh hoàn chỉnh được hiển thị qua ImageView. Cách tiếp cận này được sử dụng cho watermarking, biểu đồ và hình ảnh động nơi kiểm soát hoàn toàn từng pixel là quan trọng.

iOS: Core Graphics trên CPU

Core Graphics là framework của Apple cho đồ họa raster và vector, hoạt động chủ yếu trên CPU. CGContext thực hiện tất cả các thao tác vẽ ở chế độ phần mềm, sử dụng các thư viện được tối ưu hóa cao của Apple. Core Graphics cung cấp sức mạnh cho Quartz 2D — một engine với 25 năm lịch sử.

Trên iOS, Core Graphics chuyển kết quả đến Core Animation để tổng hợp trên GPU. Theo Apple Engineering (2025), Core Graphics xử lý 80% vẽ UI trên CPU trong UIKit, trong khi tổng hợp Metal tập hợp các kết cấu sẵn sàng trên GPU. UIGraphicsImageRenderer là một wrapper hiện đại cho kết xuất hình ảnh raster dựa trên CPU.

Tối ưu hóa kết xuất phần mềm

Tối ưu hóa CPU Rendering rất quan trọng đối với hiệu suất vì kết xuất phần mềm là người tiêu thụ chính các chu kỳ CPU trong các framework UI. Hãy xem xét các phương pháp chính để tăng tốc vẽ phần mềm.

Lưu đệm kết quả

Phương pháp hiệu quả nhất là không vẽ lại những gì không thay đổi. Nếu nội dung tĩnh, hãy kết xuất nó một lần vào Bitmap hoặc CGLayer và sao chép kết quả sẵn sàng. Trong Android, điều này được triển khai thông qua View.setLayerType(LAYER_TYPE_SOFTWARE) với Bitmap được lưu đệm. Trong iOS — thông qua drawsAsynchronously và CALayer.shouldRasterize.

Giảm thiểu vùng vẽ lại

Sử dụng dirty rectangles — theo dõi vùng màn hình nào đã thay đổi và chỉ vẽ lại chúng. Android ViewSystem tự động tính toán vùng không hợp lệ. iOS CALayer sử dụng setNeedsDisplayInRect để giới hạn vùng vẽ lại.

Thao tác bit và SSE/NEON

Đối với các thao tác pixel (blend, mặt nạ), hãy sử dụng lệnh SIMD của CPU. Android Skia tự động sử dụng NEON cho bộ xử lý ARM. iOS Core Graphics được vector hóa thông qua framework Accelerate. Theo Google (2025), các thao tác blend được tối ưu hóa NEON trong Skia chạy nhanh hơn 3–5 lần so với mã vô hướng.

cpp
// Pha trộn pixel tối ưu hóa 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);
    }
}

Các lệnh NEON xử lý 16 pixel (128 bit) trong một thao tác. Kết hợp với pipeline ARM Cortex-X4, điều này cung cấp thông lượng lên đến 500 triệu pixel mỗi giây cho sao chép và pha trộn phần mềm — đủ cho màn hình FullHD ở 60 FPS.

Câu hỏi thường gặp

Khi nào CPU Rendering nhanh hơn GPU?

CPU Rendering nhanh hơn GPU với số lượng nguyên thủy nhỏ (tới 500) do không có chi phí truyền dữ liệu và biên dịch shader. Đối với màn hình UI có 50–100 View, kết xuất phần mềm thường mất ít thời gian hơn pipeline GPU.

Tại sao UI trong Android được vẽ trên CPU?

Hệ thống Android View vẽ trên CPU để kết xuất xác định — mỗi pixel khớp chính xác với mã mà không có sai số GPU. Sau khi vẽ, các lớp được chuyển đến HWUI để tổng hợp GPU, kết hợp độ chính xác của CPU với hiệu suất của GPU.

CPU Rendering có thể thay thế GPU cho đồ họa 3D không?

Đối với đồ họa 3D thời gian thực, CPU Rendering không hiệu quả. GPU kết xuất 100 triệu tam giác mỗi giây, CPU — 5–10 triệu. Ngoại lệ là kết xuất các khung hình riêng lẻ để xem trước hoặc xuất, nơi tính xác định quan trọng hơn tốc độ.

Làm thế nào để kiểm tra ứng dụng có đang chạy ở chế độ CPU Rendering không?

Trên Android, sử dụng Profile GPU Rendering trong Tùy chọn nhà phát triển. Trên iOS — Core Animation profiler trong Instruments. Thanh màu xanh lá trên 16 ms cho thấy độ trễ kết xuất CPU. Cũng kiểm tra cờ hardwareAccelerated trong tệp kê khai Android.

Skia là gì và nó liên quan thế nào đến CPU Rendering?

Skia là thư viện đồ họa 2D của Google được sử dụng trong Android, Chrome và Flutter. Skia hỗ trợ backend phần mềm và GPU. Ở chế độ CPU, nó thực hiện tất cả các thao tác thông qua Software Renderer được tối ưu hóa sử dụng lệnh NEON.

Tổng kết

  • CPU Rendering là phương pháp vẽ phần mềm với kiểm soát hoàn toàn từng pixel và kết quả xác định.
  • Lợi ích của CPU: dự đoán được, dễ gỡ lỗi, hoạt động trên thiết bị không có GPU và tương thích với API cũ.
  • Nhược điểm: song song hạn chế 4–12 luồng và hiệu suất thấp trên đồ họa 3D phức tạp.
  • Framework UI Android View và iOS UIKit sử dụng kết xuất CPU cho các khung hình đầu tiên và chế độ dự phòng.
  • SkiaCore Graphics là các thư viện kết xuất phần mềm chính trên nền tảng di động.
  • Tối ưu hóa bao gồm lưu đệm Bitmap, dirty rectangles và lệnh SIMD NEON/SSE cho thao tác pixel.
  • Lựa chọn CPU hay GPU phụ thuộc vào độ phức tạp của cảnh: cho UI và đồ họa 2D CPU hiệu quả hơn, cho 3D — GPU là cần thiết.

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm