1

我正在学习 Rust 和 Bevy 引擎,我想Font在整个应用程序生命周期内保持某些资产(例如 s)的加载。


// Resource for fonts:
#[derive(Default, Clone)]
pub struct ResFont {
    pub ui: Handle<Font>, // The font that will be used in this example.
    pub dialog: Handle<Font>,
    ...
}

// Insert resource in main() during App building:
{
    .insert_resource(ResFont::default())
}

// Load resource during startup:
pub fn startup(asset_server: Res<AssetServer>, mut res_font: ResMut<ResFont>)
{
    res_font.ui = asset_server.load("font/Default.ttf");
}

// Use the font resource in a different place:
pub fn setup_ui(res_font: ResMut<ResFont>)
{
    ...
    TextStyle {
        font: res_font.ui.clone(), 
        font_size: 12.0,
        color: Color::WHITE,
    }
    ...
}

在底部的函数setup_ui()中,我.clone()用来复制该资产。如果我不使用.clone(),我会收到错误消息:

cannot move out of dereference of `bevy::prelude::ResMut<'_, resource::text::ResFont>`

move occurs because value has type `bevy::prelude::Handle<bevy::prelude::Font>`, which does not implement the `Copy` traitrustc(E0507)

ui.rs(19, 27): move occurs because value has type `bevy::prelude::Handle<bevy::prelude::Font>`, which does not implement the `Copy` trait

我有两个问题:

  1. 我是Font在操作过程中复制整个这里.clone()吗?

  2. 这是保持资源加载并供以后使用的“正确”方法,还是有更好的方法来实现这一点,我不知道?

4

1 回答 1

1

关于您的问题,我建议您阅读(非官方)bevy 备忘本关于资产的章节,它将回答您的大部分问题。我将在此处引用与您的问题相关的部分:

  1. Font不,您不是在复制Handle.

句柄具有内置的引用计数(类似于 Rust 中的 Rc/Arc)。这允许 Bevy 跟踪是否仍需要资产,并在不再需要时自动卸载它。您可以使用 .clone() 为同一资产创建多个句柄。克隆是一种廉价的操作,但它是明确的,以确保您了解代码中创建额外句柄并可能影响资产生命周期的位置。

  1. 这是建议的两种方式之一。

您可以将句柄存储在您方便的地方(例如资源中)。如果您没有将句柄存储在任何地方,则始终可以通过调用asset_server.load 从路径中生成一个。您可以在需要时简单地执行此操作,而无需费心存储句柄。

重复调用asset_server.load是有效的,因为在内部,该函数会检查资产是否已被加载并重用该资产。(这可以在AssetServer::load_async方法的源代码中看到,具体是l. 246-252)。

那么何时将句柄存储在优于 的资源中asset_server.load?如果没有更多的句柄存在,资产服务器将卸载资产。对于 UI 中使用的字体,这通常不太可能发生,但对于您希望始终保持加载的其他类型的资产,这可能更常见。将句柄存储在资源中可确保它永远不会被卸载。

您的代码的其他一些提示:

  • 而不是.insert_resource(ResFont::default())你可以只使用.init_resource(ResFont),然后调用Default实现。
  • in pub fn setup_ui(res_font: ResMut<ResFont>),您可以Res<ResFont>改用,因为您没有对其进行变异。

为了将来参考,此回复适用于 Bevy 0.5。

于 2021-07-01T00:21:59.640 回答