无法在 WindowBuild 对象上调用 build_vk_surface()

Not being able to call build_vk_surface() on a WindowBuild object

我正在按照 vulkano 教程打开 window 并使用 vulkano-win 创建表面。

本教程的大部分内容都已过时,到目前为止我已经能够解决这个问题,但是我还没有找到解决方案。

目前,我在调用 let window = WindowBuilder::new().build_vk_surface(&events_loop, instance.clone())

时遇到以下错误

error[E0599]: no method named build_vk_surface found for struct winit::window::WindowBuilder in the current scope

我已经检查了 vulkano_win 的库和版本,它似乎可以正确扩展 WindowBuilder 我将 post 下面我的 Cargo.toml 中的依赖项。

[dependencies]
vulkano = "0.19"
vulkano-shaders = "0.18"
winit = "0.23"
vulkano-win = "0.19"
image = "0.23"

P.S。 - 在 vulkano_win 的更旧(2 年前)版本上有一个遗留实例。我怀疑这已得到修复,因为我已经检查了 vulkano_win 库的依赖关系,并且他们在那里使用了 winit 的更新和重组版本: https://github.com/vulkano-rs/vulkano/issues/943

I have checked the library and the version of vulkano_win and it seems to properly extend WindowBuilder I will post the dependencies in my Cargo.toml below.

简而言之,你正确。问题是 VkSurfaceBuild 特性是为 winit 0.22 的 WindowBuilder 而不是 winit 0.23 的 WindowBuilder.

实现的

因此,要解决您的问题,您需要更新 Cargo.toml 以使用 winit 0.22 而不是 0.23。

示例:

[dependencies]
vulkano = "0.19"
vulkano-shaders = "0.19"
vulkano-win = "0.19"
winit = "0.22"

此外,您的困惑可能来自浏览存储库。 在存储库中,vulkano-win and the examples 都使用 winit 0.23。 但是,请记住,存储库的当前状态不一定与 0.19 中发布的状态相同。

在 GitHub 上,您可以 select 标记,并查看 0.19 release 的提交。 如果您随后查看 vulkano-win and the examples,您会发现它们都使用 winit 0.22。

如果你真的想用winit 0.23。然后你可以直接依赖于存储库。像这样:

[dependencies]
vulkano = { git = "https://github.com/vulkano-rs/vulkano" }
vulkano-win = { git = "https://github.com/vulkano-rs/vulkano" }
vulkano-shaders = { git = "https://github.com/vulkano-rs/vulkano" }
winit = "0.23"

但是,对存储库的一项重大更改可能会破坏您的构建。所以谨慎使用。


How were able to determine how that trait was implemented over the 0.22 WindowBuilder but not the 0.23 WindowBuilder?

不确定是否有一种奇特的方法,但一个简单的方法就是转到 VkSurfaceBuild on docs.rs, then at "Implementations on Foreign Types" if you click on WindowBuilder, then it redirects to winit 0.22.2 docs

或者,您也可以检查您的 Cargo.lock。如果您尝试使用 winit 0.23,那么您的 Cargo.lock 将包含两个 winit 版本:

[[package]]
name = "winit"
version = "0.22.2"
...

[[package]]
name = "winit"
version = "0.23.0"
...

如果您随后查看 vulkano-win,您会看到它使用 winit 0.22.2:

[[package]]
name = "vulkano-win"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b9a02addddf5532396d11dbb822f77d87ca17a00c918e4c8a0a125d6c207e2b"
dependencies = [
 "cocoa 0.20.2",
 "metal",
 "objc",
 "vulkano",
 "winit 0.22.2",
]

如果没有重复的版本,它会像其他人一样说"winit"