Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Skia and Skija, Skiko [ja]
Search
Daichi Furiya (Wasabeef)
December 21, 2020
Programming
2.1k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Skia and Skija, Skiko [ja]
Daichi Furiya (Wasabeef)
December 21, 2020
More Decks by Daichi Furiya (Wasabeef)
See All by Daichi Furiya (Wasabeef)
DevFest Tokyo 2025 - Flutter のアプリアーキテクチャ現在地点
wasabeef
6
2.8k
About Flutter Architecture
wasabeef
1
320
2023 Flutter/Dart Summary
wasabeef
0
130
I/O Extended 2023 - Dart と Flutter の新機能
wasabeef
0
230
I/O Extended 2023 - Flutter 活用事例
wasabeef
10
3.1k
What it Takes to be a Flutter Developer
wasabeef
0
250
FlutterKaigi 2022 Keynote
wasabeef
1
720
Flutter Hooks を使ったアプリ開発 / App Development with the Flutter Hooks
wasabeef
2
1.5k
Flutter 2021 の振り返りと今後のアプリ開発に向けて / Looking back on Flutter 2021 and for future app development.
wasabeef
4
2.2k
Other Decks in Programming
See All in Programming
Agentic UI
manfredsteyer
PRO
0
160
RTSPクライアントを自作してみた話
simotin13
0
610
エージェンティックRAGにAWSで入門しよう!
har1101
8
1.6k
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
580
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
1.4k
TAKTでAI駆動開発の品質を設計する
j5ik2o
7
1.3k
Inside Stream API
skrb
1
720
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
130
Oxcを導入して開発体験が向上した話
yug1224
4
310
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
780
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
240
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
120
Featured
See All Featured
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
210
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
590
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
140
Site-Speed That Sticks
csswizardry
13
1.2k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.1k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
390
Heart Work Chapter 1 - Part 1
lfama
PRO
7
36k
Music & Morning Musume
bryan
47
7.2k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
180
Transcript
Skia and Skija, Skiko Daichi Furiya #ca_flutter_kmm
About me Daichi Furiya (降矢 大地) Google Developers Expert CyberAgent,
Inc. @wasabeef_jp wasabeef
None
None
Skia? • グラフィックライブラリ(エンジン) • Chrome, Android, Flutter, Firefox, .NET, Compose
for Desktop などで採用されている • Android 9 以降、デフォルトのレンダラーは Skia に なっている(8 と 9 で UI が変わった)
Supported platforms •Windows 7, 8, 8.1, 10 •macOS 10.10.5 or
later •iOS 8 or later •Android 4.1 (JellyBean) or later •Ubuntu 14.04+, Debian 8+, openSUSE 13.3+, or Fedora Linux 24+
Case: Skia + Flutter
Showcase Shapes ベジェ曲線 平行移動と回転 テキストレンダリング シェーダー パス
SkCanvas + SkPaint sample void draw(SkCanvas* canvas) { SkPaint p;
p.setColor(SK_ColorRED); p.setAntiAlias(true); p.setStyle(SkPaint:::kStroke_Style); p.setStrokeWidth(150); canvas->-drawLine(75, 75, 175, 175, p); } Android 寄りだけど、よくある Canvas API
SkCanvas - Backends •Raster - CPU-only. •GPU - Skia's GPU-accelerated
backend. •SkPDF - PDF document creation. •SkPicture - Skia's display list format. •NullCanvas - Useful for testing only. •SkXPS - Experimental XPS backend. •SkSVG - Experimental SVG backend. SkCanvas には複数のバックエンドが用意されている
GPU GPU には Skia のビルド時に Webkit/Canvas、 OpenGL、OpenGL ES、Vulkan、Metal などのモード を選択することができる。
Skia のメリット •コード量の削減(例:LibreOffice は 12k → 4k) •一貫性のある API •クロスプラットフォームの対応
•複数のバックエンドサポート Webkit/Canvas、OpenGL (ES)、Vulkan、Metal
Flutter Web でのデメリット •Webkit/Canvas でテキストを描画しているので、文 字列の選択などができない
Compose for Desktop
Compose for Desktop
Desktop アプリを作るということどういうことか 前提:クロスプラットフォーム パフォーマンスが高くない WASM は高速だが、JS + DOM はJVM よりもはるかに低速
• JVM はパフォーマンスは高い が、AWT、Swing、JavaFX はメ モリ割り当てしすぎないように気 をつけないといけない。 • OpenGL は難しい
Compose for Desktop fun main() { overrideSchedulers(main = Dispatchers.Main:::asScheduler) val
lifecycle = LifecycleRegistry() lifecycle.resume() Window("Todo") { Surface(modifier = Modifier.fillMaxSize()) { MaterialTheme { DesktopTheme { Text(“Hello World!!!”) } } } } } ほぼ Jetpack Compose になっている
None
Skija • JetBrains 開発 • Skia for Java (Java bindings
to Skia) • Graphics2D、GraphicsContext は古い • 最新の Typography 対応 • Vulkan* や Metal 対応
Skija が目指すところ • 自動でメモリ管理、リークなし • Java のコードスタイルに準拠 • Integer constants
よりも enum • Fluent API • Skija から ネイティブ Skia を感じさせない設計
Skija - build.gradle repositories { maven { url 'https:///packages.jetbrains.team/maven/p/skija/maven' }
} dependencies { /// macOS, windows, linux api “org.jetbrains.skija:skija-${platform}:0.1.+” } ↑ 各 OS 毎に Artifacts が分かれているのでビルド時に切り替えて使う
Skiko
Skiko? • JetBrains 開発 • Skia for Kotlin (Kotlin MP
bindings to Skia)
Skiko - build.gradle repositories { maven { url 'https:///packages.jetbrains.team/maven/p/ui/dev' }
} dependencies { /// macOS, windows, linux implementation “org.jetbrains.skiko:skiko-jvm-runtime-${platform}:0.1.+” } ↑ 各 OS 毎に Artifacts が分かれているのでビルド時に切り替えて使う
Skiko - App.kt fun main(args: Array<String>) { SkiaWindow().apply { layer.renderer
= Renderer { renderer, w, h ->- val canvas = renderer.canvas!!! val paint1 = Paint().setColor(0xffff0000.toInt()) /// ARGB canvas.drawRRect(RRect.makeLTRB(10f, 10f, w - 10f, h - 10f, 5f), paint1) val paint2 = Paint().setColor(0xff00ff00.toInt()) /// ARGB canvas.drawRRect(RRect.makeLTRB(30f, 30f, w - 30f, h - 30f, 10f), paint2) } setVisible(true) setSize(800, 600) } } SkiaWindow が UI のコンテナ になるので、その上で描画する
Skiko - SkiaLayer open class SkiaWindow : JFrame() { val
layer = SkiaLayer() init { contentPane.add(layer) addComponentListener(object : ComponentAdapter() { override fun componentResized(e: ComponentEvent) { layer.reinit() } }) } fun display() = layer.display() } javax.swing.JFrame を実装して SkiaLayer を渡しているだけ
Skiko - SkiaLayer open class SkiaLayer() : HardwareLayer() { open
val api: GraphicsApi = GraphicsApi.OPENGL /// ..... override fun draw() { if (!inited) { if (skijaState.context === null) { skijaState.context = when (api) { GraphicsApi.OPENGL ->- makeGLContext() GraphicsApi.METAL ->- makeMetalContext() else ->- TODO("Unsupported yet") } } renderer??.onInit() inited = true renderer??.onReshape(width, height) } initSkija() /// ..... } /// ..... } HardwareLayer はただの awt.Canvas で api: GraphicApi でコンテキストを変えている。 Skija が Vulkan の対応はまだ追いついていない 実際に draw している先は Skija Canvas。 ここから Skija の世界へ。
CanvasKit
CanvasKit • Skia for WebAssembly • WebGL のサポート
CanvasKit + Skottie • Lottie Animation Support
SkiaSharp
SkiaSharp .NET Standard 1.3 .NET Core Tizen Xamarin.Android Xamarin.iOS Xamarin.tvOS
Xamarin.watchOS Xamarin.Mac Windows Classic Desktop(Windows.Forms / WPF) Windows UWP (Desktop / Mobile / Xbox / HoloLens) Web Assembly (WASM) • Microsoft 開発
None
Kotlin MP App Skiko Skija Flutter App Flutter engine •
Android • iOS • Windows • macOS • Linux Skia • Android • Windows • macOS • Linux Skia • iOS?
twitter.com/wasabeef_jp wasabeef.jp github.com/wasabeef Thanks