【Rust】GPUがなくてもランタイムをインストールしないとicedアプリがクラッシュする

# はじめに

RustのGUIクレートの一つである[iced](https://github.com/iced-rs/iced)を使ってみようとしたところ、最初から躓いてしまったので、記録に残しておきます。

# 環境

- Windows 10
- rustc 1.72.0

# やったこと・起こったこと

icedのexampleを動かすために、まずはソースをチェックアウト

```bash
$ git clone https://github.com/iced-rs/iced.git -b 0.4
```

てきとうなexampleをビルド&実行

```bash
$ cd iced/examples/clock
$ cargo run --package clock
```

とすると、ビルドは通るが、アプリケーションEXEを実行中にGUIがクラッシュし、以下のエラーが出た。

> error: process didn't exit successfully: `target\debug\clock.exe` (exit code: 0xc000041d)

# 解決策

[ここ](https://vulkan.lunarg.com/sdk/home)から最新のVulkan Runtimeをインストールする。

# おまけ

解決策は単純でしたが、たどり着くまでには紆余曲折がありました。
ググってもなかなか目的の情報が得られず、Rustの再インストールも試したがダメ。
最終的に、別のWindows端末で試したところ上手くいくことが分かり、そこからChatGPTに質問を投げかけ答えにたどりつきました。

<details><summary>CgatGPTとのやり取り</summary>

## Q. Rustでicedを使ってビルドしたGUIのexeが、あるwindows端末ではクラッシュし、あるwindows端末で実行すると正常に動きます。両者の違いにはどんなことが考えられますか

RustでIcedを使用してビルドしたGUIアプリケーションが、異なるWindows端末でクラッシュするか正常に動作するかの違いは、いくつかの要因による可能性があります。以下に考えられるいくつかの要因を示します：

1. **Windowsのバージョンとアーキテクチャの違い**: 2つのWindows端末が異なるバージョンやアーキテクチャ（32ビットまたは64ビット）を実行している場合、アプリケーションの互換性に問題が発生する可能性があります。Icedアプリケーションを正しくビルドして、対象のWindowsバージョンおよびアーキテクチャに適したものを提供する必要があります。

2. **依存関係の違い**: 異なるWindows端末で依存関係のバージョンや設定が異なる場合、アプリケーションの挙動に影響を与える可能性があります。特にランタイムライブラリやDirectXなどのグラフィックス関連の依存関係が問題になることがあります。

3. **端末のリソース制約**: 異なるWindows端末は、利用可能なリソース（メモリ、CPU、GPUなど）に違いがあるかもしれません。アプリケーションが必要とするリソースが不足している場合、クラッシュが発生する可能性があります。メモリリークやリソースの不適切な管理が原因となることもあります。

4. **ローカライズと文字エンコーディング**: Windows端末の地域設定や文字エンコーディングが異なる場合、テキストの表示や入力に関する問題が発生する可能性があります。アプリケーションが正しく文字エンコーディングを処理できるようにする必要があります。

5. **ログとエラーメッセージの確認**: クラッシュが発生した場合、ログやエラーメッセージを確認して、具体的な問題を特定しようとすることが重要です。RustやIcedのログ設定を調整し、詳細な情報を収集しましょう。

最初に、異なるWindows端末でアプリケーションが正しく動作することを確認するために、バージョン、アーキテクチャ、依存関係、リソースの違いを調査し、問題を特定する助けになるかもしれません。そして、問題を特定したら、対応策を見つけて修正する必要があります。

## Q. 正常に動作した方の端末にはGPUが載っており、クラッシュした方にはGPUは載っていませんでした。しかし、作成したGUIアプリはごく単純なもので、リソースが不足するほどのものではないと思います

GPUの有無がアプリケーションのクラッシュに影響を与える可能性があることは理解できますが、GPUが載っていない端末でアプリケーションがクラッシュする理由を特定するには、さらに詳細な調査が必要です。以下は、GPUの有無が問題の一因である可能性に関するいくつかの考慮事項です：

1. **OpenGLまたはVulkanの利用**: Icedはグラフィックスの描画にOpenGLまたはVulkanを使用します。GPUがない端末では、これらのAPIをエミュレートすることが必要です。端末によっては、OpenGLエミュレーションが不十分であったり、バージョンに問題がある場合があります。

2. **GPUドライバー**: GPUがある場合とない場合で、GPUドライバーのインストール状況やバージョンが異なる可能性があります。ドライバーの問題がクラッシュの原因となることがあります。最新のGPUドライバーをインストールしてみることを検討してください。

3. **リソースの適切な管理**: GPUを利用しない場合、アプリケーションはCPUのリソースをより効率的に管理する必要があります。メモリリークやリソースの不適切な解放がクラッシュの原因になる可能性があります。コードを注意深く調査し、リソース管理の問題を特定することが重要です。

4. **エラーメッセージの確認**: クラッシュ時にエラーメッセージやログを収集して、問題の特定に役立つ情報を取得しましょう。これにより、具体的な原因が明らかになる可能性が高まります。

5. **IcedおよびRustのバージョン**: 使用しているIcedとRustのバージョンが古い場合、バグや互換性の問題が発生する可能性があります。最新バージョンにアップデートしてみてください。

GPUの有無が問題の一因である場合でも、上記の要因を検討し、問題の特定と解決に向けた調査を進めることが大切です。そして、問題が特定されたら、適切な対策を講じることができます。

## Q. 上記の１について詳しく教えてください

Icedはグラフィックスの描画にOpenGLまたはVulkanを使用しますが、いくつかの環境ではGPUがない場合、これらのグラフィックスAPIをエミュレートすることが必要です。GPUがない場合、IcedはCPUによってグラフィックスを処理する必要があります。ただし、いくつかの注意事項があります。

1. **OpenGLのエミュレーション**: GPUがない場合、一部のシステムではOpenGLをエミュレートするソフトウェアレンダラが使用されることがあります。しかし、このソフトウェアエミュレーションは性能が低いため、特に高負荷のグラフィックス操作を行う場合には問題が発生する可能性があります。

2. **Vulkanの利用**: 一部のシステムでは、VulkanがOpenGLよりも優れたパフォーマンスを提供することがあります。GPUがない場合でも、IcedはVulkanを使用することができます。ただし、Vulkanのサポートを有効にするには、対応するVulkanランタイムがシステムにインストールされている必要があります。

3. **グラフィックスのパフォーマンス**: GPUがない場合、CPUによるグラフィックス処理には制約があるため、特に高解像度の画像や複雑なアニメーションを処理すると、パフォーマンスが低下する可能性があります。この場合、アプリケーションの設計や描画方法を最適化することが重要です。

4. **エラーメッセージの確認**: グラフィックスエミュレーションに関連するエラーメッセージやログを確認して、問題を特定しましょう。特にOpenGLやVulkanのエラーメッセージが役立つ情報を提供することがあります。

Icedを使用してGPUがない環境で正常に動作するようにするには、次のステップを検討することが役立つかもしれません：

1. グラフィックスAPIの切り替え: グラフィックスAPIをOpenGLからVulkanに切り替えることで、一部のシステムでパフォーマンスが向上する可能性があります。

2. ローカルテスト: GPUがない環境でのローカルテストを行い、パフォーマンスやクラッシュの問題を特定しましょう。

3. パフォーマンス最適化: グラフィックス操作を最適化し、CPUベースの描画においてもスムーズな動作を実現するように努力しましょう。

4. ドキュメンテーションとコミュニティ: Icedのドキュメンテーションを確認し、Icedのコミュニティやフォーラムで同様の問題に関する情報を収集することが重要です。

最終的には、GPUのない環境での正常な動作を確保するために、アプリケーションの設定やコードの最適化が必要になるかもしれません。

## Q. vulkanランタイムをシステムにインストールするにはどうすればよいですか

Vulkanランタイムをシステムにインストールするには、通常、次のいくつかの方法があります。以下にいくつかの一般的な方法を示しますが、具体的な手順は使用しているオペレーティングシステムに依存する場合があります。以下の手順は、WindowsおよびLinuxの場合に適用されます。

**Windows**:

1. **NVIDIA、AMD、またはIntelのGPUドライバーのインストール**: ほとんどの場合、GPUメーカーの公式ウェブサイトから最新のGPUドライバーをダウンロードしてインストールすると、Vulkanランタイムも同時にインストールされます。GPUドライバーのインストールがVulkanランタイムのインストールを含むことが多いです。

2. **LunarG Vulkan SDKのインストール**: 別の方法として、LunarG Vulkan SDKをダウンロードしてインストールすることもできます。これは、Vulkanの開発者向けSDKで、Vulkanランタイムを含んでいます。LunarGの公式ウェブサイトからダウンロードできます。

**Linux**:

1. **パッケージマネージャーを使用したインストール**: ほとんどのLinuxディストリビューションでは、パッケージマネージャーを使用してVulkanランタイムをインストールできます。例えば、Ubuntu/Debianベースのディストリビューションでは、次のコマンドでインストールできます：

   ```
   sudo apt-get install libvulkan1
   ```

   他のディストリビューションでは、適切なパッケージ名が異なることがありますので、ディストリビューションのドキュメンテーションを参照してください。

2. **ランタイムのビルド**: Vulkanランタイムのソースコードをダウンロードしてビルドする方法もありますが、通常は上記のパッケージマネージャーを使用したインストールが最も簡単で推奨される方法です。

重要なのは、使用しているシステムやディストリビューションによって方法が異なることです。したがって、システムにVulkanランタイムをインストールする前に、システムの要件に合わせた正確な手順を確認することが重要です。また、GPUドライバーとの統合についても注意が必要です。

</details>

# 参考URL
- https://github.com/iced-rs/iced
- [Bevy 0.5.0 crash with 0xc000041d when using DefaultPlugins on Windows 10](https://github.com/bevyengine/bevy/issues/1877)
- https://vulkan.lunarg.com/sdk/home