前々からBevyが途中で落ちる問題がありまして、それを何とかできないかと思い調べてみました。
元記事はGithubです。
使用環境
OS: Windows11 Home
CPU: AMD Ryzen 7 5800H
GPU: NVIDIA GeForce RTX3060 Laptop GPU
発生したエラーメッセージ
ERROR present_frames: wgpu_hal::dx12::instance: ID3D12CommandQueue::Present: Resource state
(0x800: D3D12_RESOURCE_STATE_COPY_SOURCE) (promoted from COMMON state) of resource
(0x000002580E633720:'Unnamed ID3D12Resource Object') (subresource: 0)
must be in COMMON state when transitioning to use in a different Command List type,
because resource state on previous Command List type : D3D12_COMMAND_LIST_TYPE_COPY,
is actually incompatible and different from that on the next Command List type :
D3D12_COMMAND_LIST_TYPE_DIRECT. [ RESOURCE_MANIPULATION ERROR #990: RESOURCE_BARRIER_MISMATCHING_COMMAND_LIST_TYPE]
どうやら2つのGPU(CPU内蔵GPUと外部GPU)が競合していることが原因っぽいです。
私の場合、この問題は以下のコードを追加することで解決しました。
use bevy::prelude::*;
use bevy::render::options::{Backends, WgpuOptions}; // <- Bevy 0.6
use bevy::render::settings::{Backends, WgpuSettings}; // <- Bevy 0.7
fn main() {
App::new()
// バックエンドをVULKANに指定(どれが最適なのかは環境によって異なる)
.insert_resource(WgpuOptions {
backends: Some(Backends::VULKAN),
..Default::default()
})
.add_plugins(DefaultPlugins)
.run();
}
ですが、この方法では外部GPUが使われず内臓GPUが使用されました。
もし、外部GPUで実行したいと考えているのならば代わりに片方のGPUを無効にする方法を提案します。
その場合、バックエンドの設定は削除してください。
デバイスマネージャーから無効にする方法もありますが、以下の方法を推奨します。
NVIDIA 設定 > ディスプレイモードを管理する > NVIDIA GPU のみ
を選択
これらの方法で落ちることはなくなりましたが、外部GPUの時のフレームレートが100FPS前後なのはおかしい。
どなたか原因がわかりましたら教えてください。
あと、WSL2でのBevyの起動ができない原因がわかる方がいましたらお願いします。