자주자주 공지를 확인하세요!

Skia

2D 그래픽스 라이브러리
범용
(크로스 플랫폼)
Skia Skia · Cairo Cairo · ThorVG ThorVG · Blend2D · Anti-Grain Geometry · Pixman
운영체제
네이티브
Direct2D · GDI+ · GDI (Windows) · Core Graphics (Quartz 2D, macOS·iOS)
프레임워크
내장 렌더러
Impeller Impeller (플러터) · Qt QPainter (Qt) · Java 2D
GPU 컴퓨트·
Rust 계열
Vello Vello · tiny-skia · Pathfinder
관련 기술 래스터화 · 벡터 그래픽스 · 안티에일리어싱 · OpenGL · Vulkan · Metal · Direct3D · WebGPU
Skia
Skia의 로고
원작자 마이크 리드(Mike Reed), 캐리 클라크(Cary Clark) / Skia Inc.
개발자 구글
발표일 2008년 9월 (오픈 소스 공개)
버전 정보 크롬과 같은 마일스톤(m) 번호로 약 4주마다 릴리스 브랜치 생성
개발 상태 개발 중
프로그래밍 언어 C++, SkSL
운영 체제 Windows, macOS, 리눅스, 안드로이드, iOS, ChromeOS, WebAssembly(CanvasKit) 등
종류 2D 그래픽스 라이브러리, 렌더링 엔진
라이선스 3조항 BSD 라이선스
웹 사이트 skia.org

개요[편집 / 원본 편집]

Skia(스키아)는 구글이 개발·관리하는 오픈 소스 2D 그래픽스 라이브러리다. 도형(선, 사각형, 원, 곡선 경로), 텍스트, 이미지, 그라디언트, 필터 등 화면에 그려지는 거의 모든 2D 요소를 실제 픽셀로 바꾸는 일, 즉 래스터화(rasterization)를 담당한다. C++로 작성되었으며 3조항 BSD 라이선스로 배포된다.

이름만 들으면 생소하지만, 사실 전 세계에서 가장 많이 실행되는 그래픽 코드 중 하나다. 구글 크롬과 크로미움 기반 브라우저(마이크로소프트 엣지, 네이버 웨일, 오페라, 브레이브, 비발디 등), ChromeOS, 안드로이드의 UI 렌더링, 파이어폭스의 일부 그리기 경로, 플러터(웹 버전 및 구형 기기), 리브레오피스 등이 Skia 위에서 화면을 그린다. 즉, 지금 이 문서를 크롬 계열 브라우저나 안드로이드 폰으로 보고 있다면 글자 하나하나가 Skia를 통해 그려지고 있는 셈이다.

Skia 자체는 창을 띄우거나 입력을 처리하지 않는 순수한 그리기 엔진이다. 운영체제나 GPU API(OpenGL, Vulkan, Metal, Direct3D 등)의 차이를 감추고, 어느 플랫폼에서든 같은 코드로 같은 결과를 그려 주는 추상화 계층 역할을 한다.

명칭[편집 / 원본 편집]

'Skia'는 그리스어로 '그림자'를 뜻하는 단어 σκιά(스키아)에서 따온 것으로 알려져 있다. 소스 코드 안의 모든 클래스 이름이 SkCanvas, SkPaint, SkPath처럼 Sk로 시작하는 것도 이 이름에서 비롯된 것이다. 한국어로는 보통 '스키아'라고 읽는다.

역사[편집 / 원본 편집]

Skia Inc. 시절[편집 / 원본 편집]

Skia는 원래 2004년 미국 노스캐롤라이나주 채플힐에서 마이크 리드(Mike Reed)와 캐리 클라크(Cary Clark)가 공동 설립한 회사 Skia Inc.의 제품이었다.[1] 당시 목표는 휴대전화, 셋톱박스 같은 메모리와 CPU가 빈약한 임베디드 기기에서도 고품질 2D 그래픽을 낼 수 있는 작고 빠른 엔진을 만드는 것이었다. 안티에일리어싱, 경로 그리기, 비트맵 처리 등을 적은 자원으로 해내는 것이 핵심이었다.

구글 인수와 오픈 소스화[편집 / 원본 편집]

2005년 구글이 Skia Inc.를 인수했다. 마침 구글은 모바일 운영체제 안드로이드를 준비하던 중이었고, Skia는 안드로이드의 2D 그래픽 엔진으로 채택되었다. 이후 2008년 구글은 Skia를 BSD 라이선스 오픈 소스로 공개했으며, 같은 해 9월 출시된 구글 크롬의 그래픽 엔진으로도 쓰였다. 크롬 초기 개발 블로그에서도 Skia가 크롬의 그래픽을 처음부터 담당했다고 소개하고 있다.[2]

GPU 가속: Ganesh[편집 / 원본 편집]

초기의 Skia는 CPU만으로 픽셀을 계산하는 소프트웨어 래스터라이저였다. 그러나 웹 페이지가 점점 복잡해지고 애니메이션·고해상도 화면이 보편화되면서 CPU만으로는 한계에 부딪혔다. 이에 구글은 GPU로 그림을 그리는 백엔드 Ganesh를 개발했다. Ganesh는 OpenGL을 중심으로 설계되었고, 이후 Vulkan, Metal, Direct3D 12 백엔드도 추가되었다. 크롬은 Ganesh를 이용해 모든 플랫폼에서 GPU 래스터화를 적용했다(Windows에서는 ANGLE을 통해 Direct3D로 변환).[2]

안드로이드 역시 Android 3.0(허니콤)부터 UI 하드웨어 가속을 도입했고, Android 8~9 무렵부터는 UI 렌더러(HWUI)가 Skia의 GPU 백엔드를 통해 그리는 구조로 바뀌었다.

차세대 백엔드: Graphite[편집 / 원본 편집]

Ganesh는 10년 넘게 크롬의 그래픽을 책임졌지만, OpenGL 시대에 설계된 태생적 한계가 있었다. 명령 처리가 사실상 단일 스레드에 묶여 있었고, 특수한 경우를 처리하는 코드 경로가 너무 많아져 Vulkan, Metal, Direct3D 12 같은 현대적 저수준 그래픽 API의 장점을 제대로 살리기 어려웠다. 그래서 Skia 팀은 GPU 래스터화를 처음부터 다시 설계한 새 백엔드 Graphite를 개발했다.[2]

Graphite의 주요 특징은 다음과 같다.

  • 멀티스레드 기본 설계 - 여러 개의 독립된 Recorder가 각기 다른 스레드에서 그리기 명령을 기록(Recording)하고, 이를 모아 GPU에 제출한다. GPU 메인 스레드에 작업이 몰려 버벅이는 문제를 줄인다.
  • 2D에 깊이 테스트 도입 - 원래 3D 그래픽에서 쓰는 깊이 버퍼(Z 버퍼)를 2D 그리기에도 활용한다. 각 그리기 명령에 Z값을 부여해, 불투명한 물체 뒤에 가려지는 픽셀은 아예 그리지 않음으로써 오버드로(같은 픽셀을 여러 번 덧칠하는 낭비)를 크게 줄였다.
  • 파이프라인 사전 컴파일 - 필요한 셰이더 파이프라인을 미리 컴파일해 두어, 처음 보는 효과가 등장할 때 셰이더를 컴파일하느라 화면이 순간적으로 멈추는 셰이더 컴파일 끊김(jank)을 방지한다.
  • Dawn 활용 - 크롬에서는 크롬의 WebGPU 구현체인 Dawn을 추상화 계층으로 사용해, Metal·Vulkan·Direct3D 백엔드를 Graphite가 직접 구현하지 않고 Dawn의 검증된 구현을 재사용한다.

2025년 7월, 크롬 138에서 Graphite가 Apple Silicon 맥에 기본 적용되었다. 구글은 M3 맥북 프로 기준 벤치마크 MotionMark 1.3 점수가 약 15% 올랐고, INP(상호작용 후 다음 화면까지의 시간), LCP(최대 콘텐츠 표시 시간), 프레임 드롭 비율, GPU 프로세스 메모리 사용량 등 실사용 지표도 개선되었다고 밝혔다.[2] 이후 2025년 말 기준 맥용 크롬 전체에서 기본값이 되었고, Windows(Dawn의 D3D11/D3D12 경로)와 안드로이드(Vulkan 1.1 기기)로 확대 적용이 진행 중이다. Graphite를 쓸 수 없는 구형 하드웨어·드라이버 환경에서는 여전히 Ganesh가 대체 경로로 쓰인다.[3]

플러터의 이탈[편집 / 원본 편집]

구글의 크로스 플랫폼 UI 프레임워크 플러터는 출시 때부터 Skia로 화면을 그려 왔다. 하지만 Skia(Ganesh)가 셰이더를 실행 중에 컴파일하면서 생기는 첫 애니메이션 끊김이 플러터의 고질병으로 꼽혔고, 결국 플러터 팀은 자체 렌더러 Impeller를 개발했다. Impeller는 셰이더를 앱 빌드 시점에 미리 컴파일해 이 문제를 구조적으로 없앴다.

  • iOS - 플러터 3.10부터 Impeller가 기본이 되었고, 3.29(2025년 2월)에서 Skia 경로가 완전히 제거되었다.
  • 안드로이드 - 플러터 3.27(2024년 12월)부터 API 29(안드로이드 10) 이상 기기에서 Impeller가 기본이며, Skia로 되돌리는 옵션은 3.38부터 사용 중단(deprecated) 경고가 뜬다. 안드로이드 9 이하 기기 등 일부 환경에서는 아직 Skia가 쓰인다.[4]
  • 웹 - 플러터 웹은 여전히 Skia를 WebAssembly로 컴파일한 CanvasKit/skwasm을 렌더러로 쓴다.

같은 구글 안에서도 "범용 2D 엔진(Skia)"과 "특정 프레임워크 전용 렌더러(Impeller)"의 길이 갈린 사례로 자주 언급된다.

메모리 안전성 강화[편집 / 원본 편집]

Skia는 웹에서 받아 온 신뢰할 수 없는 데이터(이미지, 폰트, SVG 등)를 직접 다루기 때문에 보안 취약점의 주요 표적이 된다. 실제로 2023년에는 Skia의 정수 오버플로 취약점(CVE-2023-2136 등)이 실제 공격에 악용된 크롬 제로데이로 긴급 패치되기도 했다. 이에 구글은 위험한 부분을 Rust로 교체하는 작업을 진행 중이다.

대표적인 것이 폰트 처리다. Skia는 원래 글꼴 파일을 읽고 글자 윤곽선을 불러올 때 C로 작성된 FreeType에 의존했는데, 구글은 이를 대체하기 위해 Rust로 작성된 Fontations 라이브러리군(그중 Skrifa)과 이를 쓰는 새 Skia 폰트 백엔드를 만들었다. 크롬 128(2024년 8월)에서 컬러 폰트 등 일부 형식에 먼저 적용했고, 크롬 133(2025년 2월)부터는 리눅스·안드로이드·ChromeOS의 모든 웹 폰트와 Windows·macOS의 일부 웹 폰트를 Skrifa가 처리한다.[5] 구글은 FreeType 퍼징으로 나오는 문제를 따라잡는 데만 엔지니어 0.25명분 이상의 인력이 들었다고 밝히기도 했다.

구조[편집 / 원본 편집]

핵심 API[편집 / 원본 편집]

Skia의 API는 "도화지에 붓으로 그린다"는 비유로 이해하면 쉽다.

클래스 역할
SkCanvas 그리기 명령을 받는 캔버스. drawRect, drawPath, drawText, drawImage 등의 메서드를 가진다.
SkPaint 붓에 해당. 색상, 선 두께, 안티에일리어싱 여부, 블렌드 모드, 셰이더, 필터 등을 지정한다.
SkPath 직선과 베지어 곡선으로 이루어진 임의의 도형 경로.
SkSurface 실제로 픽셀이 기록되는 대상(CPU 메모리 또는 GPU 텍스처).
SkImage 변경 불가능한 이미지 객체. CPU·GPU 어느 쪽에 있든 같은 방식으로 다룬다.
SkShader 그라디언트, 이미지 패턴, 노이즈 등 채우기 방식.
SkPicture 그리기 명령을 녹화해 두었다가 나중에 다시 재생할 수 있는 객체. 크롬이 웹 페이지 그리기 명령을 기록하고 별도 프로세스에서 재생하는 데 쓰인다.
SkFont / SkTypeface 글꼴과 글자 모양 정보.

간단한 예시는 다음과 같다.

#include "include/core/SkCanvas.h"
#include "include/core/SkPaint.h"
#include "include/core/SkSurface.h"

void draw(SkCanvas* canvas) {
    SkPaint paint;
    paint.setAntiAlias(true);
    paint.setColor(SK_ColorBLUE);
    canvas->drawCircle(128, 128, 64, paint);   // 파란 원

    paint.setStyle(SkPaint::kStroke_Style);
    paint.setStrokeWidth(4);
    paint.setColor(SK_ColorRED);
    canvas->drawRect(SkRect::MakeXYWH(32, 32, 192, 192), paint);  // 빨간 테두리
}

백엔드[편집 / 원본 편집]

같은 그리기 명령을 여러 출력 대상으로 보낼 수 있다는 것이 Skia의 큰 장점이다.

백엔드 설명
CPU 래스터 GPU 없이 CPU로 직접 픽셀을 계산한다. SIMD 명령어를 적극 활용하며, GPU를 쓸 수 없는 환경의 대체 경로이자 정확도 기준(레퍼런스)으로 쓰인다.
Ganesh 기존 GPU 백엔드. OpenGL/OpenGL ES, Vulkan, Metal, Direct3D 12를 지원한다. 신규 기능 개발은 Graphite로 옮겨 갔지만, 크롬 이외의 많은 프로젝트와 구형 환경에서 여전히 주력으로 쓰인다.
Graphite 차세대 GPU 백엔드. Metal, Vulkan, Dawn(WebGPU)을 지원하며 OpenGL은 지원하지 않는다.
PDF 그리기 명령을 PDF 파일로 출력한다. 크롬의 'PDF로 저장'·인쇄 기능이 이것을 쓴다.
SVG SVG 파일로 출력한다(실험적).
XPS Windows용 XPS 문서로 출력한다.

SkSL[편집 / 원본 편집]

SkSL(Skia Shading Language)은 Skia 전용 셰이더 언어다. GLSL과 비슷한 문법으로 작성하면 Skia가 이를 각 백엔드에 맞게 GLSL, MSL(Metal), SPIR-V(Vulkan), WGSL(WebGPU), HLSL 등으로 변환한다. 개발자는 런타임 이펙트(SkRuntimeEffect)를 통해 직접 작성한 SkSL 셰이더를 실행 중에 불러와 사용자 정의 효과를 만들 수 있다. 안드로이드 13의 RuntimeShader API와 플러터의 프래그먼트 셰이더 기능이 이 구조 위에 만들어졌다.

부가 모듈[편집 / 원본 편집]

  • CanvasKit - Skia를 WebAssembly로 컴파일해 웹 브라우저에서 WebGL·WebGPU로 그릴 수 있게 한 라이브러리. 플러터 웹이 대표적인 사용처다.
  • Skottie - 에어비앤비가 만든 애니메이션 형식 로티(Lottie)를 Skia로 재생하는 모듈. 안드로이드와 크롬 등에서 쓰인다.
  • SkParagraph - 여러 줄 텍스트 배치(줄바꿈, 양방향 텍스트, 글꼴 대체)를 처리하는 모듈. 내부적으로 하프버즈(HarfBuzz)와 ICU를 사용한다.
  • SVG 렌더러 - SVG 파일을 읽어 Skia로 그리는 모듈.
  • 이미지 코덱 - PNG, JPEG, WebP, GIF, AVIF 등의 이미지를 디코딩한다.

개발 방식[편집 / 원본 편집]

  • 저장소는 skia.googlesource.com이며, GitHub에 미러가 있다.
  • 빌드는 크로미움과 같은 GN + Ninja를 쓰며, Bazel 빌드도 지원한다.
  • 크롬과 같은 마일스톤 번호(m)를 쓰며, 크롬 릴리스 주기에 맞춰 약 4주마다 릴리스 브랜치를 만든다. 예를 들어 크롬 147에 들어간 Skia는 'Skia m147'이다. 별도의 '버전 1.0, 2.0' 같은 번호 체계는 없고, 외부 프로젝트들도 "Skia m○○ 기반"이라는 식으로 버전을 표기한다.
  • API가 자주 바뀌고 하위 호환성을 엄격히 보장하지 않기 때문에, 외부 프로젝트가 Skia를 업데이트하려면 상당한 수정이 필요한 경우가 많다. SkiaSharp가 수년간 업데이트를 미뤄 온 이유도 이것이다.

사용처[편집 / 원본 편집]

구글 제품[편집 / 원본 편집]

외부 프로젝트[편집 / 원본 편집]

  • 파이어폭스 - 그래픽 추상화 계층(Moz2D) 아래에서 캔버스 2D와 일부 콘텐츠 그리기에 Skia를 사용한다.
  • 리브레오피스 - 7.x 버전부터 Windows 등에서 Skia(Vulkan 또는 CPU 래스터) 기반 렌더링을 도입했다.
  • Ladybird - 독자 엔진을 개발하는 오픈 소스 브라우저 래디버드도 2024년 자체 그래픽 코드 대신 Skia를 그리기 엔진으로 채택했다.
  • SkiaSharp - 마이크로소프트와 Uno Platform이 관리하는 .NET용 Skia 바인딩. .NET MAUI, Avalonia, Uno Platform 등 .NET UI 프레임워크의 기반이 된다. 2026년 6월 Skia m148 기반의 SkiaSharp 4.0(4.148.0)이 정식 출시되었고, 이후 패키지 버전을 Skia 마일스톤에 맞추는 방식으로 바뀌었다.[6]
  • Skiko - 젯브레인이 만든 코틀린/JVM용 Skia 바인딩. 데스크톱·iOS·웹용 Compose Multiplatform이 이를 통해 화면을 그린다.
  • React Native Skia - 쇼피파이가 관리하는 리액트 네이티브용 Skia 바인딩. 2026년 현재 Graphite 백엔드를 실험 기능으로 제공한다.
  • 그 밖에 파이썬용 skia-python, Rust용 rust-skia 등 다양한 언어 바인딩이 있다.

보안[편집 / 원본 편집]

Skia는 웹 페이지가 마음대로 조작할 수 있는 입력(도형, 이미지, 폰트, 캔버스 명령)을 처리하기 때문에, 크롬 보안 업데이트에 단골로 등장한다. 크롬은 렌더러 프로세스를 샌드박스에 가두고 실제 GPU 작업은 별도의 GPU 프로세스에서 처리하는데, Skia의 GPU 백엔드는 이 GPU 프로세스 안에서 동작하므로 여기서 메모리 오류가 나면 샌드박스 탈출의 발판이 될 수 있다.

예를 들어 2026년 4월 발표된 CVE-2026-6304는 Graphite 백엔드의 해제 후 사용(Use-After-Free) 취약점으로, 렌더러를 이미 장악한 공격자가 샌드박스를 탈출하는 데 악용될 수 있는 높음(High) 등급 문제였다. 구글은 크롬 147.0.7727.101 업데이트로 이를 수정했으며, 같은 Skia를 쓰는 엣지, 브레이브, 오페라, 비발디 등 다른 크로미움 계열 브라우저도 후속 업데이트가 필요했다.[7] 이런 이유로 Skia는 구글의 퍼징 인프라(OSS-Fuzz 등)로 상시 검사되고 있으며, 앞서 언급한 Rust 전환도 같은 맥락이다.

비교[편집 / 원본 편집]

라이브러리 개발 주체 특징
Skia 구글 크롬·안드로이드 기반. CPU·GPU·PDF 등 다양한 백엔드
Cairo freedesktop.org GTK 등 리눅스 데스크톱에서 오래 쓰인 2D 라이브러리. 파이어폭스도 과거에 사용했다
Direct2D 마이크로소프트 Windows 전용 GPU 가속 2D API
Core Graphics(Quartz 2D) 애플 macOS·iOS의 기본 2D 엔진. 사파리(WebKit)가 사용
Impeller 구글(플러터 팀) 플러터 전용 렌더러. 셰이더 사전 컴파일이 특징
Vello Linebender Rust로 작성된 GPU 컴퓨트 기반 2D 렌더러. 연구 성격이 강하다

여담[편집 / 원본 편집]

  • 크롬, 엣지, 웨일처럼 서로 경쟁하는 브라우저들이 화면을 그리는 엔진은 사실상 모두 같은 Skia다. 그래서 Skia에 취약점이 생기면 크로미움 계열 브라우저 전체가 동시에 업데이트해야 한다.
  • 크롬 주소창에 chrome://gpu를 입력하면 현재 Skia가 어떤 백엔드(Ganesh/Graphite)로 동작하는지 확인할 수 있다.
  • 공식 사이트 skia.org에는 웹 브라우저에서 바로 Skia 코드를 작성하고 결과를 볼 수 있는 Skia Fiddle(fiddle.skia.org)이 있다.

관련 문서[편집 / 원본 편집]

외부 링크[편집 / 원본 편집]

각주[편집 / 원본 편집]

최근 바뀜

더 보기