2023年、Rustグラフィックス界隈(というかwgpu界隈)への期待

1年後どうなってるのかわからないけど、この気持ちを覚えているうちにメモっておきたいので書きます。

(注:私はRustを使うのが年間数日くらいのエアプ勢なので、たぶんいろいろ適当なことを書いていると思います。話半分で読んでいただければ...)

Rustのグラフィックス界隈とは

個人的な観測範囲では、Rustのグラフィックス界隈には主に3つの勢力があります。

  • Rustでウェブブラウザを作りたい勢
  • Rustでゲームを作りたい勢
  • RustでGUIを作りたい勢

Rustでウェブブラウザを作りたい勢

今やRustのグラフィックス界隈は、WebGPUのRust実装であるwgpuを重要な起点として成り立っています。 wgpuは、そしてWebGPUという規格自体も、MozillaFirefoxのために必要としたもので、Mozillaの寄与が大きいです。 なんですが、2020年にはMozillaが大規模なレイオフを行い、Servoのチームもその整理対象になったり*1、去年2月にはキーマンだったDzmitry Malyshau(kvark)氏がMozillaを去ってしまったりして、Mozillaの関与は昔よりは減っています。 特にkvark氏がMozillaを去ったのは衝撃でしたが、開発はちゃんとコミュニティに引き継がれています(kvark氏も引き続き開発には関わっています)。

Rustでゲームを作りたい勢

Rustでゲームを作りたい、という人がまず直面するのは、2大ゲームエンジンであるUnreal Engine・UnityはRust実装を提供していない、という現実です。 そのため、Rust GameDev界隈は、独自のエコシステムが発達しています。 そして、Rust製のゲームエンジンではwgpuを採用されることが多いです。

Unreal EngineやUnityのように圧倒的な開発リソースがあるゲームエンジンは、プラットフォームのグラフィックAPIDirectX 12、Metal、Vulkanなど)を直接使います。 開発は難しいですが、その方がパフォーマンスが出るからです。 しかし、小規模なゲームエンジンでは、プラットフォームごとに開発してメンテしていくほどの人手がありません。 ここにWebGPU(そしてwgpu)を使う動機があります。GPU・グラフィックAPIの違いをWebGPUが吸収してくれて、開発がシンプルになるからです。 WebGPU APIは、あらゆるGPU・グラフィックAPIの最大公約数的なものになるので、パフォーマンスが犠牲になることもあります。 それでも、ポータビリティの方が重要なのです。

そんなわけで、wgpuにはRust gamedevからの貢献も大きいです(実際、wgpuの開発者の人もゲームエンジンを作っています)。

RustでGUIを作りたい勢

ここはいろんなレイヤーがあるので一言ではまとめづらいのですね...。 同じGUIでも、ゲームと一般的なデスクトップアプリでは要求が異なります。 ゲームの場合は「ウィンドウさえあればいい」というケースが多いですが(winitとか)、一般的なデスクトップアプリでは、ボタンやスクロールバーなど様々なコンポーネントも必要になります。 ゲームほどハイパフォーマンス性は求められないし、むしろ限られたリソースでも動くことが重要、というのも大きな違いでしょう。 しかし、共通しているのは、「どのOSでも動いてほしい」ということです。 なので、ゲーム系と同じく、ポータビリティという観点でwgpuが選ばれるケースが増えている気がします。

2022年のふりかえり

2022年を軽く振り返ると、これだ!というターニングポイントは特にありませんでしたが、wgpu(そしてWebGPUの仕様そのもの)がかなり安定してきた年だったと思います。 これまでは、昨日まで動いていたコードが今日は動かない、という状態だったのが、今ではほぼなくなりました。 wgpuの変化が速すぎる、というのがwgpuに依存するプロジェクトの悩みでしたが、そのボトルネックが解消されて、wgpuエコシステムが発展していく土壌が整った、と思っています。

2023年、期待のプロジェクト

そんなわけで、今年はwgpuのエコシステムがますます発展していくと思っています。 個人的には、2Dレンダリングに注目していて、今年アツいと思っているプロジェクトを4つ紹介します。

Vello

Velloは、2Dレンダリングエンジンです。 XilemというRust製リアクティブUIツールキットのバックエンドとして開発されています。

Velloは、もともとpiet-gpuという名前で開発されていたプロジェクトで、 当初はハードウェア抽象化レイヤー(HAL)も独自の実装で開発を進めていました。 それが、独自実装をやめてwgpuに切り替えたのが去年のことでした。 その決断をした技術的背景(そしてwgpuにまだ不足している点)についてのブログ記事が面白かったので貼っておきます。

Velloのメイン開発者の人は様々なプロジェクトを手掛けていますが、「Velloを使える状態に持っていく」ということを2023年の最重要目標として挙げています。

So this is by far the biggest goal for the year: get Vello to a usable state. (https://raphlinus.github.io/personal/2022/12/31/raph-2023.html)

2023年のロードマップもかなりの長文として公開されていて、力の入り具合が伺えます。

forma

formaは、2022年末に突如現れた期待の2Dレンダリングエンジンです。 Googleのエンジニアの人が開発しています。

formaはまだまだexperimentalなもので、今後どういう完成度まで辿り着けるのかはわかりませんが、 特徴のひとつはCPUだけでもレンダリングできることです。 これは、組み込みOSのようにGPUがないプラットフォームでも動作する、という利点があります。 READMEにはGoogleが開発しているRTOS・Fuchsiaの名前が挙がっていますが、実際Fuchsiaでの利用も念頭に置いているような気がします。

また、CPUでの処理はrayonによって並列化されています。 強力なCPUが利用できる環境では、GPUよりも早いケースもあるでしょうし、場合によって使い分けられる、というのも強みになりそうです。

CPU fallbackは、Velloのロードマップでも2番目に記載されていて、かなり重要視されています。 個人的に、formaに注目しているのは、現状の実装に期待が持てるからというより、 こうした成果が互いに刺激を与えあって2Dレンダリングエンジン界隈全体が進化していくのではないか、という期待が持てるからです。 Velloの人も技術的な解説を積極的に書いて発信していくことを約束していますが、formaの人も技術的なレポートをブログで公開していっていて、どんな話題が読めるのか楽しみです。

Bevy

Bevyは、Rust製のゲームエンジンです。 2020年、「Rustでゲーム」といえばすでにAmethystやPiston、Godot、といった選択肢があるレッドオーシャンに颯爽と登場したBevy。 瞬く間に人気になり、今ではGitHubで2番目にスターが集まるゲームエンジンです。今年頭には「開発体制を強化してガンガンやってくぜ!」という宣言が出ていました。

個人的にはBevyを直接使うことはないんですが、Bevyという巨大なユースケースがあることで、wgpu界隈も大きく発展してきていると感じます。

Graphite

Graphiteは、2Dグラフィックスエディターです。 オープンソースで2Dグラフィックスと言えば、すでにGIMPとかInkscapeがあるし十分では?と思うかもしれませんが、 このプロジェクトが面白いのは「2Dグラフィック界のHoudini」みたいな立ち位置を目指していることです。 GIMPとかInkscapeのように既存のプロダクトのコピーではなく、まったく新しいものをつくろうとしている、という点でとても応援しています。

これからの不安要素

そんな感じでRustグラフィックス界隈の未来は明るいわけですが、気になっている点もいくつかあります。

WebGPUでは機能が足りない

WebGPUは、なるべく多くのGPUで動く機能を集めた最大公約数です。 なので、ポータビリティや安全性という面ではとても優れているのですが、パフォーマンス面では最適ではない可能性があります。 ハイエンドのGPUにしかない機能(レイトレーシングAPIとか)を使いたいとか、WebGPUで抽象化されたレイヤーを通すより各プラットフォームのグラフィックスAPIを直接使った方がシンプルになるとか、 そういう限界に直面するかもしれません。

たとえば、WebGPU規格策定の功労者の一人であり、wgpu開発の中心人物でもあったDzmitry Malyshau(kvark)氏は、なんとwgpuを使わず直接グラフィックスAPIを使う実装を開発中です。 個人的にはとても衝撃的でした。昨日開催されたRust Graphics Meetup 3での発表が興味深かったので貼っておきます。

また、Velloも、いったんwgpuを使うことに決めたものの、独自の路線も模索したいとロードマップで言及しています。

「とりあえずwgpu」というところではみんな一致していますが、いずれはハードウェア抽象化レイヤー戦国時代が訪れるかもしれません。

Rustが人気になりすぎてUnreal EngineやUnityがRustを公式サポートするようになる

これはまあ喜ばしいことなんですが、上に書いたように、Rustのグラフィックスの発展はgamedevコミュニティからの貢献が大きいです。 そういう状況になっている大きな理由のひとつが、Rustではこの2大ゲームエンジンが使えないので自分で開発するしかない、ということですが、 Rustがサポートされてしまえばそういう必要性がぐっと減ってしまいます。

これはけっこう時間の問題だろうと思っています。このボーナスタイム中に発展がどこまで進むのか、気になるところです。

WebGPUがコケる

この段階までくるともうそんなことはないと信じたいですが、規格の覇権争いというのは、企業の命運を決めるほどの力があり、それゆえに魔境です。 自分がイニシアチブをとるために突然ちゃぶ台返しをしてくるベンダーがいてもおかしくはありません。

また、そういう魔境なので、規格というのは様々な妥協の産物であり、必ずしもすべての部分が完璧だとは限りません。 ↑のRust Graphics Meetup 3での発表でも、WebGPUではデザインに失敗した可能性がある部分について言及されていましたが、そういう綻びが今後見つかっていく可能性もあるのかなと。

(まあ、いちおう項目として挙げただけで、これはあんまりないかなと思ってはいます)

まとめ

Rustグラフィックス界隈は、今が一番盛り上がってる時期だと思うのでエンジョイしていきましょう!

*1:ちなみにServoはその後Linux Foundationに移管され、今も順調に?開発が続けられています。今年、久々にブログ記事が投稿されていました。