概要
Vulkanで書いたアプリケーションをAndroidで動かした際に、ホームボタンを押してアプリをスリープさせた後再度スタートしようとすると、画面が描画されなかった。
原因を調べるとVulkanのコンポーネントの内、いくつかは再度作成し直す必要があった。
環境
- Android 13
- NDK : 25.0
原因
Androidではアプリをリスタートするたびにwindowが変わっているようで、andoid_app->ANativeWindowの指すアドレスが毎回変化している。
なので、windowに依存するコンポーネントは毎回再作成する必要がある。
対策
windowに依存するコンポーネントは、アプリにもよるが基本的には以下が含まれると思っている。(赤色で表している部分)
surfaceがwindowに依存して作成されるので、surfaceを作り直す必要があるが、surfaceに依存するコンポーネントもすべて作成し直す必要がある。
参考
画面の回転や, スリープなどからの復帰 => SwapChain などの作り直し(Vulkan-glTF-PBR にはサンプルコード無いので, 自前でコード書く必要あり)
上記の記事を手掛かりに調査させていただきました。
感想
必要なコンポーネントを再作成せずにアプリをリスタートしても、特にwarningやerrorのログは出ずに真っ黒の画面が表示されていたので、なんとかログに出す方法はないものか。
Window Managerがwindowを変えました、みたいなログは出ているがinfoレベルなので、surfaceを再作成する必要があるとわかった上で見直してようやく気付くレベルなのではないかと思っている。
Git Hub
何かの参考になれば。
https://github.com/kodai731/Aqoole-Engine-Android-Vulkan-Rendering-Engine-:title