Rust GUI crate調査: iced

この記事には作り方に関する情報は、ほとんど書いておりません。

あくまで、このcrateが持つ機能や使いやすさなどをお伝えすることを目標としております。

icedの概要

github.com

今回紹介するicedは、クロスプラットフォームで、renderer-agnostic (レンダラーに依存しない) crateを目指している、Rust GUI界の希望の星です。

Rust自体がクロスプラットフォームで動作するバイナリファイルを生成できるため、GUIも苦労せずにクロスプラットフォームで動作するものがほしいですよね!

内部ではGPUを利用したレンダリングをしており、環境によってVulkan、Metal、DX11、DX12を使用して動作するようになっています。

GPU持ってないよ〜」という方も多いと思いますが、私のマザーボード (2015年製 H170M-PLUS)オンボードのグラフィック機能でも普通に描画できていたので、すごく古いPCでなければ動作するのではないかと思っています。 (2011年発売のThinkPad X220上のDebianではダメでした……。)

Webアプリケーションのための言語であるElmからインスピレーションを受けているため、独自のThe Elm Architectureという考え方を踏襲しているそうです。

このアーキテクチャを勉強する必要こそありますが、クロスプラットフォームでどこでも軽快に動くGUI crateは、大変魅力的であります。

ここからは、導入のしやすさ、ウィジェットの充実度、軽快さ、クロスプラットフォームという切り口で、調べた内容を記述していきます。

それぞれの切り口で、個人的な評価を4段階 (Very Good、Good、Bad、Very Bad) でつけております。

導入のしやすさ: Very Good

別言語のGUIライブラリをバインディングしているわけではないため、Cargo.tomlにicedのcrate情報を書き込むだけで導入できます。

そのため、WindowsでもLinuxでも、特別なことをせずとも導入できます。 素晴らしいです。

ウィジェットの充実度: Good

まだまだ開発段階ではあるものの、基本的なウィジェットであるボタン、スライダー、チェックボックス、テキストボックスなどを使えます。

ウィジェットのレイアウトもきれいに配置させることができます。 (Responsive Layout)

将来の開発ロードマップの中には、レイヤー、アニメーション、キャンバス、テキストやフォント関連、グリッドレイアウトやテキストレイアウトなどが含まれています。

軽快さ: Very Good

ウィンドウやウィジェットの動きの軽さを調べるため、サンプルコードの「tour」をビルドしました。

ウィンドウのサイズを大きくしたり、小さくしたり、スクロールさせたり、ボタンを連打したり、あんなことしたり、こんなことしても、激しい画面のくずれなどはなく、きちんと描画されていました。

「それ、普通では?」と思うかもしれませんが、他のGUI crateを触っていると、そうでもないものがあります。 (OrbTkとか……。たぶん、フレームバッファのサイズ変更か何かがおかしい。)

f:id:toyamaguchi:20200401011851g:plain
「tour」のスクリーンショット (GitHubより転載)

クロスプラットフォーム: Very Good

クロスプラットフォーム」を謳っていても、環境によって動作に差があったりします。 また、動作は軽快でも、準備に手間のかかるライブラリもあります。(Gtkとか)

しかし、icedは導入も簡単な上、いくつかの環境で問題なく動作することを確認できましたし、言うことないです。

私の手元には、Windows 10、Debian Linux 10.3の環境がありますが、その両方でビルドと実行に成功し、軽快に動作をしました。

しかも、icedはWebにも対応しており、ネット上には「tour」のサンプルコードからビルドしたWebサイトが、誰にでも触れるように公開されています。 (「tour」のサンプルコードをビルドしたWebページへのリンク)

Macの環境では確認できていませんが、対応しているレンダラの中にあえて「Metal」の文字があるので、サポート対象であることはわかっています。

欠点

どうもVirtualBox上の仮想マシンGPUをうまく使えないようで、ビルドこそ成功するものの、実行時にクラッシュしてしまうようです。

最初、私はVirtualBox上のDebian Linuxで挙動の確認を試みていました。 そこではicedのサンプルコードがクラッシュしてしまいました。 icedは内部でwgpuのcrateを使用しているのですが、どうもwgpuのサンプルコードを実行しても落ちてしまうのです。

エラーの内容としては、GPUの情報を取得できないようなことが書かれており、そこでVirtualBoxが原因であると気づきました。

VirtualBoxを使わずに、直にWindows 10やDebian Linuxをインストールしているマシンでは、問題なく動きました。

ですので、これはicedの欠点というか、VirtualBoxの欠点でもあります。

余談

昨年11月に、icedの開発者であるHéctor Ramón氏 (a.k.a. hecrj) はCryptWatch Teamに所属することになり、そして同チームがicedのスポンサーになったため、安定して開発に専念できるようになりました。 (ブログ記事)

GitHub上の活動を見ても、とても活発に開発が進められていることがわかるので、これからも期待できそうです。

また、GUI関連ライブラリを確認していると、不吉なエラーメッセージと共に終了するアプリを目にすることがあるのですが、icedのアプリはそういうことがなかったので、そういう点でも地味に好印象です。(笑)

まとめ

まだ開発中とはいえ、どこでもビルドが通り、軽快な動作を確認できました。

将来の展望も明るく、大変期待しています。

Rust GUI界の期待の星、icedのご紹介でした。

f:id:toyamaguchi:20191221150338p:plain