注意書き

本サイトでは、アフィリエイト広告およびGoogleアドセンスを利用しています。

Android Studio + Emulator で Vulkan アプリを動作させる

プログラミング

以前、 Android Studio と付属する Android Emulator の組み合わせで、 OpenGL ES 2.0 (3.0) のプログラムが動いたという記事を作成しました (記事: Android Studio + Emulator で OpenGL ES アプリを動かす方法)。今回はその続編として、 エミュレーター上で Vulkan API を使ったものは動くのか、を確認しました。

結果は、以下に示すようにシンプルな Vulkan アプリケーションをエミュレーターで動作させることに成功しています。

スポンサーリンク

エミュレーターの設定

基本的なエミュレーターの設定は、Android Studio + Emulator で OpenGL ES アプリを動かす方法 で行っているものと同じです。エミュレーターのグラフィックスの設定を以下の状態に変更しているのみです。

当然ながら Emulator を動かすホストPC では Vulkan API が使える状況が必要です。実際の開発ではシェーダーをコンパイルする都合もあるので、 Vulkan SDK は環境にインストールすることになるでしょう。

動作環境

今回使用している環境は、以下の通りです。

  • Windows 11 Pro (x64)
  • NVIDIA Geforce 3060 Ti
  • Android Studio Dolphin | 2021.3.1 Patch 1

ほかの PC 仮想化ソフトウェアとして、 VMware Workstation を使用しているため、Windows 機能の仮想化プラットフォームを有効化したり Hyper-V を有効化したりなど行っています。私の場合、 WSL2 を有効な Docker Desktop も使用できる状態になっているので、この部分による差異にはご注意ください。場合によっては Intel HAXM を使って動かしているとも思いますし、そのようなときには設定方法が異なる可能性があります。

Vulkan アプリケーションの作成

現時点では Vulkan を用いたアプリケーションのひな型は、ウィザードで生成することができません。そのため、 Game Activity を用いた OpenGL ES 3.0 アプリケーションのひな型をベースとして、Vulkan 用の初期化を行うものを作成しました。

通常の Vulkan API の使用と大きく変わる点はありませんが、スワップチェインの生成箇所では各プラットフォーム依存コードになります。Android なので ANativeWindow 型のウィンドウハンドルが必要で、vkCreateAndroidSurfaceKHR() 関数を使用してサーフェース (VkSurface) を作成します。

C++
int RecreateSwapchain(SampleVkContext *ctx, ANativeWindow* window) {
    VkAndroidSurfaceCreateInfoKHR asurfaceCI{
        .sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR,
        .pNext = nullptr,
        .flags = 0,
        .window = window
    };
    VkResult res;
    res = vkCreateAndroidSurfaceKHR(ctx->instance, &asurfaceCI, nullptr, &ctx->surface);

ここで ANativeWindow がどこに格納されているかという点が気になりますが、 自動生成された main.cpp の中で android_app 構造体を見かけると思います。この構造体の中に window というメンバで格納されています。

Open GLES を使用しないので、ひな型で生成された CMakeList.txt で GLESv3 ライブラリや EGL ライブラリをリンク設定している箇所する必要はなくなりました。代わりに、vulkan ライブラリをリンクするように設定します。

標準に含まれている vulkan ライブラリをリンクするのではなく、自力で libvulkan.so をロードして関数を取得したり、別のローダーを使って必要な関数を得たり、という方法もあります。関数呼び出しのコストが削減され、パフォーマンスが向上します。

実行について

今回使用しているエミュレータですが、 デバイスは Pixel3 XL API 30 のものを選択しています。Android 11.0 の x86_64 イメージがインストールされています。この環境でアプリが動くため、アプリケーションのビルドは x86_64 も動作対象にしておく必要があります

まとめ

エミュレーター上で Vulkan を用いた Andorid 用アプリケーションがとりあえず動きました。実機との差異は大きいですが、標準的な機能を用いて初期アプリを作る分には有用と感じました。当然ながら、対象をエミュレーターから接続した実機に切り替えることも可能なので、動作パフォーマンスを要求されるようになった場合には実機で、ということも簡単にできます。

コメント

タイトルとURLをコピーしました