CPU Rendering: 개념, 원리 및 소프트웨어 렌더링 작동 방식

저자: IT Sectr 게시일: 2026-06-11 읽는 시간: 8 분

CPU Rendering(소프트웨어 렌더링)은 GPU를 사용하지 않고 중앙 프로세서가 이미지를 형성하는 프로세스입니다. 이 모드에서는 변환, 래스터화 및 텍스처링의 모든 계산이 그래픽 파이프라인이 아닌 소프트웨어 알고리즘을 통해 CPU에서 수행됩니다. Apple Developer Documentation(2025)에 따르면 소프트웨어 렌더링은 GPU 컨텍스트 초기화 전에 애플리케이션을 시작할 때 100%의 경우에 사용되며 iOS에서 UI 프레임워크의 기본 모드로 남아 있습니다. 개발자는 호환성과 결정론이 중요한 작업에 CPU Rendering을 선택합니다.

핵심 사항

  • CPU Rendering — 그래픽 가속기 없이 CPU에서 수행되는 소프트웨어 드로잉.
  • 장점: 결정론, 쉬운 디버깅, GPU 없이 장치에서 작동, 완전한 픽셀 제어.
  • 단점: 복잡한 그래픽에서 낮은 성능, 높은 전력 소비, 제한된 병렬성.
  • 사용처: 프레임워크 UI 렌더링(Android View, UIKit), SVG 렌더링, PDF 및 애플리케이션 초기 프레임.
  • 최적화 소프트웨어 렌더링에는 결과 캐싱, 다시 그리기 최소화 및 비트 연산 사용이 포함됩니다.

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–10ms에 처리합니다. 래스터화는 가장 무거운 단계로, 각 삼각형의 픽셀 적용 범위 계산이 필요합니다.

모바일 프로세서에서 ARM NEON은 128비트 너비의 벡터 명령어를 통해 소프트웨어 렌더링을 가속화합니다. ARM(2025)에 따르면 NEON 최적화 소프트웨어 렌더러는 동일한 클록 주파수에서 Cortex-X4의 스칼라 구현보다 3–4배 빠르게 실행됩니다.

소프트웨어 렌더링 작동 방식

소프트웨어 렌더링은 CPU에서 장면을 준비하는 것으로 시작됩니다: 지오메트리(정점, 폴리곤)가 행렬 연산을 통해 월드 좌표에서 스크린 좌표로 변환됩니다. 그런 다음 클리핑이 수행됩니다 — 카메라 시야 밖의 지오메트리를 제거합니다.

CPU 래스터화는 스캔라인 알고리즘 또는 무게 중심 좌표를 사용하여 각 삼각형을 픽셀로 분할합니다. 각 픽셀에 대해 텍스처, 조명 및 투명도를 고려하여 색상이 계산됩니다. 결과는 프레임버퍼(RAM의 픽셀 배열)에 기록됩니다.

GPU 렌더링과의 주요 차이점은 픽셀 수준에서 병렬성 부족입니다. CPU는 픽셀을 순차적으로 또는 4–8개 코어에서 제한된 병렬성으로 처리합니다. 텍스처링이 포함된 1080p 프레임(200만 픽셀)의 경우 CPU에서 15–30ms가 필요한 반면 GPU에서는 2–5ms가 필요합니다.

cpp
// 단일 삼각형의 단순화된 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와 GPU 렌더링 비교

CPU Rendering과 GPU Rendering의 차이는 프로세서 아키텍처에 의해 결정됩니다. CPU는 분기 예측을 통한 순차 작업에 최적화되어 있고, GPU는 수천 개의 스레드를 사용한 대규모 병렬 처리에 최적화되어 있습니다. 이 근본적인 차이가 각 접근 방식의 적용 영역을 결정합니다.

매개변수CPU RenderingGPU Rendering
병렬성4–12 스레드512–4096 스레드
FLOPS50–200 GFLOPS500–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–3ms가 소요되는 반면 GPU의 하드웨어 가속에서는 3–5ms가 소요됩니다.

CPU Rendering 사용처

소프트웨어 렌더링은 GPU를 사용할 수 없거나, 불필요하거나, 필요한 결정론을 제공하지 않는 시나리오에서 계속 수요가 있습니다. 현대 개발에서 CPU Rendering의 주요 적용 분야를 살펴보겠습니다.

UI 프레임워크 및 프레임 준비

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 및 벡터 그래픽

SVG 렌더링은 전통적으로 CPU에서 수행됩니다. 복잡한 베지어 곡선을 구성하고 채우기 때문입니다. librsvg 및 Skia와 같은 라이브러리는 CPU에서 SVG를 처리하여 곡선을 삼각형으로 분할하고 채웁니다. Google Chrome Team(2025)에 따르면 Skia는 CPU에서 최신 모바일 프로세서의 SVG 아이콘을 0.3–1.5ms에 렌더링합니다.

PDF 렌더링

PDF 문서에는 글꼴, 벡터 요소, 래스터 이미지 및 변환과 같은 복잡한 중첩 그래픽이 포함되어 있습니다. 모바일 애플리케이션은 PDFKit(iOS) 및 PdfRenderer(Android)와 같은 프레임워크를 통해 CPU에서 PDF를 렌더링합니다. 디스플레이 정확성 및 PDF 2.0 표준 지원을 위해서는 각 요소의 소프트웨어 처리가 필요합니다.

모바일 플랫폼에서의 CPU Rendering

모바일 플랫폼은 ARM 아키텍처와 제한된 전력 소비를 고려하여 CPU Rendering을 구현합니다. Android 및 iOS에서 소프트웨어 렌더링이 어떻게 작동하는지 살펴보겠습니다.

Android: CPU의 Canvas

Android Canvas는 하드웨어 가속이 비활성화된 경우 완전히 CPU에서 작동합니다. Canvas 클래스에는 Google의 2D 라이브러리인 Skia를 통해 실행되는 프리미티브 그리기 메서드가 포함되어 있습니다. Skia는 소프트웨어 및 GPU 백엔드를 지원하며 hardwareAccelerated 플래그에 따라 전환됩니다.

소프트웨어 Canvas는 RAM에 Bitmap을 생성하고 Skia Software Renderer를 통해 그 위에 명령을 그린 다음 화면에 출력합니다. 모든 작업은 최적화를 위해 NEON 명령어를 사용하여 CPU에서 수행됩니다. Skia Team(2025)에 따르면 NEON 가속은 블렌드 및 마스킹 작업에서 40–60%의 향상을 제공합니다.

kotlin
// 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를 통해 표시됩니다. 이 접근 방식은 모든 픽셀을 완전히 제어하는 것이 중요한 워터마킹, 차트 및 동적 이미지에 사용됩니다.

iOS: CPU의 Core Graphics

Core Graphics는 주로 CPU에서 작동하는 Apple의 래스터 및 벡터 그래픽 프레임워크입니다. CGContext는 Apple의 고도로 최적화된 라이브러리를 사용하여 소프트웨어 모드에서 모든 그리기 작업을 수행합니다. Core Graphics는 25년 역사의 엔진인 Quartz 2D를 구동합니다.

iOS에서 Core Graphics는 결과를 Core Animation에 전달하여 GPU에서 합성합니다. Apple Engineering(2025)에 따르면 Core Graphics는 UIKit에서 UI 그리기의 80%를 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를 사용합니다.

비트 연산 및 SSE/NEON

픽셀 작업(블렌드, 마스킹)에는 CPU의 SIMD 명령어를 사용합니다. Android Skia는 ARM 프로세서에 대해 자동으로 NEON을 사용합니다. iOS Core Graphics는 Accelerate 프레임워크를 통해 벡터화됩니다. Google(2025)에 따르면 Skia에서 NEON 최적화 블렌드 작업은 스칼라 코드보다 3–5배 빠르게 실행됩니다.

cpp
// 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 파이프라이닝과 결합하여 소프트웨어 복사 및 블렌딩에서 초당 최대 5억 픽셀의 처리량을 제공합니다 — 60FPS의 FullHD 화면에 충분합니다.

자주 묻는 질문

CPU Rendering이 GPU보다 빠른 경우는?

CPU Rendering은 프리미티브 수가 적은 경우(최대 500개) 데이터 전송 및 셰이더 컴파일 오버헤드가 없기 때문에 GPU보다 빠릅니다. 50–100개의 View가 있는 UI 화면의 경우 소프트웨어 렌더링이 GPU 파이프라인보다 시간이 덜 소요되는 경우가 많습니다.

Android에서 UI가 CPU에서 그려지는 이유는?

Android View 시스템은 결정론적 렌더링을 위해 CPU에서 그립니다 — 모든 픽셀이 GPU 부정확성 없이 코드와 정확히 일치합니다. 그리기 후 레이어는 GPU 합성을 위해 HWUI로 전달되어 CPU 정확성과 GPU 성능을 결합합니다.

CPU Rendering이 3D 그래픽에서 GPU를 대체할 수 있나요?

실시간 3D 그래픽의 경우 CPU Rendering은 비효율적입니다. GPU는 초당 1억 개의 삼각형을 렌더링하는 반면 CPU는 500만–1000만 개입니다. 예외는 결정론이 속도보다 중요한 미리보기 또는 내보내기용 개별 프레임 렌더링입니다.

앱이 CPU Rendering 모드에서 실행 중인지 확인하는 방법은?

Android에서는 개발자 옵션의 Profile GPU Rendering을 사용합니다. iOS에서는 Instruments의 Core Animation 프로파일러를 사용합니다. 16ms 이상의 녹색 막대는 CPU 렌더링 지연을 나타냅니다. Android 매니페스트의 hardwareAccelerated 플래그도 확인하세요.

Skia란 무엇이며 CPU Rendering과 어떤 관련이 있나요?

Skia는 Android, Chrome 및 Flutter에서 사용되는 Google의 2D 그래픽 라이브러리입니다. Skia는 소프트웨어 및 GPU 백엔드를 지원합니다. CPU 모드에서는 NEON 명령어를 사용하여 최적화된 Software Renderer를 통해 모든 작업을 수행합니다.

요약

  • CPU Rendering은 모든 픽셀을 완전히 제어하고 결정론적 결과를 제공하는 소프트웨어 드로잉 방법입니다.
  • CPU 장점: 예측 가능성, 쉬운 디버깅, GPU 없는 장치에서 작동, 이전 API와의 호환성.
  • 단점: 4–12개 스레드의 제한된 병렬성 및 복잡한 3D 그래픽에서 낮은 성능.
  • UI 프레임워크 Android View 및 iOS UIKit은 초기 프레임 및 폴백 모드에 CPU 렌더링을 사용합니다.
  • SkiaCore Graphics는 모바일 플랫폼의 주요 소프트웨어 렌더링 라이브러리입니다.
  • 최적화에는 Bitmap 캐싱, dirty rectangles 및 픽셀 작업용 NEON/SSE SIMD 명령어가 포함됩니다.
  • CPU 또는 GPU 선택은 장면 복잡성에 따라 다릅니다: UI 및 2D 그래픽의 경우 CPU가 더 효율적이며 3D의 경우 GPU가 필요합니다.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기